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