diff --git a/fix-overflows.diff b/fix-overflows.diff new file mode 100644 index 0000000..c338449 --- /dev/null +++ b/fix-overflows.diff @@ -0,0 +1,341 @@ +diff -urp memtest86+-2.01.mm/io.h memtest86+-2.01/io.h +--- memtest86+-2.01.mm/io.h 2008-02-21 12:26:05.000000000 +0100 ++++ memtest86+-2.01/io.h 2008-04-30 12:32:34.787275000 +0200 +@@ -31,7 +31,7 @@ + */ + + #define __OUT1(s,x) \ +-extern inline void __out##s(unsigned x value, unsigned short port) { ++static inline void __out##s(unsigned x value, unsigned short port) { + + #define __OUT2(s,s1,s2) \ + __asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1" +@@ -43,7 +43,7 @@ __OUT1(s##_p,x) __OUT2(s,s1,"w") : : "a" + __OUT1(s##c_p,x) __OUT2(s,s1,"") : : "a" (value), "id" (port)); SLOW_DOWN_IO; } + + #define __IN1(s) \ +-extern inline RETURN_TYPE __in##s(unsigned short port) { RETURN_TYPE _v; ++static inline RETURN_TYPE __in##s(unsigned short port) { RETURN_TYPE _v; + + #define __IN2(s,s1,s2) \ + __asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0" +@@ -55,7 +55,7 @@ __IN1(s##_p) __IN2(s,s1,"w") : "=a" (_v) + __IN1(s##c_p) __IN2(s,s1,"") : "=a" (_v) : "id" (port) ,##i ); SLOW_DOWN_IO; return _v; } + + #define __OUTS(s) \ +-extern inline void outs##s(unsigned short port, const void * addr, unsigned long count) \ ++static inline void outs##s(unsigned short port, const void * addr, unsigned long count) \ + { __asm__ __volatile__ ("cld ; rep ; outs" #s \ + : "=S" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); } + +diff -urp memtest86+-2.01.mm/test.c memtest86+-2.01/test.c +--- memtest86+-2.01.mm/test.c 2008-02-21 12:26:05.000000000 +0100 ++++ memtest86+-2.01/test.c 2008-04-30 14:15:56.666389000 +0200 +@@ -25,6 +25,22 @@ void poll_errors(); + + int ecount = 0; + ++static inline volatile ulong * sat_add(volatile ulong *ptr, ulong i, volatile ulong *end) ++{ ++ if ((ulong)ptr + i * sizeof(*ptr) > (ulong)ptr) ++ return ptr + i; ++ else ++ return end; ++} ++ ++static inline volatile ulong * sat_sub(volatile ulong *ptr, ulong i, volatile ulong *start) ++{ ++ if ((ulong)ptr > i * sizeof(*ptr)) ++ return ptr - i; ++ else ++ return start; ++} ++ + static inline ulong roundup(ulong value, ulong mask) + { + return (value + mask) & ~mask; +@@ -150,11 +166,7 @@ void addr_tst2() + done = 0; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; +@@ -194,11 +206,7 @@ void addr_tst2() + done = 0; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; +@@ -280,11 +288,7 @@ void movinvr() + done = 0; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; +@@ -331,11 +335,7 @@ void movinvr() + done = 0; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; +@@ -419,7 +419,8 @@ void movinv1(int iter, ulong p1, ulong p + hprint(LINE_PAT, COL_PAT, p1); + + /* Initialize memory with the initial pattern. */ +- for (j=0; jmap[j].start; + end = v->map[j].end; + pe = start; +@@ -427,11 +428,7 @@ void movinv1(int iter, ulong p1, ulong p + done = 0; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; +@@ -440,17 +437,19 @@ void movinv1(int iter, ulong p1, ulong p + if (p == pe ) { + break; + } +-/* Original C code replaced with hand tuned assembly code +- * for (; p < pe; p++) { +- * *p = p1; +- * } +- */ ++/* Original C code replaced with hand tuned assembly code */ ++#if 0 ++ for (; p < pe; p++) { ++ *p = p1; ++ } ++#else + asm __volatile__ ( + "rep\n\t" \ + "stosl\n\t" + : "=D" (p) + : "c" (len), "0" (p), "a" (p1) + ); ++#endif + do_tick(); + BAILR + } while (!done); +@@ -460,7 +459,8 @@ void movinv1(int iter, ulong p1, ulong p + * write the complement for each memory location. Test from bottom + * up and then from the top down. */ + for (i=0; imap[j].start; + end = v->map[j].end; + pe = start; +@@ -468,11 +468,7 @@ void movinv1(int iter, ulong p1, ulong p + done = 0; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; +@@ -480,14 +476,16 @@ void movinv1(int iter, ulong p1, ulong p + if (p == pe ) { + break; + } +-/* Original C code replaced with hand tuned assembly code +- * for (; p < pe; p++) { +- * if ((bad=*p) != p1) { +- * error((ulong*)p, p1, bad); +- * } +- * *p = p2; +- * } +- */ ++/* Original C code replaced with hand tuned assembly code */ ++#if 0 ++ for (; p < pe; p++) { ++ ulong bad; ++ if ((bad=*p) != p1) { ++ error((ulong*)p, p1, bad); ++ } ++ *p = p2; ++ } ++#else + asm __volatile__ ( + "jmp L2\n\t" \ + +@@ -522,10 +520,12 @@ void movinv1(int iter, ulong p1, ulong p + : "a" (p1), "0" (p), "d" (pe), "b" (p2) + : "ecx" + ); ++#endif + do_tick(); + BAILR + } while (!done); + } ++ + for (j=segs-1; j>=0; j--) { + start = v->map[j].start; + end = v->map[j].end; +@@ -534,11 +534,7 @@ void movinv1(int iter, ulong p1, ulong p + done = 0; + do { + /* Check for underflow */ +- if (pe - SPINSZ < pe) { +- pe -= SPINSZ; +- } else { +- pe = start; +- } ++ pe = sat_sub(pe, SPINSZ, start); + if (pe <= start) { + pe = start; + done++; +@@ -546,14 +542,16 @@ void movinv1(int iter, ulong p1, ulong p + if (p == pe ) { + break; + } +-/* Original C code replaced with hand tuned assembly code +- * do { +- * if ((bad=*p) != p2) { +- * error((ulong*)p, p2, bad); +- * } +- * *p = p1; +- * } while (p-- > pe); +- */ ++/* Original C code replaced with hand tuned assembly code */ ++#if 0 ++ do { ++ ulong bad; ++ if ((bad=*p) != p2) { ++ error((ulong*)p, p2, bad); ++ } ++ *p = p1; ++ } while (p-- > pe); ++#else + asm __volatile__ ( + "addl $4, %%edi\n\t" + "jmp L9\n\t" +@@ -590,6 +588,7 @@ void movinv1(int iter, ulong p1, ulong p + : "a" (p1), "0" (p), "d" (pe), "b" (p2) + : "ecx" + ); ++#endif + do_tick(); + BAILR + } while (!done); +@@ -623,11 +622,7 @@ void movinv32(int iter, ulong p1, ulong + pat = p1; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; +@@ -685,11 +680,7 @@ void movinv32(int iter, ulong p1, ulong + pat = p1; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; +@@ -798,11 +789,7 @@ void movinv32(int iter, ulong p1, ulong + done = 0; + do { + /* Check for underflow */ +- if (pe - SPINSZ < pe) { +- pe -= SPINSZ; +- } else { +- pe = start; +- } ++ pe = sat_sub(pe, SPINSZ, start); + if (pe <= start) { + pe = start; + done++; +@@ -906,11 +893,7 @@ void modtst(int offset, int iter, ulong + done = 0; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; +@@ -951,11 +934,7 @@ void modtst(int offset, int iter, ulong + k = 0; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; +@@ -1009,11 +988,7 @@ void modtst(int offset, int iter, ulong + done = 0; + do { + /* Check for overflow */ +- if (pe + SPINSZ > pe) { +- pe += SPINSZ; +- } else { +- pe = end; +- } ++ pe = sat_add(pe, SPINSZ, end); + if (pe >= end) { + pe = end; + done++; diff --git a/memtest86+-1.70.tar.gz b/memtest86+-1.70.tar.gz deleted file mode 100644 index e30e837..0000000 --- a/memtest86+-1.70.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc6d244572f2a030a74cfef78b6e4b58d5f230597b4f80e4581c1373182492eb -size 150198 diff --git a/memtest86+-2.01.tar.gz b/memtest86+-2.01.tar.gz new file mode 100644 index 0000000..cd6e3e6 --- /dev/null +++ b/memtest86+-2.01.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35ad452f4fd12f07756abccccf1bce70d42596c2c5e9c29247ffc8e0b76bd1ae +size 165984 diff --git a/memtest86+.changes b/memtest86+.changes index a4b889e..061d31f 100644 --- a/memtest86+.changes +++ b/memtest86+.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Wed Apr 30 14:45:38 CEST 2008 - coolo@suse.de + +- update to 2.01 - among others: + - Solved a major bug in Memory Address Errors Reporting + - Patched for Intel-Powered Mac + - Pass duration 20% reduced + - Solved a incoherency with pass progress indicator + - Added support for 45 nm Mobile Core 2 w/ 3 Mo L2 + - Corrected Intel 3-Series (P35/X38) chipset init +- fix buffer overflows (bnc#359490) from Michael Matz + ------------------------------------------------------------------- Fri Aug 10 12:57:40 CEST 2007 - duwe@suse.de diff --git a/memtest86+.spec b/memtest86+.spec index 4b33f76..9b66396 100644 --- a/memtest86+.spec +++ b/memtest86+.spec @@ -1,7 +1,7 @@ # -# spec file for package memtest86+ (Version 1.70) +# spec file for package memtest86+ (Version 2.01) # -# Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany. # This file and all modifications and additions to the pristine # package are under the same license as the package itself. # @@ -9,28 +9,31 @@ # + Name: memtest86+ -Version: 1.70 -Release: 31 +Version: 2.01 +Release: 1 # License: BSD 3-Clause Group: System/Boot # BuildRoot: %{_tmppath}/%{name}-%{version}-build +BuildRequires: cdrkit-cdrtools-compat %ifarch x86_64 BuildRequires: glibc-devel-32bit %endif -ExclusiveArch: %ix86 x86_64 +ExclusiveArch: %ix86 x86_64 Provides: lilo:/boot/memtest.bin Obsoletes: memtest86 <= 3.2 Provides: memtest86 > 3.2 # -URL: http://www.memtest.org +Url: http://www.memtest.org Source: http://www.memtest.org/download/%{version}/%{name}-%{version}.tar.gz Patch0: fix-destdir Patch1: include-linkonce Patch2: serial-enable Patch3: include-gnuhash +Patch4: fix-overflows.diff # Summary: Memory Testing Image for x86 Architecture @@ -59,6 +62,7 @@ Authors: %patch1 -p1 %patch2 -p1 %patch3 -p1 +%patch4 -p1 %build %ifarch x86_64 @@ -86,14 +90,23 @@ test -x /sbin/update-bootloader && /sbin/update-bootloader --remove --force --im %doc README* changelog FAQ %changelog -* Fri Aug 10 2007 - duwe@suse.de +* Wed Apr 30 2008 coolo@suse.de +- update to 2.01 - among others: + - Solved a major bug in Memory Address Errors Reporting + - Patched for Intel-Powered Mac + - Pass duration 20%% reduced + - Solved a incoherency with pass progress indicator + - Added support for 45 nm Mobile Core 2 w/ 3 Mo L2 + - Corrected Intel 3-Series (P35/X38) chipset init +- fix buffer overflows (bnc#359490) from Michael Matz +* Fri Aug 10 2007 duwe@suse.de - Do not fail to install if update-bootloader is not there. -* Thu Aug 09 2007 - duwe@suse.de +* Thu Aug 09 2007 duwe@suse.de - Add memtest86+ to boot menu even if installed later (Feature #301969) -* Mon Feb 19 2007 - trenn@suse.de +* Mon Feb 19 2007 trenn@suse.de - added .gnu.hash section -* Thu Jan 25 2007 - duwe@suse.de +* Thu Jan 25 2007 duwe@suse.de + update to 1.70: - Added new DMI polling feature (Thanks to Joachim D.) - Added Support for Core/Core2 Solo/Duo/Quad CPU @@ -107,7 +120,7 @@ test -x /sbin/update-bootloader && /sbin/update-bootloader --remove --force --im - Added Support for Intel i975X - Added Support for Intel Q965/P965 - Added Support for Intel Q963/Q965 -* Thu Nov 16 2006 - mrueckert@suse.de +* Thu Nov 16 2006 mrueckert@suse.de - switch to memtest86+ (http://www.memtest.org) Compared to memtest86 3.2 it supports more hardware. and has additional fixes. see http://www.memtest.org/#change for all @@ -121,41 +134,41 @@ test -x /sbin/update-bootloader && /sbin/update-bootloader --remove --force --im - cleaned up build section and directly use install instead of the broken install target - added changelog and FAQ to the docs -* Wed Jan 25 2006 - mls@suse.de +* Wed Jan 25 2006 mls@suse.de - converted neededforbuild to BuildRequires -* Tue May 10 2005 - duwe@suse.de +* Tue May 10 2005 duwe@suse.de - include *.gnu.linkonce.t.* sections in ld script, to build cleanly on amd64 with gcc4 -* Mon Mar 14 2005 - duwe@suse.de +* Mon Mar 14 2005 duwe@suse.de - update to current version 3.2: more support for current CPUs and chipsets fix Bugs #60303 (duped #72202), #71215 -* Mon Mar 22 2004 - stepan@suse.de +* Mon Mar 22 2004 stepan@suse.de - update to 3.1a. This fixes compilation with gcc 3.x - drop precompiled binary completely - add ExclusiveArch for x86 and AMD64 -* Fri Mar 19 2004 - stepan@suse.de +* Fri Mar 19 2004 stepan@suse.de - update to v3.1 - remove gcc 2.95 exceptions -* Sun Sep 08 2002 - kukuk@suse.de +* Sun Sep 08 2002 kukuk@suse.de - Add splitt alias [Bug #19111] -* Thu Sep 05 2002 - garloff@suse.de +* Thu Sep 05 2002 garloff@suse.de - memtest86-3.0 seems to hang on some machines if the serial console support is enabled, but no serial console connected. Add a timeout waiting for the serial console. (Bug #18302) -* Mon Sep 02 2002 - garloff@suse.de +* Mon Sep 02 2002 garloff@suse.de - Supply complete image (compiled by gcc-2.95), as I don't succeed solving the gcc-3.2 problems at this moment. (#18302) -* Sat Aug 31 2002 - garloff@suse.de +* Sat Aug 31 2002 garloff@suse.de - Supply main.s compiled with gcc-2.95 to work around problem with gcc-3.2. -* Tue Jul 30 2002 - garloff@suse.de +* Tue Jul 30 2002 garloff@suse.de - Split off lilo package. -* Tue Jul 30 2002 - sf@suse.de +* Tue Jul 30 2002 sf@suse.de - added -m32 to compiler and linker for x86_64 - added --32 to as - added glibc-devel-32bit for x86_64 -* Fri Jun 07 2002 - garloff@suse.de +* Fri Jun 07 2002 garloff@suse.de - Update to memtest86-3.0: * Testing more than 2GB should work now. * Use PIC instead of two copies @@ -163,15 +176,15 @@ test -x /sbin/update-bootloader && /sbin/update-bootloader --remove --force --im * ^l/l gives screen refresh (after connecting serial console) * Netbooting operational again * LinuxBIOS support (memory sizing) -* Mon Apr 22 2002 - garloff@suse.de +* Mon Apr 22 2002 garloff@suse.de - Update to memtest86-2.9: * Provide three memory sizing modes; default is conservative one probably not testing all memory on some boards * Testing more than 2GB supported * Memory testing in segments. Minor bug fixes. -* Fri Feb 15 2002 - mantel@suse.de +* Fri Feb 15 2002 mantel@suse.de - remove x bit from memtest.bin since it's not a Linux executable -* Wed Dec 12 2001 - garloff@suse.de +* Wed Dec 12 2001 garloff@suse.de - Update to memtest86-2.8(a): * Reworked build process; a network bootable boot image can be produced @@ -180,13 +193,13 @@ test -x /sbin/update-bootloader && /sbin/update-bootloader --remove --force --im * Serial console disabled by default - Reenabled memtest86 serial console (9600 8n1) ;-) - Clean up .spec file a bit -* Mon Jul 16 2001 - uli@suse.de +* Mon Jul 16 2001 uli@suse.de - update memtest -> 2.7 -* Mon Apr 09 2001 - garloff@suse.de +* Mon Apr 09 2001 garloff@suse.de - memtest86: Correct units (cosmetic) -* Thu Dec 21 2000 - garloff@suse.de +* Thu Dec 21 2000 garloff@suse.de - Update memtest86 to v2.5 final. -* Wed Nov 29 2000 - garloff@suse.de +* Wed Nov 29 2000 garloff@suse.de - Update memtest86 to v2.5-beta (Athlon/Duron support) -* Mon Aug 28 2000 - garloff@suse.de +* Mon Aug 28 2000 garloff@suse.de - Added memtest86-2.4. diff --git a/serial-enable b/serial-enable index 3560d53..188e505 100644 --- a/serial-enable +++ b/serial-enable @@ -1,6 +1,5 @@ -diff -ur memtest86+-1.70.orig/config.h memtest86+-1.70/config.h ---- memtest86+-1.70.orig/config.h 2006-12-27 02:33:06.000000000 +0100 -+++ memtest86+-1.70/config.h 2007-01-25 16:34:01.000000000 +0100 +--- memtest86+-2.01/config.h ++++ memtest86+-2.01/config.h @@ -13,7 +13,7 @@ /* SERIAL_CONSOLE_DEFAULT - The default state of the serial console. */ /* This is normally off since it slows down testing. Change to a 1 */ @@ -8,20 +7,19 @@ diff -ur memtest86+-1.70.orig/config.h memtest86+-1.70/config.h -#define SERIAL_CONSOLE_DEFAULT 0 +#define SERIAL_CONSOLE_DEFAULT 1 - /* SERIAL_BAUD_RATE - Baud rate for the serial console */ - #define SERIAL_BAUD_RATE 9600 -diff -ur memtest86+-1.70.orig/init.c memtest86+-1.70/init.c ---- memtest86+-1.70.orig/init.c 2007-01-04 08:19:43.000000000 +0100 -+++ memtest86+-1.70/init.c 2007-01-25 16:34:31.000000000 +0100 -@@ -29,6 +29,7 @@ - static void cpu_type(void); + /* SERIAL_TTY - The default serial port to use. 0=ttyS0, 1=ttyS1 */ + #define SERIAL_TTY 0 +--- memtest86+-2.01/init.c ++++ memtest86+-2.01/init.c +@@ -40,6 +40,7 @@ static void cacheable(void); static int cpuspeed(void); + int beepmode; +extern short serial_cons; static void display_init(void) { -@@ -65,6 +66,9 @@ +@@ -76,6 +77,9 @@ } serial_echo_print("\x1B[0m"); @@ -31,11 +29,10 @@ diff -ur memtest86+-1.70.orig/init.c memtest86+-1.70/init.c } /* -diff -ur memtest86+-1.70.orig/serial.h memtest86+-1.70/serial.h ---- memtest86+-1.70.orig/serial.h 2006-12-27 02:33:06.000000000 +0100 -+++ memtest86+-1.70/serial.h 2007-01-25 16:34:31.000000000 +0100 +--- memtest86+-2.01/serial.h ++++ memtest86+-2.01/serial.h @@ -140,10 +140,12 @@ - #define serial_echo_inb(a) inb((a)+0x3f8) + #define serial_echo_inb(a) inb((a)+serial_base_ports[serial_tty]) #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) /* Wait for transmitter & holding register to empty */ -#define WAIT_FOR_XMITR \