system/memtest86: Updated for version 4.3.7.

Signed-off-by: Kyle Guinn <elyk03@gmail.com>
This commit is contained in:
Kyle Guinn 2019-03-31 19:06:49 -05:00 committed by Willy Sudiarto Raharjo
parent 898d490968
commit 9a5d4a1321
No known key found for this signature in database
GPG key ID: 887B8374D7333381
6 changed files with 292 additions and 23 deletions

View file

@ -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

View file

@ -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=""

View file

@ -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"

View file

@ -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 \

View file

@ -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)); }

View file

@ -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 */