📄 memtest.c
字号:
hex32out(badAddr);
printf(": ");
hex32out(*((long *) badAddr));
printf("\n"); /* Print out next line of mem dump */
hex32out(badAddr + 4); /* Starting address */
printf(": ");
hex32out(*((long *) (badAddr + 4))); /* First longword */
printf(" ");
hex32out(*((long *) (badAddr + 8)));
printf(" ");
hex32out(*((long *) (badAddr + 12)));
printf(" ");
hex32out(*((long *) (badAddr + 16)));
printf("\n");
hex32out(badAddr + 20);
printf(": ");
hex32out(*((long *) (badAddr + 20)));
printf(" ");
hex32out(*((long *) (badAddr + 24)));
printf(" ");
hex32out(*((long *) (badAddr + 28)));
printf(" ");
hex32out(*((long *) (badAddr + 32)));
/* DEBUG */
printf ("\n\nReading back data in 32bit chunks:\n");
addr = (unsigned long *)(badAddr - 16);
printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
addr = (unsigned long *)(badAddr - 12);
printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
addr = (unsigned long *)(badAddr - 8);
printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
addr = (unsigned long *)(badAddr - 4);
printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
addr = (unsigned long *)(badAddr);
printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
addr = (unsigned long *)(badAddr + 4);
printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
addr = (unsigned long *)(badAddr + 8);
printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
addr = (unsigned long *)(badAddr + 12);
printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
addr = (unsigned long *)(badAddr + 16);
printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
printf ("\n");
printf ("Reading back data in 16bit chunks:\n");
saddr = (unsigned short *)(badAddr - 16);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr - 14);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr - 12);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr - 10);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr - 8);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr - 6);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr - 4);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr - 2);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr + 2);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr + 4);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr + 6);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr + 8);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr + 10);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr + 12);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr + 14);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
saddr = (unsigned short *)(badAddr + 16);
printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
printf ("\n");
}
/*
* Returns 1 if passed, 0 if failed.
*/
int
memTest (
long startAddr, /* Start address of test */
long endAddr /* End address + 1 */
)
{
long badAddr; /* Addr test failed at */
printf("\n");
if (onesTest(startAddr) == FAILED)
{
printf("\nWalking 1's test: failed");
return 0;
}
printf("\nWalking 1's test: passed\n");
/* rval = quadtest(startAddr);
switch (rval)
{
case 0:
printf("\nQuadword test passed\n");
break;
case 1:
printf("\nQuadword test failed: Quadword Write, Longword Read\n");
dumpMem(startAddr);
return 0;
case 2:
printf("\nQuadword test failed: Longword Write, Quadword Read\n");
dumpMem(startAddr);
return 0;
default:
printf("\nQuadword test: Unknown return value 0x%X\n", rval);
return 0;
}
*/
printf("\nLong word address test: ");
if (LWAddr(startAddr, endAddr, &badAddr) == FAILED)
{
printf("failed");
dumpMem(badAddr);
return 0;
}
printf("passed");
printf("\nLong word address bar test: ");
if (LWBar(startAddr, endAddr, &badAddr) == FAILED)
{
printf("failed");
dumpMem(badAddr);
return 0;
}
printf("passed");
printf("\nByte address test: ");
if (ByteAddr(startAddr, endAddr, &badAddr) == FAILED)
{
printf("failed");
dumpMem(badAddr);
return 0;
}
printf("passed");
printf("\nByte address bar test: ");
if (ByteBar(startAddr, endAddr, &badAddr) == FAILED)
{
printf("failed");
dumpMem(badAddr);
return 0;
}
printf("passed");
return 1;
}
/* 02/02/01 jwf */
/* Do alternating inverse long word address test */
static int
LWABar(long start, /* Starting address of test */
long end, /* Ending address */
long *badAddr) /* Failure address */
{
register long currentAddr; /* Current address being tested */
int fail = 0; /* Test hasn't failed yet */
register long data;
/* In this test, the contents of each longword address toggles
between the Address and the Address BAR */
for(currentAddr = start; currentAddr < end; currentAddr += 4)
{
/* Address ending in 0x4 or 0xc */
if (currentAddr & 4)
*((long *) currentAddr) = ~currentAddr;
/* Address ending in 0x0 or 0x8 */
else
*((long *) currentAddr) = currentAddr;
}
for (currentAddr = start; (currentAddr < end) && (!fail); currentAddr += 4)
{
data = *(long *) currentAddr;
switch (currentAddr & 0xf)
{
case 0x0:
case 0x8:
if (data != currentAddr)
{
fail = 1;
printf ("\nFailed at Address 0x%08X, Expected 0x%08X, Read 0x%08X\n",
currentAddr, currentAddr, data);
}
break;
case 0x4:
case 0xc:
if (data != ~currentAddr)
{
fail = 1;
printf ("\nFailed at Address 0x%08X, Expected 0x%08X, Read 0x%08X\n",
currentAddr, ~currentAddr, data);
}
break;
default:
fail = 1;
printf ("\nFailed at Address 0x%08X, Unaligned address\n", currentAddr);
break;
}
}
if (fail) {
*badAddr = currentAddr - 4;
return FAILED;
} else
return PASSED;
}
/* 02/02/01 jwf */
/*
* Returns 1 if passed, 0 if failed.
*/
int
LoopMemTest (
long startAddr, /* Start address of test */
long endAddr /* End address + 1 */
)
{
long badAddr; /* Addr test failed at */
volatile int junk;
extern int ecc_error_reported;
/* indicate no ECC errors recorded */
*MSB_DISPLAY_REG = DISPLAY_OFF;
/* indicate passing test */
*LSB_DISPLAY_REG = LETTER_P;
while (1)
{
printf("\n");
printf("\nLong word address test: ");
if (LWAddr(startAddr, endAddr, &badAddr) == FAILED)
{
/* indicate failing test */
*LSB_DISPLAY_REG = LETTER_F;
printf("failed at Address 0x%08x\n", badAddr);
printf("Performing Continuous Write/Read/!Write/Read...\n\n");
while (1)
{
*(volatile int *)badAddr = badAddr;
junk = *(volatile int *)badAddr;
*(volatile int *)badAddr = ~badAddr;
junk = *(volatile int *)badAddr;
if (ecc_error_reported)
{
printf ("Disabling ECC reporting\n");
/* disable single and multi-bit reporting */
*(volatile unsigned long *)0x1534 = 0x4;
ecc_error_reported = FALSE;
}
}
return 0; /* not reached */
}
printf("passed");
printf("\nLong word address bar test: ");
if (LWBar(startAddr, endAddr, &badAddr) == FAILED)
{
/* indicate failing test */
*LSB_DISPLAY_REG = LETTER_F;
printf("failed at Address 0x%08x\n", badAddr);
printf("Performing Continuous Write/Read/!Write/Read...\n\n");
while (1)
{
*(volatile int *)badAddr = badAddr;
junk = *(volatile int *)badAddr;
*(volatile int *)badAddr = ~badAddr;
junk = *(volatile int *)badAddr;
if (ecc_error_reported)
{
printf ("Disabling ECC reporting\n");
/* disable single and multi-bit reporting */
*(volatile unsigned long *)0x1534 = 0x4;
ecc_error_reported = FALSE;
}
}
return 0; /* not reached */
}
printf("passed");
printf("\nAlternating Long word, Long word address bar test: ");
if (LWABar(startAddr, endAddr, &badAddr) == FAILED)
{
/* indicate failing test */
*LSB_DISPLAY_REG = LETTER_F;
printf("failed at Address 0x%08x\n", badAddr);
printf("Performing Continuous Write/Read/!Write/Read...\n\n");
while (1)
{
*(volatile int *)badAddr = badAddr;
junk = *(volatile int *)badAddr;
*(volatile int *)badAddr = ~badAddr;
junk = *(volatile int *)badAddr;
if (ecc_error_reported)
{
printf ("Disabling ECC reporting\n");
/* disable single and multi-bit reporting */
*(volatile unsigned long *)0x1534 = 0x4;
ecc_error_reported = FALSE;
}
}
return 0; /* not reached */
}
printf("passed");
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -