CPUID instructions are complex instructions. It can be used to extract processor properties. CPUID instruction is a serializing instruction, i.e when executed, all concurrent, speculative and pipelined executions are stopped.
Information such as Processor, Cache/TLB, Cache Parameters, Performance Monitoring, L2 Cache information can be retrieved from user-space.
Refer to Intel Developer Instruction Manual.
typedef struct cpuid {
uint32_t eax;
uint32_t ebx;
uint32_t ecx;
uint32_t edx;
} cpuid_t;
static cpuid_t
get_cpu_id(uint32_t id)
{
cpuid_t cpu;
asm("mov %%ebx, %%esi\n\t"
"cpuid\n\t"
"xchg %%esi, %%ebx"
: "=a" (cpu.eax),
"=S" (cpu.ebx),
"=c" (cpu.ecx),
"=d" (cpu.edx)
: "a" (id)
);
return (cpu);
}
int
main()
{
cpuid_t cpu;
char name[100];
/* issue CPUID 0 instruction to read CPU information */
cpu = get_cpu_id(0);
printf("cpu.eax is %d\n", cpu.eax);
sprintf(n, "%.4s%.4s%.4s\n", (char *)&cpu.ebx, (char *)&cpu.ecx, (char *)&cpu.edx);
printf("processor name is %s\n", name);
cpu = get_cpu_id(1);
printf("Processor Type is %x\n", (cpu.eax & 0x00003000));
printf("Family Type is %x\n", (cpu.eax & 0x00000F00) >> 8);
cpu = get_cpu_id(0x80000008);
printf("cache info phyMemory size %x\n", 1 << (cpu.eax & 0x0000000F));
printf("cache info virtMemory %x\n", 1 << (cpu.eax >> 8));
}
Information such as Processor, Cache/TLB, Cache Parameters, Performance Monitoring, L2 Cache information can be retrieved from user-space.
Refer to Intel Developer Instruction Manual.
typedef struct cpuid {
uint32_t eax;
uint32_t ebx;
uint32_t ecx;
uint32_t edx;
} cpuid_t;
static cpuid_t
get_cpu_id(uint32_t id)
{
cpuid_t cpu;
asm("mov %%ebx, %%esi\n\t"
"cpuid\n\t"
"xchg %%esi, %%ebx"
: "=a" (cpu.eax),
"=S" (cpu.ebx),
"=c" (cpu.ecx),
"=d" (cpu.edx)
: "a" (id)
);
return (cpu);
}
int
main()
{
cpuid_t cpu;
char name[100];
/* issue CPUID 0 instruction to read CPU information */
cpu = get_cpu_id(0);
printf("cpu.eax is %d\n", cpu.eax);
sprintf(n, "%.4s%.4s%.4s\n", (char *)&cpu.ebx, (char *)&cpu.ecx, (char *)&cpu.edx);
printf("processor name is %s\n", name);
cpu = get_cpu_id(1);
printf("Processor Type is %x\n", (cpu.eax & 0x00003000));
printf("Family Type is %x\n", (cpu.eax & 0x00000F00) >> 8);
cpu = get_cpu_id(0x80000008);
printf("cache info phyMemory size %x\n", 1 << (cpu.eax & 0x0000000F));
printf("cache info virtMemory %x\n", 1 << (cpu.eax >> 8));
}
No comments:
Post a Comment