myCPUZ (未完待续)

目前能获得一些功能鸟~~比如CPU厂商啊,支持的指令集啊,还有一些步进啊,型号啊什么的

CPU缓存信息我用的枚举,有别的好办法没啊。。。。累死了。

//cpuid.h
#define NOMORE_CACHE 	0
#define DATA_CACHE		1
#define	INS_CACHE			2
#define UNIFIED_CACHE		3

#define	__w						printf

const char *cache_type[] = {
			"No More Cache",
			"Data Cache",
			"Instruction Cache",
			"Unified Cache"
			};

const char *feature_flag_names[] = {
			"SSE3 ",	"PCLMULDQ ",	"DTES64 ",	"MONITOR ",	"DS-CPL ",	"VMX ",		"SMX ",		"SET ",
			"TM2 ",		"SSSE3 ",			"CNXT-ID ",	"- ",				"- ",			"CX16 ",	"xTPR ",	"PDCM ",
			"- ",			"- ",					"DCA ",			"SSE4.1 ",		"SSE4.2 ",	"x2APIC",	"MOVBE ",	"POPCNT ",
			"- ",			"AES ",				"XSAVE ",		"OSXSAVE ",	"- ",			" -",			"- ",			"- ",
			"FPU ",		"VME ",		"DE ",		"PSE",		"TSC ",		"MSR ",		"PEA ",		"MCE ",
			"CX8 ",		"APIC ",		"- ",			"SEP ",		"MTRR ",	"PGE ",		"MAC ",		"CMOV ",
			"PAT",		"PSE-36 ",	"PSN ",		"CLFSH ",	"- ",			"DS ",		"ACPI ",		"MMX ",
			"FXSR ",	"SSE ",		"SSE2 ",	"SS ",		"HTT ",		"TM ",		"- ",			"PBE "
			};

const char *descriptor_decode_values[] ={
			"", //0x00
			"Instruction TLB:4-KB Pages,4-way setassociative,32entries", //0x01
			"Instruction TLB:4-MB Pages,fully associative,2 entries", //0x02
			"Data TLB:4-KB Pages,4-way set associative,64 entries", // 0x03
			"Data TLB:4-MB Pages,4-way set associative,8 entries",// 0x04
			"Data TLB:4-MB Pages,4-way set associative,32 entries",//0x05
			"1st-level instruction cache:8-KB,4-way set associative,32-byte line size", //0x06
			"", //0x07
			"1st-level instruction cache:16-KB,4-way set associative,32-byte line size", //0x08
			"1st-level instruction cache:32-KB,4-way set associative,64-byte line size", //0x09
			"1st-level data cache:8-KB,2-way set associative,32-byte line size", //0x0a
			"", //0x0b
			"1st-level data cache:16-KB,4-way set associative,32-byte line size", //0x0c
			"1st-level data cache:16-KB,4-way set associative,64-byte line size", //0x0d
			"", //0x0e
			"", //0x0f
			"", //0x10
			"", //0x11
			"", //0x12
			"", //0x13
			"", //0x14
			"", //0x15
			"", //0x16
			"", //0x17
			"", //0x18
			"", //0x19
			"", //0x1a
			"", //0x1b
			"", //0x1c
			"", //0x1d
			"", //0x1e
			"", //0x1f
			"", //0X20
			"256-KB L2(MLC), 8-way set associative, 64-byte line size", //0x21
			"3rd-level cache 512-KB, 4-way set associative, sectored cache, 64-byte line size", //0x22
			"3rd-level cache 1-MB, 8-way set associative, sectored cache, 64-byte line size", //0x23
			"", //0x24
			"3rd-level cache 2-MB, 8-way set associative, sectored cache, 64-byte line size", //0x25
			"", //0x26
			"", //0x27
			"", //0x28
			"3rd-level cache 4-MB, 8-way set associative, sectored cache, 64-byte line size", //0x29
			"", //0x2a
			"", //0x2b
			"1st-level data cache: 32-KB,8-way set associative, 64-byte line size", //0x2c
			"", //0x2d
			"", //0x2e
			"", //0x2f
			"1st-level instruction cache: 32-KB,8-way set associative, 64-byte line size", //0x30
			"", //0x31
			"", //0x32
			"", //0x33
			"", //0x34
			"", //0x35
			"", //0x36
			"", //0x37
			"", //0x38
			"2nd-level level cache: 128-KB,4-way set associative, sectored cache, 64-byte line size", //0x39
			"2nd-level level cache: 192-KB,6-way set associative, sectored cache, 64-byte line size", //0x3a
			"2nd-level level cache: 128-KB,2-way set associative, sectored cache, 64-byte line size", //0x3b
			"2nd-level level cache: 256-KB,4-way set associative, sectored cache, 64-byte line size", //0x3c
			"2nd-level level cache: 384-KB,6-way set associative, sectored cache, 64-byte line size", //0x3d
			"2nd-level level cache: 512-KB,4-way set associative, sectored cache, 64-byte line size", //0x3e
			"", //0x3f
			"No 2dn-level cache or, if processor contains a valid 2nd-level cache, no 3rd-level cache", //0x40
			"2nd-level cache: 128KB, 4-way set associative, 32-byte line size", //0x41
			"2nd-level cache: 256KB, 4-way set associative, 32-byte line size", //0x42
			"2nd-level cache: 512KB, 4-way set associative, 32-byte line size", //0x43
			"2nd-level cache: 1-MB, 4-way set associative, 32-byte line size", //0x44
			"2nd-level cache: 2-MB, 4-way set associative, 32-byte line size", //0x45
			"2nd-level cache: 4-MB, 4-way set associative, 64-byte line size", //0x46
			"2nd-level cache: 8-MB, 8-way set associative, 64-byte line size", //0x47
			"2nd-level cache: 3-MB, 12-way set associative, 64-byte line size", //0x48
			"2nd-level cache: 4-MB, 16-way set associative, 64-byte line size", //0x49
			"2nd-level cache: 6-MB, 12-way set associative, 64-byte line size", //0x4a
			"2nd-level cache: 8-MB, 16-way set associative, 64-byte line size", //0x4b
			"2nd-level cache: 12-MB, 12-way set associative, 64-byte line size", //0x4c
			"2nd-level cache: 16-MB, 16-way set associative, 64-byte line size", //0x4d
			"2nd-level cache: 6-MB, 24-way set associative, 64-byte line size", //0x4e
			"", //0x4f
			"Instruction TLB: 4-KB, 2-MB or 4-MB pages, fully associative, 64 entries", //0x50
			"Instruction TLB: 4-KB, 2-MB or 4-MB pages, fully associative, 128 entries", //0x51
			"Instruction TLB: 4-KB, 2-MB or 4-MB pages, fully associative, 256 entries", //0x52
			"", //0x53
			"", //0x54
			"Instruction TLB: 2-MB or 4-MB pages, fully associative, 7 entries", //0x55
			"L1 Data TLB: 4-MB pages, 4-way set associative, 16 entries", //0x56
			"L1 Data TLB: 4-KB pages, 4-way set associative, 16 entries", //0x57
			"", //0x58
			"", //0x59
			"Data TLB0:2-MB or 4-MB pages, 4-way associative, 32 entries", //0x5a
			"Data TLB0:4-KB or 4-MB pages, 4-way associative, 64 entries", //0x5b
			"Data TLB0:4-KB or 4-MB pages, 4-way associative, 128 entries", //0x5c
			"Data TLB0:4-KB or 4-MB pages, 4-way associative, 256 entries", //0x5d
			"", //0x5e
			"", //0x5f
			"1st-level data cache: 16-KB, 8-way set associative, sectored cache, 64-byte line size", //0x60
			"", //0x61
			"", //0x62
			"", //0x63
			"", //0x64
			"", //0x65
			"1st-level data cache: 8-KB, 4-way set associative, sectored cache, 64-byte line size", //0x66
			"1st-level data cache: 16-KB, 4-way set associative, sectored cache, 64-byte line size", //0x67
			"1st-level data cache: 32-KB, 4-way set associative, sectored cache, 64-byte line size", //0x68
			"", //0x69
			"", //0x6a
			"", //0x6b
			"", //0x6c
			"", //0x6d
			"", //0x6e
			"", //0x6f
			"Trace cache: 12K-uops, 8-way set associative", //0x70
			"Trace cache: 16K-uops, 8-way set associative", //0x71
			"Trace cache: 32K-uops, 8-way set associative", //0x72
			"Trace cache: 64K-uops, 8-way set associative", //0x73
			"", //0x74
			"", //0x75
			"", //0x76
			"", //0x77
			"2nd-level cache: 1-MB, 4-way set associative, 64-byte line size", //0x78
			"2nd-level cache: 128-KB, 8-way set associative, sectored cache, 64-byte line size", //0x79
			"2nd-level cache: 256-KB, 8-way set associative, sectored cache, 64-byte line size", //0x7a
			"2nd-level cache: 512-KB, 8-way set associative, sectored cache, 64-byte line size", //0x7b
			"2nd-level cache: 1-MB, 8-way set associative, sectored cache, 64-byte line size", //0x7c
			"2nd-level cache: 2-MB, 8-way set associative, 64-byte line size", //0x7d
			"", //0x7e
			"2nd-level cache: 512-KB, 2-way set associative, 64-byte line size", //0x7f
			"", //0x80
			"", //0x81
			"2nd-level cache: 256-KB, 8-way set associative, 32-byte line size", //0x82
			"2nd-level cache: 512-KB, 8-way set associative, 32-byte line size", //0x83
			"2nd-level cache: 1-MB, 8-way set associative, 32-byte line size", //0x84
			"2nd-level cache: 2-MB, 8-way set associative, 32-byte line size", //0x85
			"2nd-level cache: 512-KB, 4-way set associative, 64-byte line size", //0x86
			"2nd-level cache: 1-MB, 8-way set associative, 64-byte line size", //0x87
			"", //0x88
			"", //0x89
			"", //0x8a
			"", //0x8b
			"", //0x8c
			"", //0x8d
			"", //0x8e
			"", //0x8f
			"", //0x90
			"", //0x91
			"", //0x92
			"", //0x93
			"", //0x94
			"", //0x95
			"", //0x96
			"", //0x97
			"", //0x98
			"", //0x99
			"", //0x9a
			"", //0x9b
			"", //0x9c
			"", //0x9d
			"", //0x9e
			"", //0x9f
			"", //0xa0
			"", //0xa1
			"", //0xa2
			"", //0xa3
			"", //0xa4
			"", //0xa5
			"", //0xa6
			"", //0xa7
			"", //0xa8
			"", //0xa9
			"", //0xaa
			"", //0xab
			"", //0xac
			"", //0xad
			"", //0xae
			"", //0xaf
			"Instruction TLB:4-KB Pages, 4-way set associative, 128 entries", //0xb0
			"Instruction TLB:2-MB Pages, 4-way, 8 entries or 4M pages, 4-way, 4 entries", //0xb1
			"Instruction TLB:4-KB Pages, 4-way set associative, 64 entries", //0xb2
			"Data TLB: 4-KB Pages, 4-way set associative, 128 entries", //0xb3
			"Data TLB: 4-KB Pages, 4-way set associative, 256 entries", //0xb4
			"", //0xb5
			"", //0xb6
			"", //0xb7
			"", //0xb8
			"", //0xb9
			"", //0xba
			"", //0xbb
			"", //0xbc
			"", //0xbd
			"", //0xbe
			"", //0xbf
			"", //0xc0
			"", //0xc1
			"", //0xc2
			"", //0xc3
			"", //0xc4
			"", //0xc5
			"", //0xc6
			"", //0xc7
			"", //0xc8
			"", //0xc9
			"Shared 2nd-level TLB: 4KB pages, 4-way seet associative, 512 entries", //0xca
			"", //0xcb
			"", //0xcc
			"", //0xcd
			"", //0xce
			"", //0xcf
			"512KB L3 Cache, 4-way set associative, 64-byte line size", //0xd0
			"1-MB L3 Cache, 4-way set associative, 64-byte line size", //0xd1
			"2-MB L3 Cache, 4-way set associative, 64-byte line size", //0xd2
			"", //0xd3
			"", //0xd4
			"", //0xd5
			"1-MB L3 Cache, 8-way set associative, 64-byte line size", //0xd6
			"2-MB L3 Cache, 8-way set associative, 64-byte line size", //0xd7
			"4-MB L3 Cache, 8-way set associative, 64-byte line size", //0xd8
			"", //0xd9
			"", //0xda
			"", //0xdb
			"1.5-MB L3 Cache, 12-way set associative, 64-byte line size", //0xdc
			"3-MB L3 Cache, 12-way set associative, 64-byte line size", //0xdd
			"6-MB L3 Cache, 12-way set associative, 64-byte line size", //0xde
			"", //0xdf
			"", //0xe0
			"", //0xe1
			"2-MB L3 Cache, 16-way set associative, 64-byte line size", //0xe2
			"4-MB L3 Cache, 16-way set associative, 64-byte line size", //0xe3
			"8-MB L3 Cache, 16-way set associative, 64-byte line size", //0xe4
			"", //0xe5
			"", //0xe6
			"", //0xe7
			"", //0xe8
			"", //0xe9
			"12-MB L3 Cache, 24-way set associative, 64-byte line size", //0xea
			"18-MB L3 Cache, 24-way set associative, 64-byte line size", //0xeb
			"24-MB L3 Cache, 24-way set associative, 64-byte line size", //0xec
			"", //0xed
			"", //0xee
			"", //0xef
			"64-byte Prefetching", //0xf0
			"128-byte Prefetching", //0xf1
			"", //0xf2
			"", //0xf3
			"", //0xf4
			"", //0xf5
			"", //0xf6
			"", //0xf7
			"", //0xf8
			"", //0xf9
			"", //0xfa
			"", //0xfb
			"", //0xfc
			"", //0xfd
			"", //0xfe
			"", //0xff
			};
			
const char *brand_id[] = {
			"",//0x00
			"Intel(R) Celeron(R) Processor",//0x01
			"Intel(R) Pentium(R)III Processor",//0x02
			"Intel(R) Pentium(R)III Xeon Processor",//0x03
			"Intel(R) Pentium(R)III Processor",//0x04
			"",//0x05
			"Mobile Intel(R) Pentium(R)III Processor-M",//0x06
			"Mobile Intel(R) Celeron(R)III Processor",//0x07
			"Intel(R) Pentium(R)4 Processor",//0x08
			"Intel(R) Pentium(R)4 Processor",//0x09
			"Intel(R) Celeron(R) Processor",//0x0A
			"Intel(R) Xeon(R) Processor",//0x0B
			"Intel(R) Xeon(R) Processor MP",//0x0C
			"",//0X0D
			"Mobile Intel(R) Pentium(R)4 Processor-M",//0x0E
			"Mobile Intel(R) Celeron(R)Processor",//0x0F
			"",//0x10
			"Mobile Genuine Intel(R) Processor",//0x11
			"Intel(R) Celeron(R) M Processor",//0x12
			"Mobile Intel(R) Celeron(R) Processor",//0x13
			"Intel(R) Celeron(R) Processor",//0x14
			"Mobile Genuine Intel(R) Processor",//0x15
			"Intel(R) Pentium(R) M Processor",//0x16
			"Mobile Intel(R) Celeron(R)Processor",//0x17
			};
const char *brand_id_ex[] = {
			"",//0x00
			"",//0x01
			"",//0x02
			"Intel(R) Celeron(R) Processor",//0x03
			"",//0x04
			"",//0x05
			"",//0x06
			"",//0x07
			"Intel(R) Genuine Processor",//0x08
			"",//0x09
			"",//0x0a
			"Intel(R) Xeon(R) Processor MP",//0x0b
			"",//0x0c
			"",//0x0d
			"Intel(R) Xeon(R) Processor",//0x0e
			};
			
			
typedef	struct _STR_CPUID_VENDOR {
	int maximumFuncNumber;
	char vendor[13];
	}STR_CPUID_VENDOR;
	
typedef struct _STR_CPUID_BASEINFO{
	int processor_sig;
	int core_num;
	int brand_id;
	int stepping_id;
	int modul_number;
	int family_code;
	int type;
	int extended_model;
	int extended_family;
	int feature_flag_ecx;
	int feature_flag_edx;
	int fast_system_call;
	}STR_CPUID_BASEINFO;
	
typedef struct _STR_CPUID_CACHE{
	int descriptor_value_eax;
	int descriptor_value_ebx;
	int descriptor_value_ecx;
	int descriptor_value_edx;
	}STR_CPUID_CACHE;
	
typedef	struct _STR_CPUID_CACHE_PARAMETER{
	int apic;
	int maximun_threads;
	int full_associative;
	int self_initializing; // 0 or 1
	int cache_level;
	int cache_type;
	int associative_way;
	int physicaly_line_partion;
	int system_coherency_size;
	int num_of_sets;
	struct _STR_CPUID_CACHE_PARAMETER * next;
	}STR_CPUID_CACHE_PARAMETER;
	
typedef struct _STR_CPUID_MONITOR_NWAIT_PARAMETER{
	int smallest_minitor_line_size;
	int largest_monitor_line_size;
	int support_TIBE;
	int support_MBEx;
	int number_C7_C4;
	int number_C6_C3;
	int number_C2;
	int number_C1;
	int number_C0;
	}STR_CPUID_MONITOR_NWAIT_PARAMETER;

//cpuid.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "myCPUZ.h"

int canExcuteIns()
{
	//this function check wether your cpu support cpuid or not
	int a = 0;
	asm(
		"pushf\n\t"
		"popl		%%eax\n\t"
		"movl	%%eax,	%%ecx\n\t"
		"xorl		$0x200000,		%%eax\n\t"
		"pushl	%%eax\n\t"
		"popf\n\t"
		"pushf\n\t"
		"popl		%%eax\n\t"
		"test		%%eax,		%%ecx\n\t"
		"je		1f\n\t"
		"movl	$1,				%0\n\t"
		"jmp		2f\n\t"
		"1:\n\t"
		"movl	$0,				%0\n\t"
		"2:\n\t"
		:"=r"(a)
		:
		:"eax","ecx"
	);
	return a;
}

void GetCPUVendor(STR_CPUID_VENDOR *vendor)
{
	//before you use this function , define "char vendor[13]" in parant function
	int core_num;
	asm(
		"cpuid\n\t"
		"movl	%%ebx,	(%1)\n\t"
		"movl	%%edx,	4(%1)\n\t"
		"movl	%%ecx,	8(%1)\n\t"
		:"=a"(vendor->maximumFuncNumber)
		:"D"(vendor->vendor),"0"(0)
		:"ecx","edx"
	);
}
void GetCPUBaseInfo(STR_CPUID_BASEINFO *baseinfo)
{
	int org_info;
	int core_num;
	asm(
		"cpuid\n\t"
		:"=a"(org_info),"=b"(core_num),"=c"(baseinfo->feature_flag_ecx),"=d"(baseinfo->feature_flag_edx)
		:"0"(1)
		:
	);
	baseinfo->processor_sig = org_info;
	baseinfo->core_num = (core_num & 0xff0000) >> 16;
	baseinfo->brand_id = core_num & 0xff;
	baseinfo->stepping_id = (org_info & 0xf);
	baseinfo->modul_number = (org_info & 0xf0) >> 4;
	baseinfo->family_code = (org_info & 0xf00) >> 8;
	baseinfo->type = (org_info & 0x3000) >> 12;
	baseinfo->extended_model = (org_info & 0xf0000) >> 16;
	baseinfo->extended_family = (org_info & 0xff00000) >> 20;
	
	if((baseinfo->feature_flag_edx >> 10) & 0x01)
	{
		if((org_info & 0xfff3fff) < 0x633)
		{
			baseinfo->fast_system_call = 0;
		}
		else
		{
			baseinfo->fast_system_call = 1;
		}
	}

}

void GetCacheDescriptors(STR_CPUID_CACHE *cache)
{
	asm(
		"cpuid\n\t"
		:"=a"(cache->descriptor_value_eax),"=b"(cache->descriptor_value_ebx),"=c"(cache->descriptor_value_ecx),"=d"(cache->descriptor_value_edx)
		:"0"(2)
		);
}

void GetCacheParameter(STR_CPUID_CACHE_PARAMETER * cache_parameter_head)
{
	STR_CPUID_CACHE_PARAMETER *p = cache_parameter_head;
	p->next = NULL;
	int input = 0;
	int org_eax = 1, org_ebx, org_ecx, org_edx;
	while(org_eax)
	{
		asm(
			"cpuid\n\t"
			:"=a"(org_eax),"=b"(org_ebx),"=c"(org_ecx),"=d"(org_edx)
			:"0"(4),"c"(input)
			);
		if(org_eax & 0xf)
		{
			STR_CPUID_CACHE_PARAMETER *cache_parameter = (STR_CPUID_CACHE_PARAMETER *)calloc(1,sizeof(STR_CPUID_CACHE_PARAMETER));
			
			cache_parameter->apic = ((org_eax & 0xfc000000) >> 26) + 1;
			cache_parameter->maximun_threads = ((org_eax & 0x3ffc000) >> 14) + 1;
			cache_parameter->full_associative = (org_eax & 0x200) >> 9;
			cache_parameter->self_initializing = (org_eax & 0x100) >> 8;
			cache_parameter->cache_level = (org_eax & 0xe0) >> 5;
			cache_parameter->cache_type = org_eax & 0xf;
			cache_parameter->associative_way = ((org_ebx & 0xffc00000) >> 22) + 1;
			cache_parameter->physicaly_line_partion = ((org_ebx & 0x3ff000) >> 12) +1;
			cache_parameter->system_coherency_size = (org_ebx & 0xfff) +1;
			cache_parameter->num_of_sets = org_ecx + 1;
			
			p->next = cache_parameter;
			p = cache_parameter;
			p->next = NULL;
			++input;
			continue;
		}
		org_eax = 0;
	}
}

void GetMonitorNwaitParameter(STR_CPUID_MONITOR_NWAIT_PARAMETER * mn_parameter)
{
	int org_eax, org_ebx, org_ecx, org_edx;
	asm(
		"cpuid\n\t"
		:"=a"(org_eax),"=b"(org_ebx),"=c"(org_ecx),"=d"(org_edx)
		:"0"(5)
		:
		);
	mn_parameter->smallest_minitor_line_size = org_eax & 0xffff;
	mn_parameter->largest_monitor_line_size = org_ebx & 0xffff;
	mn_parameter->support_TIBE = org_ecx & 0x2;
	mn_parameter->support_MBEx = org_ecx & 0x1;
	mn_parameter->number_C7_C4 = ((org_edx & 0xf0000) >> 16);
	mn_parameter->number_C6_C3 = ((org_edx & 0xf000) >> 12);
	mn_parameter->number_C2 = ((org_edx & 0xf00) >> 8);
	mn_parameter->number_C1 = ((org_edx & 0xf0) >> 4);
	mn_parameter->number_C0 = org_edx & 0xf;
}

char * GetCPUName(char *name)
{
	int i = 0;
	asm(
		"movl	$0x80000002,	%%eax\n\t"
		"movl	$3,	%%ecx\n\t"
		"0:\n\t"
		"pushl	%%eax\n\t"
		"pushl	%%ecx\n\t"
		"cpuid\n\t"
		"movl	%%eax,	(%0,%1,8)\n\t"
		"movl	%%ebx,	4(%0,%1,8)\n\t"
		"movl	%%ecx,	8(%0,%1,8)\n\t"
		"movl	%%edx,	12(%0,%1,8)\n\t"
		"popl		%%ecx\n\t"
		"popl		%%eax\n\t"
		"incl		%%eax\n\t"
		"addl		$2,	%1\n\t"
		"loop 0b\n\t"
		:
		:"D"(name),"r"(i)
		:"eax","ebx","ecx","edx"
		);
	return name;
}

int main(void)
{
	int i,j;
	int* p_i;
	
	char brand_string[49] = {0};

	STR_CPUID_VENDOR *cpuid_vendor = (STR_CPUID_VENDOR *)calloc(1,sizeof(STR_CPUID_VENDOR));
	STR_CPUID_BASEINFO  *cpuid_baseinfo = (STR_CPUID_BASEINFO *)calloc(1,sizeof(STR_CPUID_BASEINFO));
	STR_CPUID_CACHE *cpuid_cache = (STR_CPUID_CACHE *)calloc(1,sizeof(STR_CPUID_CACHE));
	STR_CPUID_CACHE_PARAMETER *cpuid_cache_parameter_head  = (STR_CPUID_CACHE_PARAMETER *)calloc(1,sizeof(STR_CPUID_CACHE_PARAMETER));
	STR_CPUID_CACHE_PARAMETER *p = cpuid_cache_parameter_head;
	STR_CPUID_MONITOR_NWAIT_PARAMETER *cpuid_mn_parameter = (STR_CPUID_MONITOR_NWAIT_PARAMETER *)calloc(1,sizeof(STR_CPUID_MONITOR_NWAIT_PARAMETER));

	if(!canExcuteIns())
	{
		printf("Your CPU does't Support CPUID INS!\nPress Enter to Exit\n");
		getchar();
		return 1;
	}
	else
	{
		printf("Your CPU Support CPUID INS!");
		getchar();
	}
	puts("#################### CPU INFO #########################");
	
	//Get CPU Vendor 
	//memset(cpuid_vendor,0,sizeof(cpuid_vendor));
	GetCPUVendor(cpuid_vendor);
	printf("CPU Maximum func:\t\t%d\n",cpuid_vendor->maximumFuncNumber);
	printf("CPU Vendor:\t\t\t%s\n",cpuid_vendor->vendor);
	printf("CPU Name:\t\t\t%s\n",GetCPUName(brand_string));
	
	//Get CPU Base Info
	GetCPUBaseInfo(cpuid_baseinfo);
	printf("CPU ID\t\t\t\t%s\n",
		(cpuid_baseinfo->brand_id)?
			(((cpuid_baseinfo->processor_sig ==  0x6b1) || (cpuid_baseinfo->processor_sig ==  0xf13) )?
				brand_id_ex[cpuid_baseinfo->brand_id]:
				brand_id[cpuid_baseinfo->brand_id]):
			"NOT SUPPORT!");
	printf("CPU Number:\t\t\t%d\n",cpuid_baseinfo->core_num);
	printf("CPU Stepping ID\t\t\t%d\n",cpuid_baseinfo->stepping_id);
	printf("CPU Model Number\t\t%d\n",cpuid_baseinfo->modul_number);
	printf("CPU Family Code \t\t%d\n",cpuid_baseinfo->family_code);
	printf("CPU type \t\t\t%d\n",cpuid_baseinfo->type);
	printf("CPU Extended Model\t\t%d\n",cpuid_baseinfo->extended_model);
	printf("CPU Extended Family\t\t%d\n",cpuid_baseinfo->extended_family);
	printf("CPU Feature Flag\t\t");

	//Get CPU Feature Flag
	for(i = 0 ; i <  64; i++)
	{
		if((i<32)?((cpuid_baseinfo->feature_flag_ecx  >> i) & 0x1):((cpuid_baseinfo->feature_flag_edx  >> (i-32)) & 0x1))
		{
			printf("%s",feature_flag_names[i]);
		}
		(i%10== 0 && i !=0 )?printf("\n\t\t\t\t"):i;
	}
	
	//Fast system call
	__w("\n%s\t\t%s\n","CPU Fast System Call",cpuid_baseinfo->fast_system_call?"YES":"NO");
	
	//Get Cache Infomation
	GetCacheDescriptors(cpuid_cache);
	
	//analysis EAX register
	for(j = 0; j < 4; j++)
	{
		p_i = &(cpuid_cache->descriptor_value_eax) + j;
		for(i = 0; i < 4; i++)
		{
			printf("CPU Cache\t\t\t%s\n",descriptor_decode_values[(*p_i & (0xff << ( i << 3))) >> (i << 3)]);
		}
	}
	
	//Get Cache Paramemter
	GetCacheParameter(p);
	
	while(p->next)
	{
		p = p->next;
		puts(">>>>>>>>>>>>>>>>>CPU CACHE<<<<<<<<<<<<<<<<<<");
	
		__w("CPU APIC\t\t\t%d\n",p->apic);
		__w("CPU maximun_threads\t\t%d\n",p->maximun_threads);
		__w("CPU full_associative\t\t%d\n",p->full_associative);
		__w("CPU self_initializing\t\t%d\n",p->self_initializing);
		__w("CPU Cache cache_level\t\t%d\n",p->cache_level);
		__w("CPU Cache cache_type\t\t%s\t\n",cache_type[p->cache_type]);
		__w("CPU Cache associative_way\t%d\n",p->associative_way);
		__w("CPU physicaly_line_partion\t%d\n",p->physicaly_line_partion);
		__w("CPU Cache system_coherency_size\t%d\n",p->system_coherency_size);
		__w("CPU Cache num_of_sets\t\t%d\n",p->num_of_sets);
		__w("CPU Total Cache \t\t%d KB\n",(p->associative_way * p->physicaly_line_partion * p->system_coherency_size * p->num_of_sets)>>10);
		
	}
	
	//Get MN Parameter
	GetMonitorNwaitParameter(cpuid_mn_parameter);
	
	__w("CPU smallest_minitor_line_size\t%d BYTE\n",cpuid_mn_parameter->smallest_minitor_line_size);
	__w("CPU largest_monitor_line_size\t%d BYTE\n",cpuid_mn_parameter->largest_monitor_line_size);
	__w("CPU support_TIBE\t\t%s\n",cpuid_mn_parameter->support_TIBE?"YES":"NO");
	__w("CPU support_MBEx\t\t%s\n",cpuid_mn_parameter->support_MBEx?"YES":"NO");
	__w("CPU number_C7_C4\t\t%d\n",cpuid_mn_parameter->number_C7_C4);
	__w("CPU number_C6_C3\t\t%d\n",cpuid_mn_parameter->number_C6_C3);
	__w("CPU number_C2\t\t\t%d\n",cpuid_mn_parameter->number_C2);
	__w("CPU number_C1\t\t\t%d\n",cpuid_mn_parameter->number_C1);
	__w("CPU number_C0\t\t\t%d\n",cpuid_mn_parameter->number_C0);

	puts("\n#################### CPU INFO #########################");
	getchar();
	return 0;
}

先写这一部分,接下来弄界面的。用VC + MinGW

posted @ 2010-12-31 18:07  CuiXS  阅读(318)  评论(0)    收藏  举报