⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memtest.c

📁 移植到WLIT项目的redboot源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -