📄 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. */intmemTest ( 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 intLWABar(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. */intLoopMemTest ( 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 + -