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

📄 setup.c

📁 这个linux源代码是很全面的~基本完整了~使用c编译的~由于时间问题我没有亲自测试~但就算用来做参考资料也是非常好的
💻 C
📖 第 1 页 / 共 2 页
字号:
	unsigned int *v;	if (cpuid_eax(0x80000000) < 0x80000004)		return 0;	v = (unsigned int *) c->x86_model_id;	cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);	cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);	cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);	c->x86_model_id[48] = 0;	return 1;}static void __init display_cacheinfo(struct cpuinfo_x86 *c){	unsigned int n, dummy, ecx, edx, eax, ebx, eax_2, ebx_2, ecx_2;	n = cpuid_eax(0x80000000);	if (n >= 0x80000005) {		if (n >= 0x80000006) 			cpuid(0x80000006, &eax_2, &ebx_2, &ecx_2, &dummy); 			cpuid(0x80000005, &eax, &ebx, &ecx, &edx);		printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line/%d way), D cache %dK (%d bytes/line/%d way)\n",		       edx>>24, edx&0xFF, (edx>>16)&0xff, 		       ecx>>24, ecx&0xFF, (ecx>>16)&0xff);		c->x86_cache_size=(ecx>>24)+(edx>>24);			if (n >= 0x80000006) {			printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line/%d way)\n",			       ecx_2>>16, ecx_2&0xFF, (ecx_2>>12)&0xf);			c->x86_cache_size = ecx_2 >> 16;		}				printk(KERN_INFO "CPU: DTLB L1 %d 4K %d 2MB L2: %d 4K %d 2MB\n",		       (ebx>>16)&0xff, (eax>>16)&0xff, 		       (ebx_2>>16)&0xfff, (eax_2>>16)&0xfff);		printk(KERN_INFO "CPU: ITLB L1 %d 4K %d 2MB L2: %d 4K %d 2MB\n",		       ebx&0xff, (eax)&0xff, 		       (ebx_2)&0xfff, (eax_2)&0xfff);				c->x86_tlbsize = ((ebx>>16)&0xff) + ((ebx_2>>16)&0xfff) + 			(ebx&0xff) + ((ebx_2)&0xfff);	}}static int __init init_amd(struct cpuinfo_x86 *c){	int r;	/* Bit 31 in normal CPUID used for nonstandard 3DNow ID;	   3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */	clear_bit(0*32+31, &c->x86_capability);		r = get_model_name(c);	if (!r) { 		switch (c->x86) { 		case 15:			/* Should distingush Models here, but this is only			   a fallback anyways. */			strcpy(c->x86_model_id, "Hammer");			break; 		} 	} 	display_cacheinfo(c);	return r;}void __init get_cpu_vendor(struct cpuinfo_x86 *c){	char *v = c->x86_vendor_id;	if (!strcmp(v, "AuthenticAMD"))		c->x86_vendor = X86_VENDOR_AMD;	else		c->x86_vendor = X86_VENDOR_UNKNOWN;}struct cpu_model_info {	int vendor;	int family;	char *model_names[16];};int __init x86_fxsr_setup(char * s){	disable_x86_fxsr = 1;	return 1;}__setup("nofxsr", x86_fxsr_setup);/* * This does the hard work of actually picking apart the CPU stuff... */void __init identify_cpu(struct cpuinfo_x86 *c){	int junk, i;	u32 xlvl, tfms;	c->loops_per_jiffy = loops_per_jiffy;	c->x86_cache_size = -1;	c->x86_vendor = X86_VENDOR_UNKNOWN;	c->x86_model = c->x86_mask = 0;	/* So far unknown... */	c->x86_vendor_id[0] = '\0'; /* Unset */	c->x86_model_id[0] = '\0';  /* Unset */	memset(&c->x86_capability, 0, sizeof c->x86_capability);	/* Get vendor name */	cpuid(0x00000000, &c->cpuid_level,	      (int *)&c->x86_vendor_id[0],	      (int *)&c->x86_vendor_id[8],	      (int *)&c->x86_vendor_id[4]);			get_cpu_vendor(c);	/* Initialize the standard set of capabilities */	/* Note that the vendor-specific code below might override */	/* Intel-defined flags: level 0x00000001 */	if ( c->cpuid_level >= 0x00000001 ) {			__u32 misc;		cpuid(0x00000001, &tfms, &misc, &junk,		      &c->x86_capability[0]);		c->x86 = (tfms >> 8) & 15;		if (c->x86 == 0xf)			c->x86 += (tfms >> 20) & 0xff;		c->x86_model = (tfms >> 4) & 15;		if (c->x86_model == 0xf)			c->x86_model += ((tfms >> 16) & 0xF) << 4; 		c->x86_mask = tfms & 15;		if (c->x86_capability[0] & (1<<19)) 			c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;	} else {		/* Have CPUID level 0 only - unheard of */		c->x86 = 4;	}	/* AMD-defined flags: level 0x80000001 */	xlvl = cpuid_eax(0x80000000);	if ( (xlvl & 0xffff0000) == 0x80000000 ) {		if ( xlvl >= 0x80000001 )			c->x86_capability[1] = cpuid_edx(0x80000001);		if ( xlvl >= 0x80000004 )			get_model_name(c); /* Default name */	}	/* Transmeta-defined flags: level 0x80860001 */	xlvl = cpuid_eax(0x80860000);	if ( (xlvl & 0xffff0000) == 0x80860000 ) {		if (  xlvl >= 0x80860001 )			c->x86_capability[2] = cpuid_edx(0x80860001);	}	/*	 * Vendor-specific initialization.  In this section we	 * canonicalize the feature flags, meaning if there are	 * features a certain CPU supports which CPUID doesn't	 * tell us, CPUID claiming incorrect flags, or other bugs,	 * we handle them here.	 *	 * At the end of this section, c->x86_capability better	 * indicate the features this CPU genuinely supports!	 */	switch ( c->x86_vendor ) {		case X86_VENDOR_AMD:			init_amd(c);			break;		case X86_VENDOR_UNKNOWN:		default:			/* Not much we can do here... */			break;	}	/*	 * The vendor-specific functions might have changed features.  Now	 * we do "generic changes."	 */	/* TSC disabled? */#ifndef CONFIG_X86_TSC	if ( tsc_disable )		clear_bit(X86_FEATURE_TSC, &c->x86_capability);#endif	/* FXSR disabled? */	if (disable_x86_fxsr) {		clear_bit(X86_FEATURE_FXSR, &c->x86_capability);		clear_bit(X86_FEATURE_XMM, &c->x86_capability);	}	/*	 * On SMP, boot_cpu_data holds the common feature set between	 * all CPUs; so make sure that we indicate which features are	 * common between the CPUs.  The first time this routine gets	 * executed, c == &boot_cpu_data.	 */	if ( c != &boot_cpu_data ) {		/* AND the already accumulated flags with these */		for ( i = 0 ; i < NCAPINTS ; i++ )			boot_cpu_data.x86_capability[i] &= c->x86_capability[i];	}#ifdef CONFIG_MCE	mcheck_init(c);#endif} void __init print_cpu_info(struct cpuinfo_x86 *c){	if (c->x86_model_id[0])		printk("%s", c->x86_model_id);	if (c->x86_mask || c->cpuid_level >= 0) 		printk(" stepping %02x\n", c->x86_mask);	else		printk("\n");}/* *	Get CPU information for use by the procfs. */static int show_cpuinfo(struct seq_file *m, void *v){	struct cpuinfo_x86 *c = v;	/* 	 * These flag bits must match the definitions in <asm/cpufeature.h>.	 * NULL means this bit is undefined or reserved; either way it doesn't	 * have meaning as far as Linux is concerned.  Note that it's important	 * to realize there is a difference between this table and CPUID -- if	 * applications want to get the raw CPUID data, they should access	 * /dev/cpu/<cpu_nr>/cpuid instead.	 */	static char *x86_cap_flags[] = {		/* Intel-defined */	        "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",	        "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov",	        "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx",	        "fxsr", "sse", "sse2", "ss", NULL, "tm", "ia64", NULL,		/* AMD-defined */		NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,		NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,		NULL, NULL, NULL, NULL, "nx", NULL, "mmxext", NULL,		NULL, NULL, NULL, NULL, NULL, "lm", "3dnowext", "3dnow",		/* Transmeta-defined */		"recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,		NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,		NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,		NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,		/* Other (Linux-defined) */		"cxmmx", "k6_mtrr", "cyrix_arr", "centaur_mcr", NULL, NULL, NULL, NULL,		NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,		NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,		NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,	};#ifdef CONFIG_SMP	if (!(cpu_online_map & (1<<(c-cpu_data))))		return 0;#endif	seq_printf(m,"processor\t: %u\n"		     "vendor_id\t: %s\n"		     "cpu family\t: %d\n"		     "model\t\t: %d\n"		     "model name\t: %s\n",		     (unsigned)(c-cpu_data),		     c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",		     c->x86,		     (int)c->x86_model,		     c->x86_model_id[0] ? c->x86_model_id : "unknown");		if (c->x86_mask || c->cpuid_level >= 0)		seq_printf(m, "stepping\t: %d\n", c->x86_mask);	else		seq_printf(m, "stepping\t: unknown\n");		if ( test_bit(X86_FEATURE_TSC, &c->x86_capability) ) {		seq_printf(m, "cpu MHz\t\t: %u.%03u\n",			     cpu_khz / 1000, (cpu_khz % 1000));	}	seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);		seq_printf(m,	        "fpu\t\t: yes\n"	        "fpu_exception\t: yes\n"	        "cpuid level\t: %d\n"	        "wp\t\t: yes\n"	        "flags\t\t:",		   c->cpuid_level);	{ 		int i; 		for ( i = 0 ; i < 32*NCAPINTS ; i++ )			if ( test_bit(i, &c->x86_capability) &&			     x86_cap_flags[i] != NULL )				seq_printf(m, " %s", x86_cap_flags[i]);	}			seq_printf(m, "\nbogomips\t: %lu.%02lu\n",		   c->loops_per_jiffy/(500000/HZ),		   (c->loops_per_jiffy/(5000/HZ)) % 100);	if (c->x86_tlbsize > 0) 		seq_printf(m, "TLB size\t: %d 4K pages\n", c->x86_tlbsize);	seq_printf(m, "clflush size\t: %d\n", c->x86_clflush_size);	seq_printf(m, "\n"); 	return 0;}static void *c_start(struct seq_file *m, loff_t *pos){	return *pos < NR_CPUS ? cpu_data + *pos : NULL;}static void *c_next(struct seq_file *m, void *v, loff_t *pos){	++*pos;	return c_start(m, pos);}static void c_stop(struct seq_file *m, void *v){}struct seq_operations cpuinfo_op = {	start:	c_start,	next:	c_next,	stop:	c_stop,	show:	show_cpuinfo,};

⌨️ 快捷键说明

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