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

📄 init.c

📁 ddr and sdram memory check,ddr and sdram memory check
💻 C
📖 第 1 页 / 共 2 页
字号:
/* init.c - MemTest-86  Version 3.0 * * Released under version 2 of the Gnu Public License. * By Chris Brady, cbrady@sgi.com * ---------------------------------------------------- * MemTest86+ V1.30 Specific code (GPL V2.0) * By Samuel DEMEULEMEESTER, sdemeule@memtest.org * http://www.x86-secret.com - http://www.memtest.org */#include "test.h"#include "defs.h"#include "config.h"#include "controller.h"#include "pci.h"#include "io.h"extern short memsz_mode;extern short firmware;int beepmode;struct cpu_ident cpu_id;ulong st_low, st_high;ulong end_low, end_high;ulong cal_low, cal_high;ulong extclock;static ulong memspeed(ulong src, ulong len, int iter);static void cpu_type(void);static void cacheable(void);static int cpuspeed(void);static void display_init(void){	int i;	volatile char *pp;	serial_echo_init();        serial_echo_print("INE_SCROLL;24r"); /* Set scroll area row 7-23 */        serial_echo_print("");   /* Clear Screen */        serial_echo_print("");        serial_echo_print("");        serial_echo_print("");	/* Clear screen & set background to blue */	for(i=0, pp=(char *)(SCREEN_ADR); i<80*24; i++) {		*pp++ = ' ';		*pp++ = 0x17;	}	/* Make the name background red */ 	for(i=0, pp=(char *)(SCREEN_ADR+1); i<TITLE_WIDTH; i++, pp+=2) {  	*pp = 0x20; 	} 	cprint(0, 0, "      Memtest86  v1.30      "); 	for(i=0, pp=(char *)(SCREEN_ADR+1); i<2; i++, pp+=30) {	*pp = 0xA4; 	} 	cprint(0, 15, "+");	/* Do reverse video for the bottom display line */	for(i=0, pp=(char *)(SCREEN_ADR+1+(24 * 160)); i<80; i++, pp+=2) {	*pp = 0x71;	}        serial_echo_print("");}/* * Initialize test, setup screen and find out how much memory there is. */void init(void){	int i;	outb(0x8, 0x3f2);  /* Kill Floppy Motor */	/* Turn on cache */	set_cache(1);	/* Setup the display */	display_init();	/* Determine the memory map */	if ((firmware == FIRMWARE_UNKNOWN) && 		(memsz_mode != SZ_MODE_PROBE)) {		if (query_linuxbios()) {			firmware = FIRMWARE_LINUXBIOS;		}		else if (query_pcbios()) {			firmware = FIRMWARE_PCBIOS;		}	}	mem_size();	/* setup pci */	pci_init();		/* setup beep mode */	beepmode = BEEP_MODE;	v->test = 0;	v->testsel = -1;	v->msg_line = LINE_SCROLL-1;	v->scroll_start = v->msg_line * 160;	cprint(LINE_CPU+1, 0, "L1 Cache: Unknown ");	cprint(LINE_CPU+2, 0, "L2 Cache: Unknown ");	cprint(LINE_CPU+3, 0, "Memory  : ");	aprint(LINE_CPU+3, 10, v->test_pages);	cprint(LINE_CPU+4, 0, "Chipset : ");	cpu_type();		/* Find the memory controller (inverted from standard) */	find_controller();	if (v->rdtsc) {		cacheable();		cprint(LINE_TIME, COL_TIME+4, ":  :");	}	cprint(0, COL_MID,"Pass   %");	cprint(1, COL_MID,"Test   %");	cprint(2, COL_MID,"Test #");	cprint(3, COL_MID,"Testing: ");	cprint(4, COL_MID,"Pattern: ");	cprint(LINE_INFO-2, 0, " WallTime   Cached  RsvdMem   MemMap   Cache  ECC  Test  Pass  Errors ECC Errs");	cprint(LINE_INFO-1, 0, " ---------  ------  -------  --------  -----  ---  ----  ----  ------ --------");	cprint(LINE_INFO, COL_TST, " Std");	cprint(LINE_INFO, COL_PASS, "    0");	cprint(LINE_INFO, COL_ERR, "     0");	cprint(LINE_INFO+1, 0, " -----------------------------------------------------------------------------");	for(i=0; i < 5; i++) {		cprint(i, COL_MID-2, "| ");	}	footer();	v->printmode=PRINTMODE_ADDRESSES;	v->numpatn=0;	find_ticks();}#define FLAT 0static unsigned long mapped_window = 1;void paging_off(void){	if (!v->pae)		return;	mapped_window = 1;	__asm__ __volatile__ (		/* Disable paging */		"movl %%cr0, %%eax\n\t"		"andl $0x7FFFFFFF, %%eax\n\t"		"movl %%eax, %%cr0\n\t"		/* Disable pae */		"movl %%cr4, %%eax\n\t"		"andl $0xFFFFFFDF, %%eax\n\t"		:		:		: "ax"		);}static void paging_on(void *pdp){	if (!v->pae)		return;	__asm__ __volatile__(		/* Load the page table address */		"movl %0, %%cr3\n\t"		/* Enable pae */		"movl %%cr4, %%eax\n\t"		"orl $0x00000020, %%eax\n\t"		"movl %%eax, %%cr4\n\t"		/* Enable paging */		"movl %%cr0, %%eax\n\t"		"orl $0x80000000, %%eax\n\t"		"movl %%eax, %%cr0\n\t"		:		: "r" (pdp)		: "ax"		);}int map_page(unsigned long page){	unsigned long i;	struct pde {		unsigned long addr_lo;		unsigned long addr_hi;	};	extern unsigned char pdp[];	extern struct pde pd2[];	unsigned long window = page >> 19;	if (FLAT || (window == mapped_window)) {		return 0;	}	if (window == 0) {		return 0;	}	if (!v->pae || (window >= 32)) {		/* Fail either we don't have pae support		 * or we want an address that is out of bounds		 * even for pae.		 */		return -1;	}	/* Compute the page table entries... */	for(i = 0; i < 1024; i++) {		pd2[i].addr_lo = ((window & 1) << 31) + ((i & 0x3ff) << 21) + 0xE3;		pd2[i].addr_hi = (window >> 1);	}	paging_off();	if (window > 1) {		paging_on(pdp);	}	mapped_window = window;	return 0;}void *mapping(unsigned long page_addr){	void *result;	if (FLAT || (page_addr < 0x80000)) {		/* If the address is less that 1GB directly use the address */		result = (void *)(page_addr << 12);	}	else {		unsigned long alias;		alias = page_addr & 0x7FFFF;		alias += 0x80000;		result = (void *)(alias << 12);	}	return result;}void *emapping(unsigned long page_addr){	void *result;	result = mapping(page_addr -1);	/* The result needs to be 256 byte alinged... */	result = ((unsigned char *)result) + 0xf00;	return result;}unsigned long page_of(void *addr){	unsigned long page;	page = ((unsigned long)addr) >> 12;	if (!FLAT && (page >= 0x80000)) {		page &= 0x7FFFF;		page += mapped_window << 19;	}#if 0	cprint(LINE_SCROLL -2, 0, "page_of(        )->            ");	hprint(LINE_SCROLL -2, 8, ((unsigned long)addr));	hprint(LINE_SCROLL -2, 20, page);#endif		return page;}/* * Find CPU type and cache sizes */ void cpu_type(void){	int i, off=0;	int l1_cache=0, l2_cache=0;	ulong speed;	v->rdtsc = 0;	v->pae = 0;#ifdef CPUID_DEBUG	dprint(9,0,cpu_id.type,3,1);	dprint(10,0,cpu_id.model,3,1);	dprint(11,0,cpu_id.cpuid,3,1);#endif	/* If the CPUID instruction is not supported then this is */	/* a 386, 486 or one of the early Cyrix CPU's */	if (cpu_id.cpuid < 1) {		switch (cpu_id.type) {		case 2:			/* This is a Cyrix CPU without CPUID */			i = getCx86(0xfe);			i &= 0xf0;			i >>= 4;			switch(i) {			case 0:			case 1:				cprint(LINE_CPU, 0, "Cyrix Cx486");				break;			case 2:				cprint(LINE_CPU, 0,"Cyrix 5x86");				break;			case 3:				cprint(LINE_CPU, 0,"Cyrix 6x86");				break;			case 4:				cprint(LINE_CPU, 0,"Cyrix MediaGX");				break;			case 5:				cprint(LINE_CPU, 0,"Cyrix 6x86MX");				break;			case 6:				cprint(LINE_CPU, 0,"Cyrix MII");				break;			default:				cprint(LINE_CPU, 0,"Cyrix ???");				break;			}			break;		case 3:			cprint(LINE_CPU, 0, "386");			break;		case 4:			cprint(LINE_CPU, 0, "486");			l1_cache = 8;			break;		}		return;	}	/* We have cpuid so we can see if we have pae support */	if (cpu_id.capability & (1 << X86_FEATURE_PAE)) {		v->pae = 1;	}	switch(cpu_id.vend_id[0]) {	/* AMD Processors */	case 'A':		switch(cpu_id.type) {		case 4:			switch(cpu_id.model) {			case 3:				cprint(LINE_CPU, 0, "AMD 486DX2");				break;			case 7:				cprint(LINE_CPU, 0, "AMD 486DX2-WB");				break;			case 8:				cprint(LINE_CPU, 0, "AMD 486DX4");				break;			case 9:				cprint(LINE_CPU, 0, "AMD 486DX4-WB");				break;			case 14:				cprint(LINE_CPU, 0, "AMD 5x86-WT");				break;			}			/* Since we can't get CPU speed or cache info return */			return;		case 5:			switch(cpu_id.model) {			case 0:			case 1:			case 2:			case 3:				cprint(LINE_CPU, 0, "AMD K5");				off = 6;				break;			case 6:			case 7:				cprint(LINE_CPU, 0, "AMD K6");				off = 6;				l1_cache = cpu_id.cache_info[3];				l1_cache += cpu_id.cache_info[7];				break;			case 8:				cprint(LINE_CPU, 0, "AMD K6-2");				off = 8;				l1_cache = cpu_id.cache_info[3];				l1_cache += cpu_id.cache_info[7];				break;			case 9:				cprint(LINE_CPU, 0, "AMD K6-III");				off = 10;				l1_cache = cpu_id.cache_info[3];				l1_cache += cpu_id.cache_info[7];				l2_cache = (cpu_id.cache_info[11] << 8);				l2_cache += cpu_id.cache_info[10];				break;			case 13: 				cprint(LINE_CPU, 0, "AMD K6-III+"); 				off = 11; 				l1_cache = cpu_id.cache_info[3]; 				l1_cache += cpu_id.cache_info[7]; 				l2_cache = (cpu_id.cache_info[11] << 8); 				l2_cache += cpu_id.cache_info[10]; 				break;			}			break;		case 6:			switch(cpu_id.model) {			case 1:				cprint(LINE_CPU, 0, "AMD Athlon (0.25)");				off = 17;				l2_cache = (cpu_id.cache_info[11] << 8);				l2_cache += cpu_id.cache_info[10];				break;			case 2:			case 4:				cprint(LINE_CPU, 0, "AMD Athlon (0.18)");				off = 17;				l2_cache = (cpu_id.cache_info[11] << 8);				l2_cache += cpu_id.cache_info[10];				break;			case 6:				l2_cache = (cpu_id.cache_info[11] << 8);				l2_cache += cpu_id.cache_info[10];				if (l2_cache == 64) {                               		cprint(LINE_CPU, 0, "AMD Duron (0.18)");                                } else {                                	cprint(LINE_CPU, 0, "Athlon XP (0.18)");				}				off = 16;				break;			case 8:			case 10:                                l2_cache = (cpu_id.cache_info[11] << 8);                                l2_cache += cpu_id.cache_info[10];                                               if (l2_cache == 64) {                               		cprint(LINE_CPU, 0, "AMD Duron (0.13)");                                } else {                                	cprint(LINE_CPU, 0, "Athlon XP (0.13)");				}				off = 16;                                break;			case 3:			case 7:				cprint(LINE_CPU, 0, "AMD Duron");				off = 9;				/* Duron stepping 0 CPUID for L2 is broken */				/* (AMD errata T13)*/				if (cpu_id.step == 0) { /* stepping 0 */					/* Hard code the right size*/					l2_cache = 64;				} else {					l2_cache = (cpu_id.cache_info[11] << 8);					l2_cache += cpu_id.cache_info[10];				}				break;			}			l1_cache = cpu_id.cache_info[3];			l1_cache += cpu_id.cache_info[7];			break;		case 15:			l1_cache = cpu_id.cache_info[3];			l1_cache += cpu_id.cache_info[7];      l2_cache = (cpu_id.cache_info[11] << 8);      l2_cache += cpu_id.cache_info[10];			switch(cpu_id.model) {			default:				cprint(LINE_CPU, 0, "AMD Athlon 64");             off = 13;             break;			case 5:				cprint(LINE_CPU, 0, "AMD Opteron (0.13)");             off = 18;             break;      case  4:      case 12:						if (l2_cache == 256) {				cprint(LINE_CPU, 0, "AMD Sempron (0.13)");             off = 18;                        	      } else {				cprint(LINE_CPU, 0, "Athlon 64 (0.13)");             off = 16;       }  	    				 break;   		case 15:				cprint(LINE_CPU, 0, "Athlon 64 (0.09)");             off = 16;             break;                       			}			break;		}		break;	/* Intel Processors */	case 'G':		if (cpu_id.type == 4) {			switch(cpu_id.model) {			case 0:			case 1:				cprint(LINE_CPU, 0, "Intel 486DX");				off = 11;				break;			case 2:				cprint(LINE_CPU, 0, "Intel 486SX");				off = 11;				break;			case 3:				cprint(LINE_CPU, 0, "Intel 486DX2");				off = 12;				break;			case 4:				cprint(LINE_CPU, 0, "Intel 486SL");				off = 11;				break;			case 5:				cprint(LINE_CPU, 0, "Intel 486SX2");				off = 12;				break;			case 7:				cprint(LINE_CPU, 0, "Intel 486DX2-WB");				off = 15;				break;			case 8:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -