Comment détecter si l'instruction CPUID est implémentée sur un
processeur i386 ?
Qu'est-ce que CPUID me direz-vous ?
CPUID est une instruction disponible sur les processeurs i386 et supérieur
(CISC).
A quoi sert-elle ?
Cette instruction permet de récupérer des informations sur votre processeur.
En effet, par le biais de cette instruction et via la commande mise dans le
registre %eax, nous pouvons récupérer diverses informations telle que
le type de processeur, possibilités (PAE, PSE, ...).
Bref des trucs bien sympatoches...
Mais dans un premier temps, il faut vérifier que cette instruction est disponible sur le processeur. Pour cela il faut modifier le bit 21 du registre EFLAGS ceci afin de voir si celui-ci est modifiable ou non.
Comment fait-on cela ?
Ainsi :
static int destect_cpuid_instr()
{
int result = -1;
/* 0x200000 = bit 21 */
asm volatile (
"pushf\n"
"popl %%eax\n"
"xorl $0x200000, %%eax\n"
"movl %%eax, %%ecx\n"
"andl $0x200000, %%ecx\n"
"pushl %%eax\n"
"popf\n"
"pushf\n"
"popl %%eax\n"
"andl $0x200000, %%eax\n"
"xorl %%eax, %%ecx\n"
"movl %%ecx, %0\n"
: "=r" (result) : : "eax", "ecx");
return (result == 0);
}
REMARQUE: