All pastes #638858 Raw Edit

Unnamed

public text v1 · immutable
#638858 ·published 2007-07-30 04:46 UTC
rendered paste body
//
//  ClassCPUID.m
//  CPUID
//
//  
//  Copyleft 2007 - DiegoMax
//

#import "ClassCPUID.h"


@implementation ClassCPUID
-(void)GetInfo
{
	[self GetVendorId];
	[self GetCpuName];
	[self GetStandardLevel01];
}

-(void)GetStandardLevel01
{
	uint32_t d[4];
    uint32_t s = 0x01;
        
    asm("mov %%ebx, %%esi\n\t"
        "cpuid\n\t"
        "xchg %%esi, %%ebx"
        : "=a" (d[0]),
          "=S" (d[1]),
          "=c" (d[2]),
          "=d" (d[3])
        : "a"(s)    
        );

	//The extended processor family is encoded in bits 27...20.
	uint32_t Valor = d[0] & 0x0FF00000;
	if ([CpuName compare:@"GenuineIntel"])
	{
		switch (Valor) {
		case 0x0000000:
			ExtendedFamily = [NSString stringWithString:@"Intel P4"];
			break;
		default:
			ExtendedFamily = [NSString stringWithString:@"-"];
			break;
		}
	}
	else //AMD
	{
		switch (Valor) {
		case 0x00000000:
			ExtendedFamily = [NSString stringWithString:@"AMD K8 (130 nm)"];
			break;
		case 0x00100000:
			ExtendedFamily = [NSString stringWithString:@"AMD K8 (90 nm Rev D)"];
			break;
		case 0x00200000:
			ExtendedFamily = [NSString stringWithString:@"AMD K8 (90 nm Rev E)"];
			break;
		case 0x00400000:
			ExtendedFamily = [NSString stringWithString:@"AMD K8 (90 nm Rev F)"];
			break;
		default:
			//The family is encoded in bits 11...8.
			//Si entro aca, es porque tengo un AMD K7, o sea, no es K8 y es AMD, asi que tengo que revisar
			//Los Bits 11 a 8
			Valor = d[0] & 0xF00;
			switch (Valor) {
			case 0x500:
				ExtendedFamily = [NSString stringWithString:@"AMD K5, K6"];
			case 0x600:
				ExtendedFamily = [NSString stringWithString:@"AMD K7"];
				break;
			default:
				ExtendedFamily = [NSString stringWithString:@"-"];
				break;
			}
			break;
		}
	}
	
	//The model is encoded in bits 7...4.
	Valor = d[0] & 0xF0;
	if ([CpuName compare:@"GenuineIntel"])
	{
		switch (Valor) {
		case 0x00:
			Model = [NSString stringWithString:@"P4 (0.18 µm)"];
			break;
		case 0x10:
			Model = [NSString stringWithString:@"P4 (0.18 µm)"];
			break;
		case 0x20:
			Model = [NSString stringWithString:@"P4 (0.13 µm)"];
			break;
		case 0x40:
			Model = [NSString stringWithString:@"P4 (0.09 µm)"];
			break;
		case 0x50:
			Model = [NSString stringWithString:@"P4 (0.09 µm)"];
			break;
		case 0x60:
			Model = [NSString stringWithString:@"P4 (65 nm)"];
			break;
		default:
			break;
		}
	}
	else //AMD
	{
		if ([ExtendedFamily compare:@"AMD K7"])
		{
			switch (Valor) {
			case 0x10:
				Model = [NSString stringWithString:@"Athlon (0.25 µm)"];
				break;
			//Copiar todos los Demas
			default:
				break;
			}
		}
		else if ([ExtendedFamily rangeOfString:@"K8"].location != NSNotFound)
		{
				//Es un K8
				//Tomo los primeros dos bits de los 4 que tengo para saber el socket
				Valor = Valor & 0x30;
				switch (Valor) {
				case 0x00:
					Model = [NSString stringWithString:@"Socket 754 or Socket S1"];
					break;
				case 0x10:
					Model = [NSString stringWithString:@"Socket 940"];
					break;
				case 0x20:
					Model = [NSString stringWithString:@"if Rev CG, then see K8 erratum #108"];
					break;
				default:
					break;
				}
				//Despues hay que tomar los otros dos bits de los 4 que teniamos y verificar la otra info
			
		}	
	}
	
	[Model retain];
	[ExtendedFamily retain];
	
}
-(void)GetVendorId
{
	uint32_t d[4];
    uint32_t s = 0x00;
        
    asm("mov %%ebx, %%esi\n\t"
        "cpuid\n\t"
        "xchg %%esi, %%ebx"
        : "=a" (d[0]),
          "=S" (d[1]),
          "=c" (d[2]),
          "=d" (d[3])
        : "a"(s)    
        );
	
	VendorID = [NSString stringWithCString:&d length:16];
	[VendorID retain];
}


-(void)GetCpuName
{
	uint32_t d[4];
    uint32_t s = 0x80000002;
        
    asm("mov %%ebx, %%esi\n\t"
        "cpuid\n\t"
        "xchg %%esi, %%ebx"
        : "=a" (d[0]),
          "=S" (d[1]),
          "=c" (d[2]),
          "=d" (d[3])
        : "a"(s)    
        );
	
	NSString *CpuName1 = [NSString stringWithCString:&d length:16];

    s = 0x80000003;
        
    asm("mov %%ebx, %%esi\n\t"
        "cpuid\n\t"
        "xchg %%esi, %%ebx"
        : "=a" (d[0]),
          "=S" (d[1]),
          "=c" (d[2]),
          "=d" (d[3])
        : "a"(s)    
        );
	
	NSString *CpuName2 = [NSString stringWithCString:&d length:16];

    s = 0x80000004;
        
    asm("mov %%ebx, %%esi\n\t"
        "cpuid\n\t"
        "xchg %%esi, %%ebx"
        : "=a" (d[0]),
          "=S" (d[1]),
          "=c" (d[2]),
          "=d" (d[3])
        : "a"(s)    
        );
	
	NSString *CpuName3 = [NSString stringWithCString:&d length:16];
	
	CpuName = [[CpuName1 stringByAppendingString:CpuName2] stringByAppendingString: CpuName3];
	[CpuName retain];
}
-(void)dealloc {
	[CpuName release];
	[VendorID release];
	[ExtendedFamily release];
	[super dealloc];
}

@end