From 898d490968ea47fba3f3576073be37c21c85490d Mon Sep 17 00:00:00 2001 From: Kyle Guinn Date: Sun, 31 Mar 2019 01:50:23 -0500 Subject: system/memtest86+: Updated for version 5.01. Signed-off-by: Kyle Guinn --- system/memtest86+/patches/asm-inline-fix.diff | 11 -- .../memtest86+/patches/bug_629506_message_15.mbox | 142 +++++++++++++++++++++ system/memtest86+/patches/doc-serialconsole | 27 ++++ system/memtest86+/patches/makefile.diff | 33 +++++ .../patches/memtest86+-5.01-gcc-473.patch | 33 +++++ .../patches/memtest86+-5.01-hardcoded_cc.patch | 16 +++ .../patches/memtest86+-5.01-io-extern-inline.patch | 31 +++++ .../patches/memtest86+-5.01-no-C-headers.patch | 49 +++++++ .../patches/memtest86+-5.01-no-clean.patch | 19 +++ .../patches/memtest86+-5.01-no-scp.patch | 14 ++ .../patches/memtest86+-5.01-reboot-def.patch | 15 +++ .../memtest86+-5.01-test-random-cflags.patch | 21 +++ .../memtest86+/patches/memtest86+-test-7-smp.patch | 29 +++++ 13 files changed, 429 insertions(+), 11 deletions(-) delete mode 100644 system/memtest86+/patches/asm-inline-fix.diff create mode 100644 system/memtest86+/patches/bug_629506_message_15.mbox create mode 100644 system/memtest86+/patches/doc-serialconsole create mode 100644 system/memtest86+/patches/makefile.diff create mode 100644 system/memtest86+/patches/memtest86+-5.01-gcc-473.patch create mode 100644 system/memtest86+/patches/memtest86+-5.01-hardcoded_cc.patch create mode 100644 system/memtest86+/patches/memtest86+-5.01-io-extern-inline.patch create mode 100644 system/memtest86+/patches/memtest86+-5.01-no-C-headers.patch create mode 100644 system/memtest86+/patches/memtest86+-5.01-no-clean.patch create mode 100644 system/memtest86+/patches/memtest86+-5.01-no-scp.patch create mode 100644 system/memtest86+/patches/memtest86+-5.01-reboot-def.patch create mode 100644 system/memtest86+/patches/memtest86+-5.01-test-random-cflags.patch create mode 100644 system/memtest86+/patches/memtest86+-test-7-smp.patch (limited to 'system/memtest86+/patches') diff --git a/system/memtest86+/patches/asm-inline-fix.diff b/system/memtest86+/patches/asm-inline-fix.diff deleted file mode 100644 index 049c17af86..0000000000 --- a/system/memtest86+/patches/asm-inline-fix.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- memtest86+-4.20/test.c.orig 2011-01-23 19:11:04.000000000 +0100 -+++ memtest86+-4.20/test.c 2012-10-05 14:57:19.000000000 +0200 -@@ -313,7 +313,7 @@ void movinvr() - "jb L200\n\t" - : "=D" (p) - : "D" (p), "b" (pe) -- : "eax", "edx" -+ : "eax", "ecx", "edx" - ); - - do_tick(); diff --git a/system/memtest86+/patches/bug_629506_message_15.mbox b/system/memtest86+/patches/bug_629506_message_15.mbox new file mode 100644 index 0000000000..0b9362728f --- /dev/null +++ b/system/memtest86+/patches/bug_629506_message_15.mbox @@ -0,0 +1,142 @@ +From viro@ftp.linux.org.uk Fri Feb 27 20:21:34 2015 +Received: (at 629506) by bugs.debian.org; 27 Feb 2015 20:21:34 +0000 +X-Spam-Checker-Version: SpamAssassin 3.4.0-bugs.debian.org_2005_01_02 + (2014-02-07) on buxtehude.debian.org +X-Spam-Level: +X-Spam-Status: No, score=-2.3 required=4.0 tests=BAYES_00,FOURLA,MONEY, + MURPHY_DRUGS_REL8,RCVD_IN_DNSWL_MED,STOCKLIKE,T_RP_MATCHES_RCVD autolearn=no + autolearn_force=no version=3.4.0-bugs.debian.org_2005_01_02 +X-Spam-Bayes: score:0.0000 Tokens: new, 43; hammy, 150; neutral, 234; spammy, + 0. spammytokens: hammytokens:0.000-+--UD:patch, 0.000-+--H*u:1.5.21, + 0.000-+--H*UA:1.5.21, 0.000-+--H*u:2010-09-15, 0.000-+--H*UA:2010-09-15 +Return-path: +Received: from zeniv.linux.org.uk ([195.92.253.2]) + by buxtehude.debian.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:256) + (Exim 4.80) + (envelope-from ) + id 1YRRPi-0007QW-72 + for 629506@bugs.debian.org; Fri, 27 Feb 2015 20:21:34 +0000 +Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) + id 1YRQyr-0000Hl-OS + for 629506@bugs.debian.org; Fri, 27 Feb 2015 19:53:49 +0000 +Date: Fri, 27 Feb 2015 19:53:49 +0000 +From: Al Viro +To: 629506@bugs.debian.org +Subject: memtest86+.bin crashes if loader ends up putting it not at 9000:0000 +Message-ID: <20150227195349.GN29656@ZenIV.linux.org.uk> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline +User-Agent: Mutt/1.5.21 (2010-09-15) +Sender: Al Viro +X-Greylist: delayed 1658 seconds by postgrey-1.34 at buxtehude; Fri, 27 Feb 2015 20:21:33 UTC + + FWIW, the effects described in this bug report are 100% reproducible +on any version, as long as the loader (lilo, grub, whatever) ends up putting +the bootsect+setup in any location below 9000:0000. + + zImage-type images consist of 3 parts - bootsect, setup and +payload. Payload is loaded at 1000:0, bootsect and setup - n:0 and +n+2:0 resp., near the top of lowmem. Payload is protected mode code, +setup - real mode one. Bootsect isn't executed at all; when the +same image is booted directly it would've been the only part loaded +by BIOS and it would copy itself and read the rest of the image to +expected locations and pass control to setup. Values in it can be +used by setup, though, so it must be present even when the image had been +brought in by a loader. + + The thing is, we can't be guaranteed n == 0x9000. E.g. ACPI and +SMM have every right to use _anything_ in range 512K..1M for their +state, declaring it reserved. That's what BIOS int 0x12 is for - it +reports how high (in kilobytes) can you go in lowmem without running into +reserved areas. And while having it report 512K is rare, something like +20K reserved just below the VRAM (i.e. report 620K) is nothing unusual. + + I hadn't looked into details of GRUB behaviour, but LILO puts its +secondary loader as high in lowmem as it can, then puts the bootsect and +setup parts of image below that. It tries to load at 9000:0 if possible, +but if there's no space, it'll go lower. With the sizes it uses 20K reserved +below 640K is enough to push bootsect + setup combination (just) below 9000:0. +And memtest86+ setup has that 0x9000 hardwired - this +gdt_48: + .word 0x800 # gdt limit=2048, 256 GDT entries + .word 512+gdt - start,0x9 # gdt base = 0X9xxxx +in setup.S really depends on 'start' (entry to setup) loaded at +0x90200 physical. Have it loaded at any other address and you'll trigger +an exception as soon as you try to assign any segment register after you switch +to protected mode. Which will escalate to triple-fault and reboot the +damn thing immediately. + + GRUB might be better or worse in triggering that "load not at +9000:0" situation, but it can't possibly avoid it in all cases. If nothing +else, 9000:0 might be within one of the reserved areas. It simply isn't +guaranteed to be available, period. + + Another issue is that setup of memtest86+ expects to see in %dx +the value left there by the bootsect of memtest86+. Fortunately, it's +not critical - in + movw $INITSEG, %ax + movw %ax, %ds + movw %ax, %es + movw %ax, %fs + movw %ax, %ss # reset the stack to INITSEG:0x4000-12. + movw %dx, %sp + push %cs + pop %ds +we really need only the last two instructions. The stack footprint +of what follows is fairly low *and* these values are not used past the +reload of segment registers immediately after protected mode switch. + +It's not the only problem in there - the bits after +# start from grub-a20.patch +are clearly cargo-culted from grub, badly. There it was a part of a function +that expects an argument on stack (it can turn A20 both on and off) and that +got blindly copied, nevermind that the value on stack is random or that +we follow it with (unconditional) use of 8042-based method anyway. I'd rather +see upstream opinion on that particular piece of code first, though. + +Anyway, the patch below fixes dependency on being loaded at 9000:0 and it +seems to work here without regressions. Have fun... + +--- memtest86+-5.01/setup.S 2013-08-09 22:01:58.000000000 -0400 ++++ fixed/setup.S 2015-02-27 14:18:47.000000000 -0500 +@@ -26,14 +26,13 @@ + # APs also execute this code + #ljmp $INITSEG, $(reload - start + 0x200) + reload: +- movw $INITSEG, %ax +- movw %ax, %ds +- movw %ax, %es +- movw %ax, %fs +- movw %ax, %ss # reset the stack to INITSEG:0x4000-12. +- movw %dx, %sp ++ xorl %eax, %eax + push %cs +- pop %ds ++ pop %ax ++ movw %ax, %ds ++ shll $4, %eax ++ addl %eax, (gdt_48 - start + 2) ++ + lidt idt_48 - start # load idt with 0,0 + lgdt gdt_48 - start # load gdt with whatever appropriate + +@@ -88,6 +87,7 @@ + movw %ax, %ds + movw %ax, %es + movw %ax, %ss ++ xorl %esp, %esp # 32bit code will set it then + movw %ax, %fs + movw %ax, %gs + +@@ -144,7 +144,7 @@ + + gdt_48: + .word 0x800 # gdt limit=2048, 256 GDT entries +- .word 512+gdt - start,0x9 # gdt base = 0X9xxxx ++ .word gdt - start,0 # gdt base, needs to be adjusted + + msg1: + .asciz "Setup.S\r\n" + + diff --git a/system/memtest86+/patches/doc-serialconsole b/system/memtest86+/patches/doc-serialconsole new file mode 100644 index 0000000000..c124e7a383 --- /dev/null +++ b/system/memtest86+/patches/doc-serialconsole @@ -0,0 +1,27 @@ +commit 03867c811369be70cd81a42d150e0a250c9d1248 +Author: Yann Dirson +Date: Tue Sep 29 23:40:15 2009 +0200 + + git-debimport memtest86+_4.00-1.diff.gz + +Index: memtest86+/README +=================================================================== +--- memtest86+.orig/README ++++ memtest86+/README +@@ -89,12 +89,10 @@ To create a boot-disk with this pre-buil + ================= + Memtest86 can be used on PC's equipped with a serial port for the console. + By default serial port console support is not enabled since it slows +-down testing. To enable change the SERIAL_CONSOLE_DEFAULT define in +-config.h from a zero to a one. The serial console baud rate may also +-be set in config.h with the SERIAL_BAUD_RATE define. The other serial +-port settings are no parity, 8 data bits, 1 stop bit. All of the features +-used by memtest86 are accessible via the serial console. However, the +-screen sometimes is garbled when the online commands are used. ++down testing. ++ ++To activate it, add a console parameter on the memtest86+ ++command-line, like: "/boot/memtest86+.bin console=ttyS0,115200n8". + + + 5) Online Commands diff --git a/system/memtest86+/patches/makefile.diff b/system/memtest86+/patches/makefile.diff new file mode 100644 index 0000000000..83bc8b5ff1 --- /dev/null +++ b/system/memtest86+/patches/makefile.diff @@ -0,0 +1,33 @@ +diff --git a/Makefile b/Makefile +--- a/Makefile ++++ b/Makefile +@@ -11,7 +11,6 @@ + + CFLAGS= -Wall -march=i486 -m32 -O0 -fomit-frame-pointer -fno-builtin \ + -ffreestanding -fPIC $(SMP_FL) -fno-stack-protector +-CPPFLAGS= -m32 + ASFLAGS= -32 + + # This reverts a change introduced with recent binutils (post +@@ -34,7 +33,7 @@ + $(LD) -shared -Bsymbolic -T memtest_shared.lds -o $@ $(OBJS) + + memtest_shared.bin: memtest_shared +- objcopy -O binary $< memtest_shared.bin ++ objcopy -O binary $< $@ + + memtest: memtest_shared.bin memtest.lds + $(LD) -s -T memtest.lds -b binary memtest_shared.bin -o $@ +@@ -50,10 +49,10 @@ + + memtest.bin: memtest_shared.bin bootsect.o setup.o memtest.bin.lds + $(LD) -T memtest.bin.lds bootsect.o setup.o -b binary \ +- memtest_shared.bin -o memtest.bin ++ memtest_shared.bin -o $@ + + reloc.o: reloc.c +- $(CC) -c $(CFLAGS) -fno-strict-aliasing reloc.c ++reloc.o: CFLAGS += -fno-strict-aliasing + + test.o: test.c + test.o: CFLAGS += -O0 -fno-PIC diff --git a/system/memtest86+/patches/memtest86+-5.01-gcc-473.patch b/system/memtest86+/patches/memtest86+-5.01-gcc-473.patch new file mode 100644 index 0000000000..af011d67c7 --- /dev/null +++ b/system/memtest86+/patches/memtest86+-5.01-gcc-473.patch @@ -0,0 +1,33 @@ +http://forum.canardpc.com/threads/110950-fix-controller-loop-error + +--- memtest86+-5.01/controller.c ++++ memtest86+-5.01/controller.c +@@ -292,7 +292,7 @@ static void setup_nhm(void) + + /* First, locate the PCI bus where the MCH is located */ + +- for(i = 0; i < sizeof(possible_nhm_bus); i++) { ++ for(i = 0; i < sizeof(possible_nhm_bus) / sizeof(possible_nhm_bus[0]); i++) { + pci_conf_read( possible_nhm_bus[i], 3, 4, 0x00, 2, &vid); + pci_conf_read( possible_nhm_bus[i], 3, 4, 0x02, 2, &did); + vid &= 0xFFFF; +@@ -327,7 +327,7 @@ static void setup_nhm32(void) + ctrl.mode = ECC_NONE; + + /* First, locate the PCI bus where the MCH is located */ +- for(i = 0; i < sizeof(possible_nhm_bus); i++) { ++ for(i = 0; i < sizeof(possible_nhm_bus) / sizeof(possible_nhm_bus[0]); i++) { + pci_conf_read( possible_nhm_bus[i], 3, 4, 0x00, 2, &vid); + pci_conf_read( possible_nhm_bus[i], 3, 4, 0x02, 2, &did); + vid &= 0xFFFF; +--- memtest86+-5.01/Makefile ++++ memtest86+-5.01/Makefile +@@ -12,7 +12,7 @@ FDISK=/dev/fd0 + AS=as -32 + CC=gcc + +-CFLAGS= -Wall -march=i486 -m32 -O1 -fomit-frame-pointer -fno-builtin \ ++CFLAGS= -Wall -march=i486 -m32 -O0 -fomit-frame-pointer -fno-builtin \ + -ffreestanding -fPIC $(SMP_FL) -fno-stack-protector + + OBJS= head.o reloc.o main.o test.o init.o lib.o patn.o screen_buffer.o \ diff --git a/system/memtest86+/patches/memtest86+-5.01-hardcoded_cc.patch b/system/memtest86+/patches/memtest86+-5.01-hardcoded_cc.patch new file mode 100644 index 0000000000..21b51c5b7f --- /dev/null +++ b/system/memtest86+/patches/memtest86+-5.01-hardcoded_cc.patch @@ -0,0 +1,16 @@ +--- a/Makefile.orig 2015-02-01 01:08:33.000000000 +0300 ++++ b/Makefile 2015-02-01 01:10:17.624757244 +0300 +@@ -9,11 +9,10 @@ + # + FDISK=/dev/fd0 + +-AS=as -32 +-CC=gcc +- + CFLAGS= -Wall -march=i486 -m32 -O0 -fomit-frame-pointer -fno-builtin \ + -ffreestanding -fPIC $(SMP_FL) -fno-stack-protector ++CPPFLAGS= -m32 ++ASFLAGS= -32 + + OBJS= head.o reloc.o main.o test.o init.o lib.o patn.o screen_buffer.o \ + config.o cpuid.o linuxbios.o pci.o memsize.o spd.o error.o dmi.o controller.o \ diff --git a/system/memtest86+/patches/memtest86+-5.01-io-extern-inline.patch b/system/memtest86+/patches/memtest86+-5.01-io-extern-inline.patch new file mode 100644 index 0000000000..682dd5d01a --- /dev/null +++ b/system/memtest86+/patches/memtest86+-5.01-io-extern-inline.patch @@ -0,0 +1,31 @@ +http://forum.canardpc.com/threads/110951-fix-build-with-newer-gcc-versions + +the meaning of extern inline changed between standards. use static inline +for these tiny I/O functions everywhere to keep things simple. + +--- a/io.h ++++ b/io.h +@@ -31,6 +31,6 @@ + */ + + #define __OUT1(s,x) \ +-extern inline void __out##s(unsigned x value, unsigned short port) { ++static inline void __out##s(unsigned x value, unsigned short port) { + + #define __OUT2(s,s1,s2) \ +@@ -43,6 +43,6 @@ + __OUT1(s##c_p,x) __OUT2(s,s1,"") : : "a" (value), "id" (port)); SLOW_DOWN_IO; } + + #define __IN1(s) \ +-extern inline RETURN_TYPE __in##s(unsigned short port) { RETURN_TYPE _v; ++static inline RETURN_TYPE __in##s(unsigned short port) { RETURN_TYPE _v; + + #define __IN2(s,s1,s2) \ +@@ -55,6 +55,6 @@ + __IN1(s##c_p) __IN2(s,s1,"") : "=a" (_v) : "id" (port) ,##i ); SLOW_DOWN_IO; return _v; } + + #define __OUTS(s) \ +-extern inline void outs##s(unsigned short port, const void * addr, unsigned long count) \ ++static inline void outs##s(unsigned short port, const void * addr, unsigned long count) \ + { __asm__ __volatile__ ("cld ; rep ; outs" #s \ + : "=S" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); } diff --git a/system/memtest86+/patches/memtest86+-5.01-no-C-headers.patch b/system/memtest86+/patches/memtest86+-5.01-no-C-headers.patch new file mode 100644 index 0000000000..ce7f906a19 --- /dev/null +++ b/system/memtest86+/patches/memtest86+-5.01-no-C-headers.patch @@ -0,0 +1,49 @@ +http://forum.canardpc.com/threads/110955-PATCH-don-t-pull-in-system-headers + +avoid using C library headers as it'd mean we'd need 32-bit glibc files available + +https://bugs.gentoo.org/592638 + +--- a/dmi.c ++++ b/dmi.c +@@ -10,7 +10,7 @@ + + + #include "test.h" +-#include ++#include "stdint.h" + + + #define round_up(x,y) (((x) + (y) - 1) & ~((y)-1)) +--- a/test.c ++++ b/test.c +@@ -14,7 +14,28 @@ + #include "stdint.h" + #include "cpuid.h" + #include "smp.h" +-#include ++ ++static inline unsigned char ++inb_p (unsigned short int __port) ++{ ++ unsigned char _v; ++ ++ __asm__ __volatile__ ("inb %w1,%0\noutb %%al,$0x80":"=a" (_v):"Nd" (__port)); ++ return _v; ++} ++ ++static inline void ++outb (unsigned char __value, unsigned short int __port) ++{ ++ __asm__ __volatile__ ("outb %b0,%w1": :"a" (__value), "Nd" (__port)); ++} ++ ++static inline void ++outb_p (unsigned char __value, unsigned short int __port) ++{ ++ __asm__ __volatile__ ("outb %b0,%w1\noutb %%al,$0x80": :"a" (__value), ++ "Nd" (__port)); ++} + + extern struct cpu_ident cpu_id; + extern volatile int mstr_cpu; diff --git a/system/memtest86+/patches/memtest86+-5.01-no-clean.patch b/system/memtest86+/patches/memtest86+-5.01-no-clean.patch new file mode 100644 index 0000000000..e9cbf10399 --- /dev/null +++ b/system/memtest86+/patches/memtest86+-5.01-no-clean.patch @@ -0,0 +1,19 @@ +http://forum.canardpc.com/threads/110954-PATCH-fix-parallel-build-issues + + +don't run the clean target when building all as we run into parallel races: + - memtest kicks off building of a bunch of .o files + - clean runs in parallel which runs `rm` and deletes some of the new .o + - memtest goes to link and fails because objects are missing + +--- a/Makefile ++++ b/Makefile +@@ -19,7 +19,7 @@ + smp.o vmem.o random.o + + +-all: clean memtest.bin memtest ++all: memtest.bin memtest + + # Link it statically once so I know I don't have undefined + # symbols and then link it dynamically so I have full diff --git a/system/memtest86+/patches/memtest86+-5.01-no-scp.patch b/system/memtest86+/patches/memtest86+-5.01-no-scp.patch new file mode 100644 index 0000000000..8d830e297e --- /dev/null +++ b/system/memtest86+/patches/memtest86+-5.01-no-scp.patch @@ -0,0 +1,14 @@ +http://forum.canardpc.com/threads/110953-PATCH-don-t-try-to-scp-after-building + +this makes no sense in a sane build world + +--- a/Makefile ++++ b/Makefile +@@ -21,7 +21,6 @@ + + + all: clean memtest.bin memtest +- scp memtest.bin root@192.168.0.12:/srv/tftp/mt86plus + + # Link it statically once so I know I don't have undefined + # symbols and then link it dynamically so I have full diff --git a/system/memtest86+/patches/memtest86+-5.01-reboot-def.patch b/system/memtest86+/patches/memtest86+-5.01-reboot-def.patch new file mode 100644 index 0000000000..f4b42feb5f --- /dev/null +++ b/system/memtest86+/patches/memtest86+-5.01-reboot-def.patch @@ -0,0 +1,15 @@ +http://forum.canardpc.com/threads/110952-fix-build-due-to-missing-reboot-symbol + +the reboot func is used elsewhere, so don't mark it inline + +--- a/lib.c ++++ b/lib.c +@@ -33,7 +33,7 @@ struct ascii_map_str { + int keycode; + }; + +-inline void reboot(void) ++void reboot(void) + { + + /* tell the BIOS to do a cold start */ diff --git a/system/memtest86+/patches/memtest86+-5.01-test-random-cflags.patch b/system/memtest86+/patches/memtest86+-5.01-test-random-cflags.patch new file mode 100644 index 0000000000..dcdccb8c6e --- /dev/null +++ b/system/memtest86+/patches/memtest86+-5.01-test-random-cflags.patch @@ -0,0 +1,21 @@ +make sure we re-use the existing CFLAGS settings so that we get all the right +flags (like -fno-stack-protector). just append the few changes we want (the +optimization levels). + +https://bugs.gentoo.org/590974 + +--- a/Makefile ++++ b/Makefile +@@ -52,10 +52,10 @@ reloc.o: reloc.c + $(CC) -c $(CFLAGS) -fno-strict-aliasing reloc.c + + test.o: test.c +- $(CC) -c -Wall -march=i486 -m32 -O0 -fomit-frame-pointer -fno-builtin -ffreestanding test.c ++test.o: CFLAGS += -O0 -fno-PIC + + random.o: random.c +- $(CC) -c -Wall -march=i486 -m32 -O3 -fomit-frame-pointer -fno-builtin -ffreestanding random.c ++random.o: CFLAGS += -O3 -fno-PIC + + # rule for build number generation + build_number: diff --git a/system/memtest86+/patches/memtest86+-test-7-smp.patch b/system/memtest86+/patches/memtest86+-test-7-smp.patch new file mode 100644 index 0000000000..424a88dcfd --- /dev/null +++ b/system/memtest86+/patches/memtest86+-test-7-smp.patch @@ -0,0 +1,29 @@ +--- a/test.c ++++ b/test.c +@@ -1202,7 +1202,7 @@ void block_move(int iter, int me) + } else { + pe = end; + } +- if (pe >= end) { ++ if ((pe >= end && end != 0) || (pe < p && end == 0)) { + pe = end; + done++; + } +@@ -1280,7 +1280,7 @@ void block_move(int iter, int me) + } else { + pe = end; + } +- if (pe >= end) { ++ if ((pe >= end && end != 0) || (pe < p && end == 0)) { + pe = end; + done++; + } +@@ -1359,7 +1359,7 @@ void block_move(int iter, int me) + } else { + pe = end; + } +- if (pe >= end) { ++ if ((pe >= end && end != 0) || (pe < p && end == 0)) { + pe = end; + done++; + } -- cgit v1.2.3