tags 241239 patch
thanks
Redemption, at last! Well, sort of :-)
I implemented support for Multiboot in Memtest86. The upstream patch has
already been forwarded to them.
Since other bootloaders such as LILO still need to rely on the zImage version,
I propose that the package includes both builds. See the attached debian
patch.
Btw, notice the increase in grub2's versioned dependency. Indeed, when this
patch is applied the version of grub2 in lenny won't be able to load memtest86,
only the one in experimental (which will be uploaded to sid as soon as lenny
is released).
--
Robert Millan
The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
how) you may access your data; but nobody's threatening your freedom: we
still allow you to remove your data and not access it at all."
diff -x '*.s' -Nur memtest86-3.4.old/head.S memtest86-3.4/head.S
--- memtest86-3.4.old/head.S 2007-08-18 23:22:48.000000000 +0200
+++ memtest86-3.4/head.S 2008-09-05 13:52:55.000000000 +0200
@@ -37,6 +37,13 @@
cld
cli
+ /* Store MBI pointer */
+ xorl %ecx, %ecx
+ cmpl $0x2BADB002, %eax
+ jne 0f
+ movl %ebx, %ecx
+0:
+
/* Ensure I have a stack pointer */
testl %esp, %esp
jnz 0f
@@ -49,6 +56,20 @@
0: popl %ebx
addl $_GLOBAL_OFFSET_TABLE_+[.-0b], %ebx
+ /* Move MBI pointer to a safe place */
+ testl %ecx, %ecx
+ je 0f
+ movl %ecx, [EMAIL PROTECTED](%ebx)
+0:
+
+ jmp 0f
+ /* Multiboot header */
+.align 4
+ .long 0x1BADB002
+ .long 0
+ .long -0x1BADB002
+0:
+
/* Pick the appropriate stack address */
leal [EMAIL PROTECTED](%ebx), %esp
@@ -953,6 +974,9 @@
movl $1, %eax
ret
+.globl mbiptr
+mbiptr:
+ .long 0
realptr:
.word real - RSTART
.word 0x0000
diff -x '*.s' -Nur memtest86-3.4.old/init.c memtest86-3.4/init.c
--- memtest86-3.4.old/init.c 2007-09-04 09:40:39.000000000 +0200
+++ memtest86-3.4/init.c 2008-09-05 13:53:25.000000000 +0200
@@ -83,7 +83,10 @@
/* Determine the memory map */
if ((firmware == FIRMWARE_UNKNOWN) &&
(memsz_mode != SZ_MODE_PROBE)) {
- if (query_linuxbios()) {
+ if (query_multiboot()) {
+ firmware = FIRMWARE_MULTIBOOT;
+ }
+ else if (query_linuxbios()) {
firmware = FIRMWARE_LINUXBIOS;
}
else if (query_pcbios()) {
diff -x '*.s' -Nur memtest86-3.4.old/Makefile memtest86-3.4/Makefile
--- memtest86-3.4.old/Makefile 2008-09-05 13:19:02.000000000 +0200
+++ memtest86-3.4/Makefile 2008-09-05 13:52:15.000000000 +0200
@@ -14,7 +14,7 @@
-ffreestanding -fPIC
OBJS= head.o reloc.o main.o test.o init.o lib.o patn.o screen_buffer.o \
- config.o linuxbios.o memsize.o pci.o controller.o random.o extra.o \
+ config.o multiboot.o linuxbios.o memsize.o pci.o controller.o random.o extra.o \
spd.o error.o dmi.o
all: memtest.bin memtest
diff -x '*.s' -Nur memtest86-3.4.old/memsize.c memtest86-3.4/memsize.c
--- memtest86-3.4.old/memsize.c 2007-07-17 05:10:08.000000000 +0200
+++ memtest86-3.4/memsize.c 2008-09-05 14:30:18.000000000 +0200
@@ -26,7 +26,7 @@
static void memsize_801(void);
static int sanitize_e820_map(struct e820entry *orig_map, struct e820entry *new_bios,
short old_nr, short res);
-static void memsize_linuxbios();
+static void memsize_generic();
static void memsize_probe(void);
static int check_ram(void);
@@ -83,7 +83,10 @@
memsize_820(res);
}
else if (firmware == FIRMWARE_LINUXBIOS) {
- memsize_linuxbios();
+ memsize_generic("LinuxBIOS");
+ }
+ else if (firmware == FIRMWARE_MULTIBOOT) {
+ memsize_generic("Multiboot");
}
}
@@ -111,7 +114,7 @@
}
}
}
-static void memsize_linuxbios(void)
+static void memsize_generic(char *origin)
{
int i, n;
/* Build the memory map for testing */
@@ -129,7 +132,7 @@
n++;
}
v->msegs = n;
- cprint(LINE_INFO, COL_MMAP, "LinuxBIOS");
+ cprint(LINE_INFO, COL_MMAP, origin);
}
static void memsize_820(int res)
{
diff -x '*.s' -Nur memtest86-3.4.old/multiboot.c memtest86-3.4/multiboot.c
--- memtest86-3.4.old/multiboot.c 1970-01-01 01:00:00.000000000 +0100
+++ memtest86-3.4/multiboot.c 2008-09-05 14:30:44.000000000 +0200
@@ -0,0 +1,65 @@
+/* multiboot.c - MemTest-86 Version 3.3
+ *
+ * Copyright (C) 2008 Robert Millan
+ *
+ * Loosely based on linuxbios.c, which is:
+ *
+ * Released under version 2 of the Gnu Public License.
+ * By Eric Biederman
+ */
+
+#include <stdint.h>
+#include "test.h"
+
+struct mbi
+{
+ uint32_t flags;
+ uint32_t dummy[10];
+ uint32_t mmap_length;
+ uint32_t mmap_addr;
+};
+
+struct multiboot_mmap_entry
+{
+ uint32_t size;
+ uint64_t addr;
+ uint64_t len;
+ uint32_t type;
+} __attribute__((packed));
+
+extern struct mbi *mbiptr;
+
+int query_multiboot(void)
+{
+ struct multiboot_mmap_entry *mem;
+ int i;
+
+ if (!mbiptr) {
+ return 0;
+ }
+ if (!mbiptr->mmap_addr) {
+ return 1;
+ }
+ if ((mbiptr->flags & 0x00000040) == 0) {
+ return 1;
+ }
+
+ mem = (struct multiboot_mmap_entry *) mbiptr->mmap_addr;
+ mem_info.e820_nr = 0;
+
+ for (i = 0; i < E820MAX; i++) {
+ if ((uint32_t) mem >= (mbiptr->mmap_addr + mbiptr->mmap_length)) {
+ break;
+ }
+
+ mem_info.e820[mem_info.e820_nr].addr = mem->addr;
+ mem_info.e820[mem_info.e820_nr].size = mem->len;
+ /* Multiboot spec defines available / reserved types to match with E820. */
+ mem_info.e820[mem_info.e820_nr].type = mem->type;
+ mem_info.e820_nr++;
+
+ mem = (struct multiboot_mmap_entry *) ((uint32_t) mem + mem->size + sizeof (mem->size));
+ }
+
+ return 1;
+}
diff -x '*.s' -Nur memtest86-3.4.old/test.h memtest86-3.4/test.h
--- memtest86-3.4.old/test.h 2007-09-08 12:38:25.000000000 +0200
+++ memtest86-3.4/test.h 2008-09-05 13:57:02.000000000 +0200
@@ -96,6 +96,7 @@
void *memmove(void *dest, const void *src, ulong n);
int query_linuxbios(void);
int query_pcbios(void);
+int query_multiboot(void);
int insertaddress(ulong);
void printpatn(void);
void printpatn(void);
@@ -318,6 +319,7 @@
#define FIRMWARE_UNKNOWN 0
#define FIRMWARE_PCBIOS 1
#define FIRMWARE_LINUXBIOS 2
+#define FIRMWARE_MULTIBOOT 3
extern struct vars * const v;
extern unsigned char _start[], _end[], startup_32[];
diff -x '*.s' -Nur memtest86-3.4.old/debian/control memtest86-3.4/debian/control
--- memtest86-3.4.old/debian/control 2008-09-05 13:19:02.000000000 +0200
+++ memtest86-3.4/debian/control 2008-09-05 14:45:14.000000000 +0200
@@ -7,7 +7,7 @@
Package: memtest86
Architecture: i386 amd64 kfreebsd-i386 kfreebsd-amd64
-Suggests: hwtools, memtester, kernel-patch-badram, memtest86+, grub2 (>=1.95+20070515-1) | grub (>= 0.95+cvs20040624), mtools
+Suggests: hwtools, memtester, kernel-patch-badram, memtest86+, grub2 (>= 1.96+20080831-1) | grub (>= 0.95+cvs20040624), mtools
Description: thorough real-mode memory tester
Memtest86 scans your RAM for errors.
.
diff -x '*.s' -Nur memtest86-3.4.old/debian/grub memtest86-3.4/debian/grub
--- memtest86-3.4.old/debian/grub 2008-09-05 13:19:02.000000000 +0200
+++ memtest86-3.4/debian/grub 2008-09-05 14:48:49.000000000 +0200
@@ -1,11 +1,11 @@
#!/bin/bash
set -e
-if test -e /boot/memtest86.bin ; then
- echo "Found memtest86 image: /boot/memtest86.bin" >&2
+if test -e /boot/memtest86_multiboot.bin ; then
+ echo "Found memtest86 image: /boot/memtest86_multiboot.bin" >&2
cat << EOF
menuentry "Memory test (memtest86)" {
- linux ${GRUB_DRIVE_BOOT}/memtest86.bin
+ multiboot ${GRUB_DRIVE_BOOT}/memtest86_multiboot.bin
}
EOF
fi
diff -x '*.s' -Nur memtest86-3.4.old/debian/lilo.conf memtest86-3.4/debian/lilo.conf
--- memtest86-3.4.old/debian/lilo.conf 2008-09-05 13:19:02.000000000 +0200
+++ memtest86-3.4/debian/lilo.conf 2008-09-05 14:48:09.000000000 +0200
@@ -1,5 +1,5 @@
# sample /etc/lilo.conf entry for memtest86
-image = /boot/memtest86.bin
+image = /boot/memtest86_zimage.bin
label = memtest
diff -x '*.s' -Nur memtest86-3.4.old/debian/make-memtest86-boot-floppy memtest86-3.4/debian/make-memtest86-boot-floppy
--- memtest86-3.4.old/debian/make-memtest86-boot-floppy 2008-09-05 13:19:02.000000000 +0200
+++ memtest86-3.4/debian/make-memtest86-boot-floppy 2008-09-05 14:43:26.000000000 +0200
@@ -16,7 +16,7 @@
set -e
-MEMTEST=/boot/memtest86.bin
+MEMTEST=/boot/memtest86_zimage.bin
FLOPPYIMAGE=/dev/fd0
error()
diff -x '*.s' -Nur memtest86-3.4.old/debian/make-memtest86-boot-floppy.1 memtest86-3.4/debian/make-memtest86-boot-floppy.1
--- memtest86-3.4.old/debian/make-memtest86-boot-floppy.1 2008-09-05 13:19:02.000000000 +0200
+++ memtest86-3.4/debian/make-memtest86-boot-floppy.1 2008-09-05 14:48:22.000000000 +0200
@@ -20,7 +20,7 @@
.SH OPTIONS
.IP "\-\-memtest <path to the memtest-image>"
-Path to the memtest86-image, default is /boot/memtest86.bin.
+Path to the memtest86-image, default is /boot/memtest86_zimage.bin.
.IP "\-\-floppyimage <path to the floppyimage or device>"
File or device where the boot-image should be written to, default is /dev/fd0.
diff -x '*.s' -Nur memtest86-3.4.old/debian/postinst memtest86-3.4/debian/postinst
--- memtest86-3.4.old/debian/postinst 2008-09-05 13:19:02.000000000 +0200
+++ memtest86-3.4/debian/postinst 2008-09-05 14:48:31.000000000 +0200
@@ -5,7 +5,7 @@
# (adapted from snippet by [EMAIL PROTECTED])
if [ -x /sbin/lilo ] && [ -r /etc/lilo.conf ] &&
[ "${DEBIAN_FRONTEND}" != "noninteractive" ] &&
- grep "image.*=.*/boot/memtest86.bin" /etc/lilo.conf >/dev/null
+ grep "image.*=.*/boot/memtest86_zimage.bin" /etc/lilo.conf >/dev/null
then
echo "You seem to have an entry for memtest86 in /etc/lilo.conf."
printf "Run lilo now [y/N]? "
diff -x '*.s' -Nur memtest86-3.4.old/debian/README.Debian memtest86-3.4/debian/README.Debian
--- memtest86-3.4.old/debian/README.Debian 2008-09-05 13:19:02.000000000 +0200
+++ memtest86-3.4/debian/README.Debian 2008-09-05 14:47:53.000000000 +0200
@@ -1,13 +1,22 @@
memtest86 for Debian
--------------------
-Binary image is /boot/memtest86.bin
+Two binary images are provided:
+
+ - A legacy /boot/memtest86_zimage.bin that uses Linux zImage boot
+ protocol.
+
+ - A Multiboot /boot/memtest86_multiboot.bin image that follows the
+ Multiboot specification.
To run the tester you'll need to setup your bootloader (see
examples/lilo.conf for LILO), or to make a boot-floppy, and reboot on
-this image.
+the zImage.
The make-memtest86-boot-floppy utility will help you to create a
boot floppy or floppy image.
+The Multiboot image is the recommended option if you want to use GRUB, and
+in platforms other than PC/BIOS (such as coreboot), it is the only option.
+
-- Yann Dirson <[EMAIL PROTECTED]>, Tue May 25 15:45:37 2004
diff -x '*.s' -Nur memtest86-3.4.old/debian/rules memtest86-3.4/debian/rules
--- memtest86-3.4.old/debian/rules 2008-09-05 13:19:02.000000000 +0200
+++ memtest86-3.4/debian/rules 2008-09-05 14:43:07.000000000 +0200
@@ -31,7 +31,8 @@
install -d debian/memtest86/usr/bin
install -m755 debian/make-memtest86-boot-floppy debian/memtest86/usr/bin/
- install -D -m644 memtest.bin debian/memtest86/boot/memtest86.bin
+ install -D -m644 memtest.bin debian/memtest86/boot/memtest86_zimage.bin
+ install -D -m644 memtest debian/memtest86/boot/memtest86_multiboot.bin
install -D -m755 debian/grub debian/memtest86/etc/grub.d/20_memtest86
dh_installman debian/make-memtest86-boot-floppy.1