I have finally had a chance to make a good patch with
my changes that have been accumulating to memtest86.   I believe
this patch resolves most of the outstanding issues.  

There are quite a few people on the LinuxBIOS list who are
interested so I am posting it here before I run out of time again.

- Fixes problems when compiling with newer versions of gcc
  o Rely on test.h for the declaration of v
  o Update memtest86.lds so we include all of the relocation sections
- Add support for the memory controller in the E7500 
- Add private versions elf.h and stdint.h to ensure a good copy is present.
- Rewrite cacheable so it works properly with sparse memory maps.
- Add the ability to automatically detect the baud rate
- Generalized the code that sanitizes the memory map so it is universal.
- Detect Opteron CPUS 

Eric

diff --exclude=CVS -uNr memtest86-3.0/Makefile memtest86/Makefile
--- memtest86-3.0/Makefile      Tue Apr 23 05:21:05 2002
+++ memtest86/Makefile  Sun Aug 17 04:00:36 2003
@@ -12,7 +12,7 @@
 #
 # gcc compiler options, these settings should suffice
 #
-CCFLAGS=-Wall -march=i486 -O -fomit-frame-pointer -fno-builtin
+CCFLAGS=-Wall -march=i486 -Os -fomit-frame-pointer -fno-builtin -ffreestanding
 
 AS=as
 
@@ -56,6 +56,9 @@
 controller.o: controller.c defs.h config.h test.h pci.h controller.h
        $(CC) -c $(CCFLAGS) -fPIC controller.c
 
+controller.s: controller.c defs.h config.h test.h pci.h controller.h
+       $(CC) -S $(CCFLAGS) -fPIC controller.c
+
 head.s: head.S
        $(CC) -E -traditional $< -o $@
 
@@ -70,7 +73,7 @@
 # relocation information
 memtest_shared: $(OBJS) memtest_shared.lds Makefile
        $(LD) --warn-constructors --warn-common -static -T memtest_shared.lds -o $@ 
$(OBJS) && \
-       $(LD) -shared -T memtest_shared.lds -o $@ $(OBJS)
+       $(LD) -shared -Bsymbolic -T memtest_shared.lds -o $@ $(OBJS)
 
 memtest_shared.bin: memtest_shared
        objcopy -O binary $< memtest_shared.bin
diff --exclude=CVS -uNr memtest86-3.0/config.c memtest86/config.c
--- memtest86-3.0/config.c      Tue May 21 12:27:11 2002
+++ memtest86/config.c  Sat Aug 16 22:40:06 2003
@@ -10,7 +10,6 @@
 
 extern int bail;
 extern struct tseq tseq[];
-extern struct vars *v;
 extern short e820_nr;
 extern char memsz_mode;
 
diff --exclude=CVS -uNr memtest86-3.0/config.h memtest86/config.h
--- memtest86-3.0/config.h      Tue May 21 15:14:30 2002
+++ memtest86/config.h  Sun Aug 17 04:09:51 2003
@@ -15,7 +15,10 @@
 /*     to enable. */
 #define SERIAL_CONSOLE_DEFAULT 0
 
-/* SERIAL_BAUD_RATE - Baud rate for the serial console */
+/* SERIAL_BAUD_RATE - Baud rate for the serial console
+ * If this is not defined it is assumed a previous program has set the
+ * baud rate, and the baud is preserved.
+ */
 #define SERIAL_BAUD_RATE 9600
 
 /* SCRN_DEBUG - extra check for SCREEN_BUFFER
diff --exclude=CVS -uNr memtest86-3.0/controller.c memtest86/controller.c
--- memtest86-3.0/controller.c  Wed Apr 24 10:55:22 2002
+++ memtest86/controller.c      Sun Aug 17 02:26:50 2003
@@ -417,6 +417,75 @@
        }
 }
 
+static void setup_iE7500(void)
+{
+       unsigned long mchcfgns;
+       unsigned long drc;
+
+       /* Read the hardare capabilities */
+       pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x52, 2, &mchcfgns);
+       pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x7C, 4, &drc);
+
+       /* Fill in the correct memory capabilities */
+       ctrl.cap = ECC_SCRUB;
+       ctrl.mode = 0;
+       /* checking and correcting enabled */
+       if (((drc >> 20) & 3) == 2) {
+               ctrl.mode |= ECC_CORRECT;
+       }
+       /* scrub enabled */
+       if (mchcfgns & (1 << 2)) {
+               ctrl.mode |= __ECC_SCRUB;
+       }
+
+       /* Clear any prexisting error reports */
+       pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn +1, 0x80, 1, 3);
+       pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn +1, 0x82, 1, 3);
+}
+
+static void poll_iE7500(void)
+{
+       unsigned long ferr;
+       unsigned long nerr;
+       unsigned char err;
+       pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn +1, 0x80, 1, &ferr);
+       pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn +1, 0x82, 1, &nerr);
+       err = ferr | nerr;
+       if (err & 1) {
+               /* Find out about the first correctable error */
+               unsigned long celog_add;
+               unsigned long celog_syndrome;
+               unsigned long page;
+               /* Read the error location */
+               pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn +1, 0xA0, 4, &celog_add);
+               /* Read the syndrome */
+               pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn +1, 0xD0, 2, 
&celog_syndrome);
+
+               /* Parse the error location */
+               page = (celog_add & 0x0FFFFFC0) >> 6;
+               
+               /* Report the error */
+               print_ecc_err(page, 0, 1, celog_syndrome, 0);
+       }
+       if (err & 2) {
+               /* Found out about the first uncorrectable error */
+               unsigned long uccelog_add;
+               unsigned long page;
+               /* Read the error location */
+               pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn +1, 0xB0, 4, &uccelog_add);
+
+               /* Parse the error location */
+               page = (uccelog_add & 0x0FFFFFC0) >> 6;
+               
+               /* Report the error */
+               print_ecc_err(page, 0, 2, 0, 0);
+               
+       }
+       /* Clear the error registers */
+       pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn +1, 0x80, 1, ferr & 3);
+       pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn +1, 0x82, 1, nerr & 3);
+}
+
 struct pci_memory_controller {
        unsigned vendor;
        unsigned device;
@@ -465,10 +534,10 @@
        { 0x8086, 0x122d, "i430fx",    0, setup_nothing, poll_nothing },
        { 0x8086, 0x1237, "i440fx",    0, setup_nothing, poll_nothing },
        { 0x8086, 0x1250, "i430hx",    0, setup_nothing, poll_nothing },
-       { 0x8086, 0x1A21, "i840",      0,setup_i840, poll_i840 },
-       { 0x8086, 0x1A30, "i845",      0,setup_i845, poll_i845 },
-       { 0x8086, 0x2500, "i820",      0,setup_i820, poll_i820 },
-       { 0x8086, 0x2530, "i850",      0,setup_i850, poll_i850 },
+       { 0x8086, 0x1A21, "i840",      0, setup_i840, poll_i840 },
+       { 0x8086, 0x1A30, "i845",      0, setup_i845, poll_i845 },
+       { 0x8086, 0x2500, "i820",      0, setup_i820, poll_i820 },
+       { 0x8086, 0x2530, "i850",      0, setup_i850, poll_i850 },
        { 0x8086, 0x2531, "i860",      1, setup_i860, poll_i860 },
        { 0x8086, 0x7030, "i430vx",    0, setup_nothing, poll_nothing },
        { 0x8086, 0x7120, "i810",      0, setup_nothing, poll_nothing },
@@ -480,6 +549,7 @@
        { 0x8086, 0x71A0, "i440gx",    0, setup_i440gx, poll_i440gx },
        { 0x8086, 0x71A2, "i440gx",    0, setup_i440gx, poll_i440gx },
        { 0x8086, 0x84C5, "i450gx",    0, setup_nothing, poll_nothing },
+       { 0x8086, 0x2540, "iE7500",    1, setup_iE7500, poll_iE7500 },
 };
 
 static void print_memory_controller(void)
@@ -541,6 +611,7 @@
        unsigned long device;
        int i;
        int result;
+
        result = pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, PCI_VENDOR_ID, 2, &vendor);
        result = pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, PCI_DEVICE_ID, 2, &device);
        ctrl.index = 0;
@@ -553,7 +624,8 @@
                        }
                }
        }
-       controllers[ctrl.index].setup_ecc();
+       controllers[ctrl.index].setup_ecc(); 
+
        /* Don't enable ECC polling by default unless it has
         * been well tested.
         */
diff --exclude=CVS -uNr memtest86-3.0/elf.h memtest86/elf.h
--- memtest86-3.0/elf.h Wed Dec 31 17:00:00 1969
+++ memtest86/elf.h     Sat Aug 16 23:17:22 2003
@@ -0,0 +1,590 @@
+#ifndef ELF_H
+#define ELF_H
+
+#define EI_NIDENT      16      /* Size of e_ident array. */
+
+/* Values for e_type. */
+#define ET_NONE                0       /* No file type */
+#define ET_REL         1       /* Relocatable file */
+#define ET_EXEC                2       /* Executable file */
+#define ET_DYN         3       /* Shared object file */
+#define ET_CORE                4       /* Core file */
+
+/* Values for e_machine (architecute). */
+#define EM_NONE                 0              /* No machine */
+#define EM_M32          1              /* AT&T WE 32100 */
+#define EM_SPARC        2              /* SUN SPARC */
+#define EM_386          3              /* Intel 80386+ */
+#define EM_68K          4              /* Motorola m68k family */
+#define EM_88K          5              /* Motorola m88k family */
+#define EM_486          6              /* Perhaps disused */
+#define EM_860          7              /* Intel 80860 */
+#define EM_MIPS                 8              /* MIPS R3000 big-endian */
+#define EM_S370                 9              /* IBM System/370 */
+#define EM_MIPS_RS3_LE 10              /* MIPS R3000 little-endian */
+
+#define EM_PARISC      15              /* HPPA */
+#define EM_VPP500      17              /* Fujitsu VPP500 */
+#define EM_SPARC32PLUS 18              /* Sun's "v8plus" */
+#define EM_960         19              /* Intel 80960 */
+#define EM_PPC         20              /* PowerPC */
+#define EM_PPC64       21              /* PowerPC 64-bit */
+#define EM_S390                22              /* IBM S390 */
+
+#define EM_V800                36              /* NEC V800 series */
+#define EM_FR20                37              /* Fujitsu FR20 */
+#define EM_RH32                38              /* TRW RH-32 */
+#define EM_RCE         39              /* Motorola RCE */
+#define EM_ARM         40              /* ARM */
+#define EM_FAKE_ALPHA  41              /* Digital Alpha */
+#define EM_SH          42              /* Hitachi SH */
+#define EM_SPARCV9     43              /* SPARC v9 64-bit */
+#define EM_TRICORE     44              /* Siemens Tricore */
+#define EM_ARC         45              /* Argonaut RISC Core */
+#define EM_H8_300      46              /* Hitachi H8/300 */
+#define EM_H8_300H     47              /* Hitachi H8/300H */
+#define EM_H8S         48              /* Hitachi H8S */
+#define EM_H8_500      49              /* Hitachi H8/500 */
+#define EM_IA_64       50              /* Intel Merced */
+#define EM_MIPS_X      51              /* Stanford MIPS-X */
+#define EM_COLDFIRE    52              /* Motorola Coldfire */
+#define EM_68HC12      53              /* Motorola M68HC12 */
+#define EM_MMA         54              /* Fujitsu MMA Multimedia Accelerator*/
+#define EM_PCP         55              /* Siemens PCP */
+#define EM_NCPU                56              /* Sony nCPU embeeded RISC */
+#define EM_NDR1                57              /* Denso NDR1 microprocessor */
+#define EM_STARCORE    58              /* Motorola Start*Core processor */
+#define EM_ME16                59              /* Toyota ME16 processor */
+#define EM_ST100       60              /* STMicroelectronic ST100 processor */
+#define EM_TINYJ       61              /* Advanced Logic Corp. Tinyj emb.fam*/
+#define EM_X86_64      62              /* AMD x86-64 architecture */
+#define EM_PDSP                63              /* Sony DSP Processor */
+
+#define EM_FX66                66              /* Siemens FX66 microcontroller */
+#define EM_ST9PLUS     67              /* STMicroelectronics ST9+ 8/16 mc */
+#define EM_ST7         68              /* STmicroelectronics ST7 8 bit mc */
+#define EM_68HC16      69              /* Motorola MC68HC16 microcontroller */
+#define EM_68HC11      70              /* Motorola MC68HC11 microcontroller */
+#define EM_68HC08      71              /* Motorola MC68HC08 microcontroller */
+#define EM_68HC05      72              /* Motorola MC68HC05 microcontroller */
+#define EM_SVX         73              /* Silicon Graphics SVx */
+#define EM_AT19                74              /* STMicroelectronics ST19 8 bit mc */
+#define EM_VAX         75              /* Digital VAX */
+#define EM_CRIS                76              /* Axis Communications 32-bit embedded 
processor */
+#define EM_JAVELIN     77              /* Infineon Technologies 32-bit embedded 
processor */
+#define EM_FIREPATH    78              /* Element 14 64-bit DSP Processor */
+#define EM_ZSP         79              /* LSI Logic 16-bit DSP Processor */
+#define EM_MMIX                80              /* Donald Knuth's educational 64-bit 
processor */
+#define EM_HUANY       81              /* Harvard University machine-independent 
object files */
+#define EM_PRISM       82              /* SiTera Prism */
+#define EM_AVR         83              /* Atmel AVR 8-bit microcontroller */
+#define EM_FR30                84              /* Fujitsu FR30 */
+#define EM_D10V                85              /* Mitsubishi D10V */
+#define EM_D30V                86              /* Mitsubishi D30V */
+#define EM_V850                87              /* NEC v850 */
+#define EM_M32R                88              /* Mitsubishi M32R */
+#define EM_MN10300     89              /* Matsushita MN10300 */
+#define EM_MN10200     90              /* Matsushita MN10200 */
+#define EM_PJ          91              /* picoJava */
+#define EM_OPENRISC    92              /* OpenRISC 32-bit embedded processor */
+#define EM_ARC_A5      93              /* ARC Cores Tangent-A5 */
+#define EM_XTENSA      94              /* Tensilica Xtensa Architecture */
+#define EM_NUM         95
+
+/* Values for p_type. */
+#define PT_NULL                0       /* Unused entry. */
+#define PT_LOAD                1       /* Loadable segment. */
+#define PT_DYNAMIC     2       /* Dynamic linking information segment. */
+#define PT_INTERP      3       /* Pathname of interpreter. */
+#define PT_NOTE                4       /* Auxiliary information. */
+#define PT_SHLIB       5       /* Reserved (not used). */
+#define PT_PHDR                6       /* Location of program header itself. */
+
+/* Values for p_flags. */
+#define PF_X           0x1     /* Executable. */
+#define PF_W           0x2     /* Writable. */
+#define PF_R           0x4     /* Readable. */
+
+
+#define        ELF_PROGRAM_RETURNS_BIT 0x8000000       /* e_flags bit 31 */
+
+#define EI_MAG0                0
+#define ELFMAG0                0x7f
+
+#define EI_MAG1                1
+#define ELFMAG1                'E'
+
+#define EI_MAG2                2
+#define ELFMAG2                'L'
+
+#define EI_MAG3                3
+#define ELFMAG3                'F'
+
+#define ELFMAG         "\177ELF"
+
+#define EI_CLASS       4       /* File class byte index */
+#define ELFCLASSNONE   0       /* Invalid class */
+#define ELFCLASS32     1       /* 32-bit objects */
+#define ELFCLASS64     2       /* 64-bit objects */
+
+#define EI_DATA                5       /* Data encodeing byte index */
+#define ELFDATANONE    0       /* Invalid data encoding */
+#define ELFDATA2LSB    1       /* 2's complement little endian */
+#define ELFDATA2MSB    2       /* 2's complement big endian */
+
+#define EI_VERSION     6       /* File version byte index */
+                               /* Value must be EV_CURRENT */
+
+#define EV_NONE                0       /* Invalid ELF Version */
+#define EV_CURRENT     1       /* Current version */
+
+#define ELF32_PHDR_SIZE (8*4)  /* Size of an elf program header */
+
+#ifndef ASSEMBLY
+
+#include "stdint.h"
+
+/*
+ * ELF definitions common to all 32-bit architectures.
+ */
+
+typedef uint32_t       Elf32_Addr;
+typedef uint16_t       Elf32_Half;
+typedef uint32_t       Elf32_Off;
+typedef uint16_t       Elf32_Section;
+typedef int32_t                Elf32_Sword;
+typedef uint32_t       Elf32_Word;
+typedef uint32_t       Elf32_Size;
+
+typedef uint64_t       Elf64_Addr;
+typedef uint16_t       Elf64_Half;
+typedef uint64_t       Elf64_Off;
+typedef uint16_t       Elf64_Section;
+typedef int32_t                Elf64_Sword;
+typedef uint32_t       Elf64_Word;
+typedef uint64_t       Elf64_Size;
+typedef uint64_t       Elf64_Xword;
+typedef        int64_t         Elf64_Sxword;
+
+/*
+ * ELF header.
+ */
+typedef struct {
+       unsigned char   e_ident[EI_NIDENT];     /* File identification. */
+       Elf32_Half      e_type;         /* File type. */
+       Elf32_Half      e_machine;      /* Machine architecture. */
+       Elf32_Word      e_version;      /* ELF format version. */
+       Elf32_Addr      e_entry;        /* Entry point. */
+       Elf32_Off       e_phoff;        /* Program header file offset. */
+       Elf32_Off       e_shoff;        /* Section header file offset. */
+       Elf32_Word      e_flags;        /* Architecture-specific flags. */
+       Elf32_Half      e_ehsize;       /* Size of ELF header in bytes. */
+       Elf32_Half      e_phentsize;    /* Size of program header entry. */
+       Elf32_Half      e_phnum;        /* Number of program header entries. */
+       Elf32_Half      e_shentsize;    /* Size of section header entry. */
+       Elf32_Half      e_shnum;        /* Number of section header entries. */
+       Elf32_Half      e_shstrndx;     /* Section name strings section. */
+} Elf32_Ehdr;
+
+typedef struct {
+       unsigned char   e_ident[EI_NIDENT];     /* File identification. */
+       Elf64_Half      e_type;         /* File type. */
+       Elf64_Half      e_machine;      /* Machine architecture. */
+       Elf64_Word      e_version;      /* ELF format version. */
+       Elf64_Addr      e_entry;        /* Entry point. */
+       Elf64_Off       e_phoff;        /* Program header file offset. */
+       Elf64_Off       e_shoff;        /* Section header file offset. */
+       Elf64_Word      e_flags;        /* Architecture-specific flags. */
+       Elf64_Half      e_ehsize;       /* Size of ELF header in bytes. */
+       Elf64_Half      e_phentsize;    /* Size of program header entry. */
+       Elf64_Half      e_phnum;        /* Number of program header entries. */
+       Elf64_Half      e_shentsize;    /* Size of section header entry. */
+       Elf64_Half      e_shnum;        /* Number of section header entries. */
+       Elf64_Half      e_shstrndx;     /* Section name strings section. */
+} Elf64_Ehdr;
+
+/*
+ * Program header.
+ */
+typedef struct {
+       Elf32_Word      p_type;         /* Entry type. */
+       Elf32_Off       p_offset;       /* File offset of contents. */
+       Elf32_Addr      p_vaddr;        /* Virtual address (not used). */
+       Elf32_Addr      p_paddr;        /* Physical address. */
+       Elf32_Size      p_filesz;       /* Size of contents in file. */
+       Elf32_Size      p_memsz;        /* Size of contents in memory. */
+       Elf32_Word      p_flags;        /* Access permission flags. */
+       Elf32_Size      p_align;        /* Alignment in memory and file. */
+} Elf32_Phdr;
+
+typedef struct {
+       Elf64_Word      p_type;         /* Entry type. */
+       Elf64_Word      p_flags;        /* Access permission flags. */
+       Elf64_Off       p_offset;       /* File offset of contents. */
+       Elf64_Addr      p_vaddr;        /* Virtual address (not used). */
+       Elf64_Addr      p_paddr;        /* Physical address. */
+       Elf64_Size      p_filesz;       /* Size of contents in file. */
+       Elf64_Size      p_memsz;        /* Size of contents in memory. */
+       Elf64_Size      p_align;        /* Alignment in memory and file. */
+} Elf64_Phdr;
+
+
+/* Dynamic section entry.  */
+
+typedef struct
+{
+       Elf32_Sword     d_tag;                  /* Dynamic entry type */
+       union
+       {
+               Elf32_Word d_val;                       /* Integer value */
+               Elf32_Addr d_ptr;                       /* Address value */
+       } d_un;
+} Elf32_Dyn;
+
+typedef struct
+{
+       Elf64_Sxword    d_tag;                  /* Dynamic entry type */
+       union
+       {
+               Elf64_Xword d_val;              /* Integer value */
+               Elf64_Addr d_ptr;               /* Address value */
+       } d_un;
+} Elf64_Dyn;
+
+/* Legal values for d_tag (dynamic entry type).  */
+
+#define DT_NULL                0               /* Marks end of dynamic section */
+#define DT_NEEDED      1               /* Name of needed library */
+#define DT_PLTRELSZ    2               /* Size in bytes of PLT relocs */
+#define DT_PLTGOT      3               /* Processor defined value */
+#define DT_HASH                4               /* Address of symbol hash table */
+#define DT_STRTAB      5               /* Address of string table */
+#define DT_SYMTAB      6               /* Address of symbol table */
+#define DT_RELA                7               /* Address of Rela relocs */
+#define DT_RELASZ      8               /* Total size of Rela relocs */
+#define DT_RELAENT     9               /* Size of one Rela reloc */
+#define DT_STRSZ       10              /* Size of string table */
+#define DT_SYMENT      11              /* Size of one symbol table entry */
+#define DT_INIT                12              /* Address of init function */
+#define DT_FINI                13              /* Address of termination function */
+#define DT_SONAME      14              /* Name of shared object */
+#define DT_RPATH       15              /* Library search path (deprecated) */
+#define DT_SYMBOLIC    16              /* Start symbol search here */
+#define DT_REL         17              /* Address of Rel relocs */
+#define DT_RELSZ       18              /* Total size of Rel relocs */
+#define DT_RELENT      19              /* Size of one Rel reloc */
+#define DT_PLTREL      20              /* Type of reloc in PLT */
+#define DT_DEBUG       21              /* For debugging; unspecified */
+#define DT_TEXTREL     22              /* Reloc might modify .text */
+#define DT_JMPREL      23              /* Address of PLT relocs */
+#define        DT_BIND_NOW     24              /* Process relocations of object */
+#define        DT_INIT_ARRAY   25              /* Array with addresses of init fct */
+#define        DT_FINI_ARRAY   26              /* Array with addresses of fini fct */
+#define        DT_INIT_ARRAYSZ 27              /* Size in bytes of DT_INIT_ARRAY */
+#define        DT_FINI_ARRAYSZ 28              /* Size in bytes of DT_FINI_ARRAY */
+#define DT_RUNPATH     29              /* Library search path */
+#define DT_FLAGS       30              /* Flags for the object being loaded */
+#define DT_ENCODING    32              /* Start of encoded range */
+#define DT_PREINIT_ARRAY 32            /* Array with addresses of preinit fct*/
+#define DT_PREINIT_ARRAYSZ 33          /* size in bytes of DT_PREINIT_ARRAY */
+#define        DT_NUM          34              /* Number used */
+#define DT_LOOS                0x6000000d      /* Start of OS-specific */
+#define DT_HIOS                0x6ffff000      /* End of OS-specific */
+#define DT_LOPROC      0x70000000      /* Start of processor-specific */
+#define DT_HIPROC      0x7fffffff      /* End of processor-specific */
+#define        DT_PROCNUM      0x32            /* Most used by any processor */
+
+/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
+   Dyn.d_un.d_val field of the Elf*_Dyn structure.  This follows Sun's
+   approach.  */
+#define DT_VALRNGLO    0x6ffffd00
+#define DT_GNU_PRELINKED 0x6ffffdf5    /* Prelinking timestamp */
+#define DT_GNU_CONFLICTSZ 0x6ffffdf6   /* Size of conflict section */
+#define DT_GNU_LIBLISTSZ 0x6ffffdf7    /* Size of library list */
+#define DT_CHECKSUM    0x6ffffdf8
+#define DT_PLTPADSZ    0x6ffffdf9
+#define DT_MOVEENT     0x6ffffdfa
+#define DT_MOVESZ      0x6ffffdfb
+#define DT_FEATURE_1   0x6ffffdfc      /* Feature selection (DTF_*).  */
+#define DT_POSFLAG_1   0x6ffffdfd      /* Flags for DT_* entries, effecting
+                                          the following DT_* entry.  */
+#define DT_SYMINSZ     0x6ffffdfe      /* Size of syminfo table (in bytes) */
+#define DT_SYMINENT    0x6ffffdff      /* Entry size of syminfo */
+#define DT_VALRNGHI    0x6ffffdff
+#define DT_VALTAGIDX(tag)      (DT_VALRNGHI - (tag))   /* Reverse order! */
+#define DT_VALNUM 12
+
+/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
+   Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
+
+   If any adjustment is made to the ELF object after it has been
+   built these entries will need to be adjusted.  */
+#define DT_ADDRRNGLO   0x6ffffe00
+#define DT_GNU_CONFLICT        0x6ffffef8      /* Start of conflict section */
+#define DT_GNU_LIBLIST 0x6ffffef9      /* Library list */
+#define DT_CONFIG      0x6ffffefa      /* Configuration information.  */
+#define DT_DEPAUDIT    0x6ffffefb      /* Dependency auditing.  */
+#define DT_AUDIT       0x6ffffefc      /* Object auditing.  */
+#define        DT_PLTPAD       0x6ffffefd      /* PLT padding.  */
+#define        DT_MOVETAB      0x6ffffefe      /* Move table.  */
+#define DT_SYMINFO     0x6ffffeff      /* Syminfo table.  */
+#define DT_ADDRRNGHI   0x6ffffeff
+#define DT_ADDRTAGIDX(tag)     (DT_ADDRRNGHI - (tag))  /* Reverse order! */
+#define DT_ADDRNUM 10
+
+/* The versioning entry types.  The next are defined as part of the
+   GNU extension.  */
+#define DT_VERSYM      0x6ffffff0
+
+#define DT_RELACOUNT   0x6ffffff9
+#define DT_RELCOUNT    0x6ffffffa
+
+/* These were chosen by Sun.  */
+#define DT_FLAGS_1     0x6ffffffb      /* State flags, see DF_1_* below.  */
+#define        DT_VERDEF       0x6ffffffc      /* Address of version definition
+                                          table */
+#define        DT_VERDEFNUM    0x6ffffffd      /* Number of version definitions */
+#define        DT_VERNEED      0x6ffffffe      /* Address of table with needed
+                                          versions */
+#define        DT_VERNEEDNUM   0x6fffffff      /* Number of needed versions */
+#define DT_VERSIONTAGIDX(tag)  (DT_VERNEEDNUM - (tag)) /* Reverse order! */
+#define DT_VERSIONTAGNUM 16
+
+/* Sun added these machine-independent extensions in the "processor-specific"
+   range.  Be compatible.  */
+#define DT_AUXILIARY    0x7ffffffd      /* Shared object to load before self */
+#define DT_FILTER       0x7fffffff      /* Shared object to get values from */
+#define DT_EXTRATAGIDX(tag)    ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
+#define DT_EXTRANUM    3
+
+/* Values of `d_un.d_val' in the DT_FLAGS entry.  */
+#define DF_ORIGIN      0x00000001      /* Object may use DF_ORIGIN */
+#define DF_SYMBOLIC    0x00000002      /* Symbol resolutions starts here */
+#define DF_TEXTREL     0x00000004      /* Object contains text relocations */
+#define DF_BIND_NOW    0x00000008      /* No lazy binding for this object */
+#define DF_STATIC_TLS  0x00000010      /* Module uses the static TLS model */
+
+/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
+   entry in the dynamic section.  */
+#define DF_1_NOW       0x00000001      /* Set RTLD_NOW for this object.  */
+#define DF_1_GLOBAL    0x00000002      /* Set RTLD_GLOBAL for this object.  */
+#define DF_1_GROUP     0x00000004      /* Set RTLD_GROUP for this object.  */
+#define DF_1_NODELETE  0x00000008      /* Set RTLD_NODELETE for this object.*/
+#define DF_1_LOADFLTR  0x00000010      /* Trigger filtee loading at runtime.*/
+#define DF_1_INITFIRST 0x00000020      /* Set RTLD_INITFIRST for this object*/
+#define DF_1_NOOPEN    0x00000040      /* Set RTLD_NOOPEN for this object.  */
+#define DF_1_ORIGIN    0x00000080      /* $ORIGIN must be handled.  */
+#define DF_1_DIRECT    0x00000100      /* Direct binding enabled.  */
+#define DF_1_TRANS     0x00000200
+#define DF_1_INTERPOSE 0x00000400      /* Object is used to interpose.  */
+#define DF_1_NODEFLIB  0x00000800      /* Ignore default lib search path.  */
+#define DF_1_NODUMP    0x00001000      /* Object can't be dldump'ed.  */
+#define DF_1_CONFALT   0x00002000      /* Configuration alternative created.*/
+#define DF_1_ENDFILTEE 0x00004000      /* Filtee terminates filters search. */
+#define        DF_1_DISPRELDNE 0x00008000      /* Disp reloc applied at build time. */
+#define        DF_1_DISPRELPND 0x00010000      /* Disp reloc applied at run-time.  */
+
+/* Flags for the feature selection in DT_FEATURE_1.  */
+#define DTF_1_PARINIT  0x00000001
+#define DTF_1_CONFEXP  0x00000002
+
+/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry.  */
+#define DF_P1_LAZYLOAD 0x00000001      /* Lazyload following object.  */
+#define DF_P1_GROUPPERM        0x00000002      /* Symbols from next object are not
+                                          generally available.  */
+
+/* Special section indices.  */
+
+#define SHN_UNDEF      0               /* Undefined section */
+#define SHN_LORESERVE  0xff00          /* Start of reserved indices */
+#define SHN_LOPROC     0xff00          /* Start of processor-specific */
+#define SHN_HIPROC     0xff1f          /* End of processor-specific */
+#define SHN_LOOS       0xff20          /* Start of OS-specific */
+#define SHN_HIOS       0xff3f          /* End of OS-specific */
+#define SHN_ABS                0xfff1          /* Associated symbol is absolute */
+#define SHN_COMMON     0xfff2          /* Associated symbol is common */
+#define SHN_XINDEX     0xffff          /* Index is in extra table.  */
+#define SHN_HIRESERVE  0xffff          /* End of reserved indices */
+
+/* Legal values for sh_type (section type).  */
+
+#define SHT_NULL         0             /* Section header table entry unused */
+#define SHT_PROGBITS     1             /* Program data */
+#define SHT_SYMTAB       2             /* Symbol table */
+#define SHT_STRTAB       3             /* String table */
+#define SHT_RELA         4             /* Relocation entries with addends */
+#define SHT_HASH         5             /* Symbol hash table */
+#define SHT_DYNAMIC      6             /* Dynamic linking information */
+#define SHT_NOTE         7             /* Notes */
+#define SHT_NOBITS       8             /* Program space with no data (bss) */
+#define SHT_REL                  9             /* Relocation entries, no addends */
+#define SHT_SHLIB        10            /* Reserved */
+#define SHT_DYNSYM       11            /* Dynamic linker symbol table */
+#define SHT_INIT_ARRAY   14            /* Array of constructors */
+#define SHT_FINI_ARRAY   15            /* Array of destructors */
+#define SHT_PREINIT_ARRAY 16           /* Array of pre-constructors */
+#define SHT_GROUP        17            /* Section group */
+#define SHT_SYMTAB_SHNDX  18           /* Extended section indeces */
+#define        SHT_NUM           19            /* Number of defined types.  */
+#define SHT_LOOS         0x60000000    /* Start OS-specific */
+#define SHT_GNU_LIBLIST          0x6ffffff7    /* Prelink library list */
+#define SHT_CHECKSUM     0x6ffffff8    /* Checksum for DSO content.  */
+#define SHT_LOSUNW       0x6ffffffa    /* Sun-specific low bound.  */
+#define SHT_SUNW_move    0x6ffffffa
+#define SHT_SUNW_COMDAT   0x6ffffffb
+#define SHT_SUNW_syminfo  0x6ffffffc
+#define SHT_GNU_verdef   0x6ffffffd    /* Version definition section.  */
+#define SHT_GNU_verneed          0x6ffffffe    /* Version needs section.  */
+#define SHT_GNU_versym   0x6fffffff    /* Version symbol table.  */
+#define SHT_HISUNW       0x6fffffff    /* Sun-specific high bound.  */
+#define SHT_HIOS         0x6fffffff    /* End OS-specific type */
+#define SHT_LOPROC       0x70000000    /* Start of processor-specific */
+#define SHT_HIPROC       0x7fffffff    /* End of processor-specific */
+#define SHT_LOUSER       0x80000000    /* Start of application-specific */
+#define SHT_HIUSER       0x8fffffff    /* End of application-specific */
+
+/* Legal values for sh_flags (section flags).  */
+
+#define SHF_WRITE           (1 << 0)   /* Writable */
+#define SHF_ALLOC           (1 << 1)   /* Occupies memory during execution */
+#define SHF_EXECINSTR       (1 << 2)   /* Executable */
+#define SHF_MERGE           (1 << 4)   /* Might be merged */
+#define SHF_STRINGS         (1 << 5)   /* Contains nul-terminated strings */
+#define SHF_INFO_LINK       (1 << 6)   /* `sh_info' contains SHT index */
+#define SHF_LINK_ORDER      (1 << 7)   /* Preserve order after combining */
+#define SHF_OS_NONCONFORMING (1 << 8)  /* Non-standard OS specific handling
+                                          required */
+#define SHF_GROUP           (1 << 9)   /* Section is member of a group.  */
+#define SHF_TLS                     (1 << 10)  /* Section hold thread-local data.  */
+#define SHF_MASKOS          0x0ff00000 /* OS-specific.  */
+#define SHF_MASKPROC        0xf0000000 /* Processor-specific */
+
+/* Section group handling.  */
+#define GRP_COMDAT     0x1             /* Mark group as COMDAT.  */
+
+/* Symbol table entry.  */
+
+typedef struct
+{
+       Elf32_Word      st_name;        /* Symbol name (string tbl index) */
+       Elf32_Addr      st_value;       /* Symbol value */
+       Elf32_Word      st_size;        /* Symbol size */
+       unsigned char   st_info;        /* Symbol type and binding */
+       unsigned char   st_other;       /* Symbol visibility */
+       Elf32_Section   st_shndx;       /* Section index */
+} Elf32_Sym;
+
+typedef struct
+{
+       Elf64_Word      st_name;        /* Symbol name (string tbl index) */
+       unsigned char   st_info;        /* Symbol type and binding */
+       unsigned char st_other;         /* Symbol visibility */
+       Elf64_Section   st_shndx;       /* Section index */
+       Elf64_Addr      st_value;       /* Symbol value */
+       Elf64_Xword     st_size;        /* Symbol size */
+} Elf64_Sym;
+
+/* Relocation table entry without addend (in section of type SHT_REL).  */
+
+typedef struct
+{
+       Elf32_Addr      r_offset;       /* Address */
+       Elf32_Word      r_info;         /* Relocation type and symbol index */
+} Elf32_Rel;
+
+/* I have seen two different definitions of the Elf64_Rel and
+   Elf64_Rela structures, so we'll leave them out until Novell (or
+   whoever) gets their act together.  */
+/* The following, at least, is used on Sparc v9, MIPS, and Alpha.  */
+
+typedef struct
+{
+       Elf64_Addr      r_offset;       /* Address */
+       Elf64_Xword     r_info;         /* Relocation type and symbol index */
+} Elf64_Rel;
+
+/* Relocation table entry with addend (in section of type SHT_RELA).  */
+
+typedef struct
+{
+       Elf32_Addr      r_offset;       /* Address */
+       Elf32_Word      r_info;         /* Relocation type and symbol index */
+       Elf32_Sword     r_addend;       /* Addend */
+} Elf32_Rela;
+
+typedef struct
+{
+       Elf64_Addr      r_offset;       /* Address */
+       Elf64_Xword     r_info;         /* Relocation type and symbol index */
+       Elf64_Sxword    r_addend;       /* Addend */
+} Elf64_Rela;
+
+/* How to extract and insert information held in the r_info field.  */
+
+#define ELF32_R_SYM(val)               ((val) >> 8)
+#define ELF32_R_TYPE(val)              ((val) & 0xff)
+#define ELF32_R_INFO(sym, type)                (((sym) << 8) + ((type) & 0xff))
+
+#define ELF64_R_SYM(i)                 ((i) >> 32)
+#define ELF64_R_TYPE(i)                        ((i) & 0xffffffff)
+#define ELF64_R_INFO(sym,type)         ((((Elf64_Xword) (sym)) << 32) + (type))
+
+
+/* Intel 80386 specific definitions.  */
+
+/* i386 relocs.  */
+
+#define R_386_NONE        0            /* No reloc */
+#define R_386_32          1            /* Direct 32 bit  */
+#define R_386_PC32        2            /* PC relative 32 bit */
+#define R_386_GOT32       3            /* 32 bit GOT entry */
+#define R_386_PLT32       4            /* 32 bit PLT address */
+#define R_386_COPY        5            /* Copy symbol at runtime */
+#define R_386_GLOB_DAT    6            /* Create GOT entry */
+#define R_386_JMP_SLOT    7            /* Create PLT entry */
+#define R_386_RELATIVE    8            /* Adjust by program base */
+#define R_386_GOTOFF      9            /* 32 bit offset to GOT */
+#define R_386_GOTPC       10           /* 32 bit PC relative offset to GOT */
+#define R_386_32PLT       11
+#define R_386_TLS_TPOFF           14           /* Offset in static TLS block */
+#define R_386_TLS_IE      15           /* Address of GOT entry for static TLS
+                                          block offset */
+#define R_386_TLS_GOTIE           16           /* GOT entry for static TLS block
+                                          offset */
+#define R_386_TLS_LE      17           /* Offset relative to static TLS
+                                          block */
+#define R_386_TLS_GD      18           /* Direct 32 bit for GNU version of
+                                          general dynamic thread local data */
+#define R_386_TLS_LDM     19           /* Direct 32 bit for GNU version of
+                                          local dynamic thread local data
+                                          in LE code */
+#define R_386_16          20
+#define R_386_PC16        21
+#define R_386_8                   22
+#define R_386_PC8         23
+#define R_386_TLS_GD_32           24           /* Direct 32 bit for general dynamic
+                                          thread local data */
+#define R_386_TLS_GD_PUSH  25          /* Tag for pushl in GD TLS code */
+#define R_386_TLS_GD_CALL  26          /* Relocation for call to
+                                          __tls_get_addr() */
+#define R_386_TLS_GD_POP   27          /* Tag for popl in GD TLS code */
+#define R_386_TLS_LDM_32   28          /* Direct 32 bit for local dynamic
+                                          thread local data in LE code */
+#define R_386_TLS_LDM_PUSH 29          /* Tag for pushl in LDM TLS code */
+#define R_386_TLS_LDM_CALL 30          /* Relocation for call to
+                                          __tls_get_addr() in LDM code */
+#define R_386_TLS_LDM_POP  31          /* Tag for popl in LDM TLS code */
+#define R_386_TLS_LDO_32   32          /* Offset relative to TLS block */
+#define R_386_TLS_IE_32           33           /* GOT entry for negated static TLS
+                                          block offset */
+#define R_386_TLS_LE_32           34           /* Negated offset relative to static
+                                          TLS block */
+#define R_386_TLS_DTPMOD32 35          /* ID of module containing symbol */
+#define R_386_TLS_DTPOFF32 36          /* Offset in TLS block */
+#define R_386_TLS_TPOFF32  37          /* Negated offset in static TLS block */
+/* Keep this the last entry.  */
+#define R_386_NUM         38
+
+#endif /* ASSEMBLY */
+
+#endif /* ELF_H */
diff --exclude=CVS -uNr memtest86-3.0/init.c memtest86/init.c
--- memtest86-3.0/init.c        Tue May 21 16:52:37 2002
+++ memtest86/init.c    Sun Aug 17 04:02:42 2003
@@ -11,7 +11,6 @@
 #include "pci.h"
 #include "io.h"
 
-extern struct vars *v;
 extern short memsz_mode;
 extern short firmware;
 
@@ -47,7 +46,7 @@
        for(i=0, pp=(char *)(SCREEN_ADR+1); i<TITLE_WIDTH; i++, pp+=2) {
                *pp = 0x47;
        }
-       cprint(0, 0, "      Memtest-86 v3.0       ");
+       cprint(0, 0, "      Memtest-86 v3.0.eb2   ");
 
        /* Do reverse video for the bottom display line */
        for(i=0, pp=(char *)(SCREEN_ADR+1+(24 * 160)); i<80; i++, pp+=2) {
@@ -82,7 +81,6 @@
                        firmware = FIRMWARE_PCBIOS;
                }
        }
-
        mem_size();
 
        /* setup pci */
@@ -402,6 +400,16 @@
                        }
                        l1_cache = cpu_id.cache_info[3];
                        l1_cache += cpu_id.cache_info[7];
+                       break;
+               case 15:
+                       /* FIXME distinguish between the Opteron and Athlon64 */ 
+                       cprint(LINE_CPU, 0, "AMD Opteron");
+                       off = 11;
+                       l1_cache = cpu_id.cache_info[3];
+                       l1_cache += cpu_id.cache_info[7];
+                       l2_cache = (cpu_id.cache_info[11] << 8);
+                       l2_cache += cpu_id.cache_info[10];
+                       break;
                }
                break;
 
@@ -665,21 +673,40 @@
 static void cacheable(void)
 {
        ulong speed, pspeed;
-       ulong paddr, mem_top, cache_top;
+       ulong paddr, mem_top, cached;
 
        mem_top = v->pmap[v->msegs - 1].end;
-       cache_top = mem_top;
+       cached = v->test_pages;
        pspeed = 0;
        for (paddr=0x200; paddr <= mem_top - 64; paddr+=0x400) {
+               int i;
+               int found;
+               /* See if the paddr is at a testable location */
+               found = 0;
+               for(i = 0; i < v->msegs; i++) {
+                       if ((v->pmap[i].start >= paddr)  &&
+                               (v->pmap[i].end <= (paddr + 32))) {
+                               found = 1;
+                               break;
+                       }
+               }
+               if (!found) {
+                       continue;
+               }
+               /* Map the range and perform the test */
+               map_page(paddr);
                speed = memspeed((ulong)mapping(paddr), 32*4096, 1);
                if (pspeed) {
                        if (speed < pspeed) {
-                               cache_top = paddr;
+                               cached -= 32;
                        }
                        pspeed = (ulong)((float)speed * 0.7);
                }
        }
-       aprint(LINE_INFO, COL_CACHE_TOP, cache_top);
+       aprint(LINE_INFO, COL_CACHE_TOP, cached);
+       /* Ensure the default set of pages are mapped */
+       map_page(0);
+       map_page(0x80000);
 }
 
 
diff --exclude=CVS -uNr memtest86-3.0/lib.c memtest86/lib.c
--- memtest86-3.0/lib.c Tue May 21 17:12:07 2002
+++ memtest86/lib.c     Sat Aug 16 22:39:41 2003
@@ -9,8 +9,6 @@
 #include "config.h"
 #include "screen_buffer.h"
 
-extern struct vars *v;
-
 int slock = 0, lsr = 0;
 short serial_cons = SERIAL_CONSOLE_DEFAULT;
 char buf[18];
@@ -641,12 +639,16 @@
        serial_echo_print(p);
 }
 
+#if defined(SERIAL_BAUD_RATE)
+
 #if ((115200%SERIAL_BAUD_RATE) != 0)
 #error Bad ttys0 baud rate
 #endif
 
 #define SERIAL_DIV     (115200/SERIAL_BAUD_RATE)
 
+#endif /* SERIAL_BAUD_RATE */
+
 void serial_echo_init(void)
 {
        int comstat, hi, lo;
@@ -660,10 +662,12 @@
 
        /* now do hardwired init */
        serial_echo_outb(0x03, UART_LCR); /* No parity, 8 data bits, 1 stop */
+#if defined(SERIAL_BAUD_RATE)
        serial_echo_outb(0x83, UART_LCR); /* Access divisor latch */
        serial_echo_outb(SERIAL_DIV & 0xff, UART_DLL);  /* baud rate divisor */
        serial_echo_outb((SERIAL_DIV>> 8) & 0xff, UART_DLM);
        serial_echo_outb(0x03, UART_LCR); /* Done with divisor */
+#endif
 
        /* Prior to disabling interrupts, read the LSR and RBR
         * registers */
diff --exclude=CVS -uNr memtest86-3.0/linuxbios_tables.h memtest86/linuxbios_tables.h
--- memtest86-3.0/linuxbios_tables.h    Fri Apr 19 11:47:50 2002
+++ memtest86/linuxbios_tables.h        Sat Aug 16 23:03:00 2003
@@ -1,7 +1,7 @@
 #ifndef LINUXBIOS_TABLES_H
 #define LINUXBIOS_TABLES_H
 
-#include <stdint.h>
+#include "stdint.h"
 
 /* The linuxbios table information is for conveying information
  * from the firmware to the loaded OS image.  Primarily this
diff --exclude=CVS -uNr memtest86-3.0/memsize.c memtest86/memsize.c
--- memtest86-3.0/memsize.c     Tue May 21 15:07:01 2002
+++ memtest86/memsize.c Sun Aug 17 03:53:09 2003
@@ -20,6 +20,7 @@
 extern volatile ulong *p;
 
 static void sort_pmap(void);
+static void sanitize_pmap(void);
 static int check_ram(void);
 static void memsize_bios(int res);
 static void memsize_820(int res);
@@ -70,6 +71,7 @@
        }
        /* Guarantee that pmap entries are in ascending order */
        sort_pmap();
+       sanitize_pmap();
        v->plim_lower = 0;
        v->plim_upper = v->pmap[v->msegs-1].end;
 
@@ -111,6 +113,60 @@
                }
        }
 }
+
+static void remove_pmap_region(unsigned long res_start, unsigned long res_end)
+{
+       /* Ensure a range of addresses is absent from the pmap */
+       int i;
+       for(i = 0; i < v->msegs; i++) {
+               unsigned long start, end;
+               start = v->pmap[i].start;
+               end = v->pmap[i].end;
+               if ((start < res_start) && (end > res_start)) {
+                       /* If the tail of the range overlaps the region, truncate it */
+                       v->pmap[i].end = res_start;
+                       if ((end > res_end) && (v->msegs < MAX_MEM_SEGMENTS)) {
+                               /* If the tail extends past the end of the region
+                                * insert a new pmap entry for the tail.
+                                */
+                               memmove(&v->pmap[i+2], &v->pmap[i + 1],
+                                       ((v->msegs - 1) - i) *sizeof(v->pmap[0]));
+                               v->msegs += 1;
+                               i += 1;
+                               start = res_start;
+                               v->pmap[i].start = start;
+                               v->pmap[i].end = end;
+                       }
+                       else {
+                               end = res_start;
+                       }
+               }
+               if ((start >= res_start) && (end <= res_end)) {
+                       /* If the range is completely contained in the region remove 
it */
+                       memmove(&v->pmap[i], &v->pmap[i+1],
+                               ((v->msegs - 1) - i) * sizeof(v->pmap[0]));
+                       v->msegs -= 1;
+                       i -= 1;
+               }
+               else if ((start < res_end) && (end > res_end)) {
+                       /* If the start is in the middle of the region increment it */
+                       start = res_end;
+                       v->pmap[i].start = start;
+               }
+       }
+}
+
+static void sanitize_pmap(void)
+{
+       /* Remove any questionable addresses from the memory map */
+       /* Unless we really trust the BIOS don't test 640-1M */
+       if (firmware != FIRMWARE_LINUXBIOS) {
+               remove_pmap_region(RES_START >> 12 , (RES_END + 4095) >> 12);
+       }
+       /* Never test where our video buffer lives */
+       remove_pmap_region(SCREEN_ADR >> 12, (SCREEN_END_ADR  + 4095) >> 12);
+}
+
 static void memsize_linuxbios(void)
 {
        int i, n;
@@ -155,16 +211,6 @@
                        start = nm[i].addr;
                        end = start + nm[i].size;
 
-                       /* Don't ever use memory between 640 and 1024k */
-                       if (start > RES_START && start < RES_END) {
-                               if (end < RES_END) {
-                                       continue;
-                               }
-                               start = RES_END;
-                       }
-                       if (end > RES_START && end < RES_END) {
-                               end = RES_START;
-                       }
                        v->pmap[n].start = (start + 4095) >> 12;
                        v->pmap[n].end = end >> 12;
                        v->test_pages += v->pmap[n].end - v->pmap[n].start;
diff --exclude=CVS -uNr memtest86-3.0/memtest_shared.lds memtest86/memtest_shared.lds
--- memtest86-3.0/memtest_shared.lds    Mon Apr 22 00:11:15 2002
+++ memtest86/memtest_shared.lds        Sun Aug 17 02:26:29 2003
@@ -20,11 +20,11 @@
        .hash       : { *(.hash) }
        .dynamic    : { *(.dynamic) }
 
-       .rel.text   : { *(.rel.text) }
-       .rel.rodata : { *(.rel.rodata) }
-       .rel.data   : { *(.rel.data) }
-       .rel.got    : { *(.rel.got) }
-       .rel.plt    : { *(.rel.plt) }
+       .rel.text    : { *(.rel.text   .rel.text.*) }
+       .rel.rodata  : { *(.rel.rodata .rel.rodata.*) }
+       .rel.data    : { *(.rel.data   .rel.data.*) }
+       .rel.got     : { *(.rel.got    .rel.got.*) }
+       .rel.plt     : { *(.rel.plt    .rel.plt.*) }
 
        . = ALIGN(4);
        .data : {
diff --exclude=CVS -uNr memtest86-3.0/patn.c memtest86/patn.c
--- memtest86-3.0/patn.c        Wed Oct 17 17:30:32 2001
+++ memtest86/patn.c    Sat Aug 16 22:39:55 2003
@@ -18,9 +18,6 @@
 #define DEFAULT_MASK ((~0L) << 2)
 
 
-extern struct vars *v;
-
-
 /* What it does:
  *  - Keep track of a number of BadRAM patterns in an array;
  *  - Combine new faulty addresses with it whenever possible;
Binary files memtest86-3.0/precomp.bin and memtest86/precomp.bin differ
diff --exclude=CVS -uNr memtest86-3.0/reloc.c memtest86/reloc.c
--- memtest86-3.0/reloc.c       Mon Apr 15 12:54:01 2002
+++ memtest86/reloc.c   Sat Aug 16 23:23:10 2003
@@ -1,7 +1,7 @@
 #include <stddef.h>
-#include <stdint.h>
-#include <elf.h>
 #include <string.h>
+#include "stdint.h"
+#include "elf.h"
 
 #define __ELF_NATIVE_CLASS 32
 #define ELF_MACHINE_NO_RELA 1
@@ -68,7 +68,7 @@
 {
        Elf32_Addr ls_addr, s_addr;
        Elf32_Addr value;
-       if (ELF32_R_TYPE (reloc->r_info) == R_386_RELATIVE)
+       if (ELF32_R_TYPE (reloc->r_info) == R_386_RELATIVE) 
        {
                *reloc_addr += map->l_addr - map->ll_addr;
                return;
diff --exclude=CVS -uNr memtest86-3.0/stdint.h memtest86/stdint.h
--- memtest86-3.0/stdint.h      Wed Dec 31 17:00:00 1969
+++ memtest86/stdint.h  Sat Aug 16 23:02:10 2003
@@ -0,0 +1,52 @@
+#ifndef I386_STDINT_H
+#define I386_STDINT_H
+
+/* Exact integral types */
+typedef unsigned char      uint8_t;
+typedef signed char        int8_t; 
+
+typedef unsigned short     uint16_t;
+typedef signed short       int16_t;
+
+typedef unsigned int       uint32_t;
+typedef signed int         int32_t;
+
+typedef unsigned long long uint64_t;
+typedef signed long long   int64_t;
+
+/* Small types */
+typedef unsigned char      uint_least8_t;
+typedef signed char        int_least8_t; 
+
+typedef unsigned short     uint_least16_t;
+typedef signed short       int_least16_t;
+
+typedef unsigned int       uint_least32_t;
+typedef signed int         int_least32_t;
+
+typedef unsigned long long uint_least64_t;
+typedef signed long long   int_least64_t;
+
+/* Fast Types */
+typedef unsigned char      uint_fast8_t;
+typedef signed char        int_fast8_t; 
+
+typedef unsigned int       uint_fast16_t;
+typedef signed int         int_fast16_t;
+
+typedef unsigned int       uint_fast32_t;
+typedef signed int         int_fast32_t;
+
+typedef unsigned long long uint_fast64_t;
+typedef signed long long   int_fast64_t;
+
+/* Types for `void *' pointers.  */
+typedef int                intptr_t;
+typedef unsigned int       uintptr_t;
+
+/* Largest integral types */
+typedef long long int      intmax_t;
+typedef unsigned long long uintmax_t;
+
+
+#endif /* I386_STDINT_H */
diff --exclude=CVS -uNr memtest86-3.0/test.c memtest86/test.c
--- memtest86-3.0/test.c        Tue May 21 17:13:32 2002
+++ memtest86/test.c    Thu Jan 30 17:20:16 2003
@@ -9,7 +9,6 @@
 extern int segs, bail;
 extern volatile ulong *p;
 extern ulong p1, p2;
-extern struct vars *v;
 extern int test_ticks, nticks;
 extern struct tseq tseq[];
 void poll_errors();
@@ -1282,7 +1281,7 @@
  * Print an ecc error
  */
 void print_ecc_err(unsigned long page, unsigned long offset, 
-       int corrected, unsigned char syndrom, int channel)
+       int corrected, unsigned short syndrome, int channel)
 {
        update_err_counts();
        ++(v->ecc_ecount);
@@ -1293,7 +1292,7 @@
 
        cprint(v->msg_line, 36, 
                corrected?"corrected           ": "uncorrected         ");
-       hprint2(v->msg_line, 56, syndrom, 2);
+       hprint2(v->msg_line, 56, syndrome, 4);
        cprint(v->msg_line, 66, "ECC"); 
        dprint(v->msg_line, 71, channel, 2, 0);
 }
diff --exclude=CVS -uNr memtest86-3.0/test.h memtest86/test.h
--- memtest86-3.0/test.h        Tue May 21 15:06:16 2002
+++ memtest86/test.h    Sun Aug 17 04:04:33 2003
@@ -44,6 +44,7 @@
 #define RES_START      0xa0000
 #define RES_END                0x100000
 #define SCREEN_ADR     0xb8000
+#define SCREEN_END_ADR  (SCREEN_ADR + 80*25*2)
 
 #define TITLE_WIDTH    28
 #define LINE_TIME      9
@@ -129,7 +130,7 @@
 void find_ticks(void);
 void print_err(ulong *adr, ulong good, ulong bad, ulong xor);
 void print_ecc_err(ulong page, ulong offset, int corrected, 
-       unsigned char syndrom, int channel);
+       unsigned short syndrome, int channel);
 void mem_size(void);
 void adj_mem(void);
 ulong getval(int x, int y, int result_shift);

_______________________________________________
Linuxbios mailing list
[EMAIL PROTECTED]
http://www.clustermatic.org/mailman/listinfo/linuxbios

Reply via email to