[Coco] OT: memory test code?
Kevin Diggs
kevdig at hypersurf.com
Thu Sep 29 18:01:59 EDT 2005
Hi,
Anyone know of any memory test code that will run under NetBSD (i.e.
source available) or MacOS 8.1?
The source file xmaze.c has numerous calls to strcmp. The troubled
computer is currently running an endless shell loop compiling the file
to assembler output (-S) until a file shows up with a call to strcmp! It
has been up for more than a day, albeit not doing a whole lot.
If this system were experiencing memory problems would you expect to
see occasional failures from the following program, which was written to
play with the move16 instruction of the 040 (for the curious, movel
takes about 1.9 or 2.0 seconds and move16 takes 1.2 or 1.3):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/resource.h>
#define BLK_SIZE (16<<20)
char *saveS(char *s)
{
static char *s0;
if(s!=NULL) s0=s;
return s0;
}
char *saveD(char *d)
{
static char *d0;
if(d!=NULL) d0=d;
return d0;
}
int tvDiff(const struct timeval *start, const struct timeval *end)
{
long sec,usec;
int packed;
sec=end->tv_sec-start->tv_sec;
usec=end->tv_usec-start->tv_usec;
if(usec<0)
{
sec--;
usec+=1000000;
}
packed=usec/1000 | (sec<<10);
return packed;
}
int cpCheck(const char *s, const char *d, int count)
{
int diffs=0;
const int *p,*q;
for(p=(const int *)s,q=(const int *)d; p<((const int *)s)+(count>>2);
p++,q++)
if(*p!=*q) diffs++;
return diffs;
}
int main(int argc, char *argv[])
{
char *s,*d;
struct rusage ru_start,ru_movew,ru_movel,ru_move16,ru_memmove;
int diffs,diffms,diff1,diff2,diff3,diff4;
s=saveS((char *)malloc(BLK_SIZE));
d=saveD((char *)malloc(BLK_SIZE));
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
memset(d,0,BLK_SIZE);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
srand(getpid());
for(d=s; d<s+BLK_SIZE; d+=4)
*(int *)d=rand();
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
s=saveS(NULL);
d=saveD(NULL);
getrusage(RUSAGE_SELF,&ru_start);
asm volatile("lsrl #1,%0;1:movew (%1)+,(%2)+;subql #1,%0;bne 1b":
:"d"(BLK_SIZE),"a"(s),"a"(d));
getrusage(RUSAGE_SELF,&ru_movew);
diffs=tvDiff(&ru_start.ru_utime,&ru_movew.ru_utime);
diffms=diffs&0x3ff;
diffs>>=10;
printf("movew time for %d is %d.%03d\n",BLK_SIZE,diffs,diffms);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
s=saveS(NULL);
d=saveD(NULL);
diff1=cpCheck(s,d,BLK_SIZE);
if(diff1)
printf("\t%d errors for movew\n",diff1);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
memset(d,0,BLK_SIZE);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
getrusage(RUSAGE_SELF,&ru_start);
asm volatile("lsrl #2,%0;2:movel (%1)+,(%2)+;subql #1,%0;bne 2b":
:"d"(BLK_SIZE),"a"(s),"a"(d));
getrusage(RUSAGE_SELF,&ru_movel);
diffs=tvDiff(&ru_start.ru_utime,&ru_movel.ru_utime);
diffms=diffs&0x3ff;
diffs>>=10;
printf("movel time for %d is %d.%03d\n",BLK_SIZE,diffs,diffms);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
s=saveS(NULL);
d=saveD(NULL);
diff2=cpCheck(s,d,BLK_SIZE);
if(diff2)
printf("\t%d errors for movel\n",diff1);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
memset(d,0,BLK_SIZE);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
getrusage(RUSAGE_SELF,&ru_start);
asm volatile("lsrl #4,%0;3:move16 (%1)+,(%2)+;subql #1,%0;bne 3b":
:"d"(BLK_SIZE),"a"(s),"a"(d));
getrusage(RUSAGE_SELF,&ru_move16);
diffs=tvDiff(&ru_start.ru_utime,&ru_move16.ru_utime);
diffms=diffs&0x3ff;
diffs>>=10;
printf("move16 time for %d is %d.%03d\n",BLK_SIZE,diffs,diffms);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
s=saveS(NULL);
d=saveD(NULL);
diff3=cpCheck(s,d,BLK_SIZE);
if(diff3)
printf("\t%d errors for move16\n",diff1);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
memset(d,0,BLK_SIZE);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
getrusage(RUSAGE_SELF,&ru_start);
memmove(s,d,BLK_SIZE);
getrusage(RUSAGE_SELF,&ru_memmove);
diffs=tvDiff(&ru_start.ru_utime,&ru_memmove.ru_utime);
diffms=diffs&0x3ff;
diffs>>=10;
printf("memmove time for %d is %d.%03d\n",BLK_SIZE,diffs,diffms);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
s=saveS(NULL);
d=saveS(NULL);
diff4=cpCheck(s,d,BLK_SIZE);
if(diff4)
printf("\t%d errors for memmove()\n",diff1);
#ifdef CRASH_DEBUG
printf(__FILE__"-%d:\n",__LINE__);
#endif
free(saveS(NULL));
free(saveD(NULL));
#if 0
printf("times at start %d.%06d\n",ru_start.ru_utime.tv_sec,ru_start.
ru_utime.tv_usec);
printf("times after move.l %d.%06d\n",ru_movel.ru_utime.tv_sec,ru_movel.
ru_utime.tv_usec);
printf("times after move16 %d.%06d\n",ru_move16.ru_utime.tv_sec,
ru_move16.ru_utime.tv_usec);
#endif
return 0;
}
kevin
More information about the Coco
mailing list