diff options
Diffstat (limited to 'system/memtest86')
-rw-r--r-- | system/memtest86/memtest86.SlackBuild | 69 | ||||
-rw-r--r-- | system/memtest86/memtest86.info | 6 | ||||
-rw-r--r-- | system/memtest86/patches/bug_629506_message_15.mbox | 142 | ||||
-rw-r--r-- | system/memtest86/patches/makefile.diff | 52 | ||||
-rw-r--r-- | system/memtest86/patches/memtest86+-5.01-io-extern-inline.patch | 31 | ||||
-rw-r--r-- | system/memtest86/patches/memtest86+-5.01-reboot-def.patch | 15 |
6 files changed, 292 insertions, 23 deletions
diff --git a/system/memtest86/memtest86.SlackBuild b/system/memtest86/memtest86.SlackBuild index 303fd0eba9..84d09445d6 100644 --- a/system/memtest86/memtest86.SlackBuild +++ b/system/memtest86/memtest86.SlackBuild @@ -2,29 +2,29 @@ # Slackware build script for memtest86 -# Copyright 2012-2016 Kyle Guinn <elyk03@gmail.com>, USA +# Copyright 2012-2019 Kyle Guinn <elyk03@gmail.com> # All rights reserved. # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright -# notice, this list of conditions and the following disclaimer. +# notice, this list of conditions and the following disclaimer. # -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PRGNAM=memtest86 -VERSION=${VERSION:-4.1.0} -BUILD=${BUILD:-2} +VERSION=${VERSION:-4.3.7} +BUILD=${BUILD:-1} TAG=${TAG:-_SBo} # i486 only. Modify the Makefile at your own risk :-) @@ -32,7 +32,7 @@ ARCH=i486 CWD=$(pwd) TMP=${TMP:-/tmp/SBo} -PKG=$TMP/package-$PRGNAM +PKG=$TMP/package-$PRGNAM-$VERSION OUTPUT=${OUTPUT:-/tmp} DOCS="README*" @@ -42,19 +42,48 @@ set -e rm -rf $PKG mkdir -p $TMP $PKG $OUTPUT cd $TMP -rm -rf $PRGNAM-$VERSION +rm -rf src tar xvf $CWD/$PRGNAM-$VERSION-src.tar.gz -cd $PRGNAM-$VERSION +cd src chown -R root:root . chmod -R u+w,go-w,a+rX-st . -make CC="gcc -fgnu89-inline" -install -D -m 0644 memtest.bin $PKG/boot/memtest86.bin +# Permissions and line endings need to be sanitized. +# Required so that memtest86+ backported patches will apply cleanly. +find . -type f -exec chmod -x {} + +find . -name precomp.bin -prune -o \ + -type f -exec sed -i 's/\x0d$//' {} \; + +# https://gitweb.gentoo.org/repo/gentoo.git/tree/sys-apps/memtest86+/files +patch -p1 < $CWD/patches/memtest86+-5.01-io-extern-inline.patch +patch -p1 < $CWD/patches/memtest86+-5.01-reboot-def.patch + +# The following patches from Gentoo don't apply cleanly and/or have a few +# unnecessary additions or omissions. This combines and fixes them. +#patch -p1 < $CWD/patches/memtest86+-5.01-hardcoded_cc.patch +#patch -p1 < $CWD/patches/memtest86+-5.01-no-clean.patch +#patch -p1 < $CWD/patches/memtest86+-5.01-test-random-cflags.patch +patch -p1 < $CWD/patches/makefile.diff + +# https://bugs.debian.org/779504 -> https://bugs.debian.org/629506 +patch -p1 < $CWD/patches/bug_629506_message_15.mbox + +# TBD whether these memtest86+ patches should be backported: +# https://sources.debian.org/patches/memtest86+/5.01-3/ +# https://bugs.debian.org/250864 suggests that it could be backported. +#patch -p1 < $CWD/patches/multiboot +# https://bugs.debian.org/795421 +#patch -p1 < $CWD/patches/memtest86+-test-7-smp.patch + +make +install -D -m 0755 memtest $PKG/boot/$PRGNAM-$VERSION +install -D -m 0644 memtest.bin $PKG/boot/$PRGNAM-$VERSION.bin +ln -s $PRGNAM-$VERSION $PKG/boot/$PRGNAM +ln -s $PRGNAM-$VERSION.bin $PKG/boot/$PRGNAM.bin mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild -cat $CWD/README.SLACKWARE > $PKG/usr/doc/$PRGNAM-$VERSION/README.SLACKWARE mkdir -p $PKG/install cat $CWD/slack-desc > $PKG/install/slack-desc diff --git a/system/memtest86/memtest86.info b/system/memtest86/memtest86.info index 65170ce52d..9eae7f74da 100644 --- a/system/memtest86/memtest86.info +++ b/system/memtest86/memtest86.info @@ -1,8 +1,8 @@ PRGNAM="memtest86" -VERSION="4.1.0" +VERSION="4.3.7" HOMEPAGE="https://www.memtest86.com/" -DOWNLOAD="https://www.memtest86.com/downloads/memtest86-4.1.0-src.tar.gz" -MD5SUM="8d6f6590d1bbcfa333bef53f568a09d5" +DOWNLOAD="https://www.memtest86.com/downloads/memtest86-4.3.7-src.tar.gz" +MD5SUM="784f3adf148079b63f925b478dee7c85" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="" 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: <viro@ftp.linux.org.uk> +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 <viro@ftp.linux.org.uk>) + 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 <viro@ZenIV.linux.org.uk> +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 <viro@ftp.linux.org.uk> +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/makefile.diff b/system/memtest86/patches/makefile.diff new file mode 100644 index 0000000000..d899435942 --- /dev/null +++ b/system/memtest86/patches/makefile.diff @@ -0,0 +1,52 @@ +diff --git a/Makefile b/Makefile +--- a/Makefile ++++ b/Makefile +@@ -8,8 +8,7 @@ + # + FDISK=/dev/fd0 + +-AS=as -32 +-CC=gcc ++ASFLAGS=-32 + + CFLAGS= -Wall -march=i486 -m32 -O1 -fomit-frame-pointer -fno-builtin \ + -ffreestanding -fPIC $(SMP_FL) -fno-stack-protector +@@ -17,7 +16,7 @@ + OBJS= head.o reloc.o main.o test.o init.o lib.o patn.o screen_buffer.o \ + config.o memsize.o error.o smp.o cpuid.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 +@@ -28,7 +27,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 $@ +@@ -44,16 +43,16 @@ + + 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 +- $(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 + + clean: + rm -f *.o *.s *.iso memtest.bin memtest memtest_shared \ 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-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 */ |