From: Bert.Sainz@f55.n135.z1.fidonet.org (Bert Sainz)
Newsgroups: comp.os.linux
Subject: AMD386 vs. Intel386 & external cache problems
Date: Sat, 15 Aug 1992 13:50:18 -0800

 > From: herr@hp11.iti.informatik.th-darmstadt.de (Gabor Herr)
 >
 > Hello Linuxers,
 >
 > two weeks ago I posted to this newsgroup, that I had problems with
my
 > new 386
 > motherboard (AMD386, 40MHz, ETEQ Cougar chipset, 64KB cache, 8MB
 > memory).
 > Running Linux on it, from time to time some processes or even
 > the kernel died with a signal SIGSEGV, which was caused by a
`general
 > protection
 > error'. After turning off the onboard external cache everything
 > workedfine.
 >
 > To localize the error and make it reproducible I tested the machine
 > with the following two endless loops under Linux 0.96cp2:
 >

Your message rang a bell. In the last few days a message was posted in
the 
C_ECHO conference of FidoNet that might shed some light on your
problems. I 
can't help beyond posting this. Please note the data file is missing and

would have to be downloaded from the PKWare bbs.

Please note the similarity between your statement that when cache is
turned 
off the problems disappear and a similar statement in MC's message.

>--- cut here

By: Martin Connelly
To: All
Re: External Cache Fault  1/
St:
----------------------------------------------------------------------------
@MSGID: 1:340/15.0 2a8115a8
   During the development of PKZIP v. 2.0 for MS-DOS, PKWARE has
  discovered hardware faults in newer 80386 & 80486 computers.
  These faults can cause anomalies in the operation of PKWARE
  software as well as other software.
    PKWARE has been endeavoring to locate an anomaly that has been
  observed by a number of customers and associated vendors.  The intial
  symptoms of the problem were:
    - Particular files extracting with  errors on one machine, but not
      on another.
   - Installs of some products failing.
    These problems have been observed primarily on newer, fast (33Mhz
    or faster) 80386 and 80486 machines.  Investigation of the problem
    revealed no difference in software or hardware between machines
that
    failed and machines which did not.  The files which fail do not
fail
    every time. To further test where the problem was occuring, a very
    simple program which would load a test file into a RAM buffer and
    then copy it to a second RAM buffer was created.  The program then
    compares the two buffers one byte at a time and reports any
    discrepancies. Discrepancies with even the simple copy were noted.
    If the EXTERNAL CACHE is turned off through the BIOS configuration,
    the problem does not occur. This is a hardware flaw. Here are the
    test programs. Pkware supplies test data BBS number 1-414-354-8670
    and is looking for bug reports on external caches that cause this.

two test programs

// test1.c
#include "stdlib.h"
#include "fcntl.h"
#include "memory.h"
#include "stdio.h"
#include "io.h"
#include "func.h"

boolean is386;

#define SIZE 16384U
unsigned char buff1[SIZE];
unsigned char buff2[SIZE];

// Simply compare the two buffers byte by byte,
// and report any mismatches.  The buffers should be identical,
// but due to faulty external caches, the data can become corrupted.

void compare(char *p1,char *p2,unsigned size,unsigned long pos)
{
char *save=p1;

while (size--)
  { if (*p1 != *p2)
      { printf(
"Mismatch at: %5u  Pos: %7lu  adr1: %4x adr2: %4x  buff1=%3u
buff2=%3u\n",
              p1-save,pos+(unsigned)p1-(unsigned)save,p1,p2,*p1,*p2);
      }
    p1++;
    p2++;
  }
}

void do_file(int fh,unsigned size)
{
unsigned count;
unsigned long pos;
char *ptr;
unsigned i;

_lseek(fh,pos=0L,SEEK_SET);

printf("Buffer: %5u\n",size);

while (count=_read(fh,buff1,size))      // standard read routine
  { for (i=0;i<32;i++)
      memcpy(buff2,buff1,count);        // standard memcpy routine

    compare(buff1,buff2,count,pos);
    pos += count;
  }
}

unsigned main(unsigned argc,char *argv[])
{
int fh;
unsigned i;

if ((fh=_open(argv[1],O_RDONLY|O_BINARY)) == -1)
  { printf("Can't open %s\n",argv[1]);
    return 1;
  }

for (i=64; i<=SIZE; i<<=1)
  do_file(fh,i);

return 0;
}

//test2.c

#include "stdlib.h"
#include "fcntl.h"
#include "memory.h"
#include "stdio.h"
#include "io.h"
#include "func.h"
#include "dos.h"
#include "share.h"

#define SIZE 16384U
unsigned char buff1[SIZE];
unsigned char buff2[SIZE];

unsigned long crc_tab[] = {
0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,
0xE963A535,0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,
0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,
0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,
0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,
0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,
0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C,
0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,
0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,
0xCFBA9599,0xB8BDA50F,0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,
0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D,0x76DC4190,0x01DB7106,
0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433,
0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,
0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,
0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,
0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,
0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,
0xA4D1C46D,0xD3D6F4FB,0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,
0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,0x5005713C,0x270241AA,
0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,
0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,
0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,
0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,
0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,
0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,
0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,
0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8,0xA1D1937E,
0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,
0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,
0x316E8EEF,0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,
0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,
0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,
0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,
0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,
0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242,
0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,
0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,
0x616BFFD3,0x166CCF45,0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,
0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,0xAED16A4A,0xD9D65ADC,
0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,
0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,
0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,
0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D
};

unsigned long crc32(unsigned long crc,unsigned char *s,unsigned n)
{
while (n--)
  { crc = (crc>>8) ^ crc_tab[(s[0] ^ crc) & 0xff];
    s++;
  }
return crc;
}
unsigned do_file(int fh,unsigned size)
{
unsigned count;
unsigned long crc1,crc2;
unsigned i;
_lseek(fh,0L,SEEK_SET);

count=_read(fh,buff1,size);

crc1=crc2=0xffffffffL;

while (count)
  { for (i=0;i<16;i++)
      memcpy(buff2,buff1,count);        // standard memcpy

    crc1=crc32(crc1,buff1,count);
    crc2=crc32(crc2,buff2,count);

    count=_read(fh,buff1,size);
  }

// CRC values should be the same, for all buffer sizes!

printf("%5u byte buffer. CRC1 = %8lx  CRC2 = %8lx\n",
size,~crc1,~crc2);
}

unsigned main(unsigned argc,char *argv[])
{
int fh;
unsigned i;
unsigned err=0;

if ((_dos_open(argv[1],O_RDONLY|SH_DENYNO,&fh)))
  { printf("Can't open %s\n",argv[1]);
    return 1;
  }
for (i=64; i<=16384; i<<=1) do_file(fh,i);
}

* Origin: Other Worlds BBS (604) 478-5529 (1:340/15)

>---- cut here

I hope this might shed some light on your problem. If the problem is
traced 
to a hardware bug, it might help others trying to run LINUX and running

into intermittent problems.

The origin address (1:340/15) is a FidoNet address.

Bert

 * Origin: Tech-80, Miami, FL (1:135/55)