294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
|
/*
* This workaround is required by older GCC versions when using -fPIC,
* as ebx is a special register in PIC code. Yes, GCC is indeed not
* able to just push a register onto the stack before the __asm__ block
* and to pop it afterwards.
*/
__asm__ (
"xchgl %%ebx, %%edi\n\t"
"cpuid\n\t"
"xchgl %%edi, %%ebx"
: "=a"(regs.eax), "=D"(regs.ebx), "=c"(regs.ecx), "=d"(regs.edx)
: "a"(eax), "c"(ecx)
);
# else
memset(®s, 0, sizeof(regs));
# endif
|
|
|
|
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
|
/*
* This workaround is required by older GCC versions when using -fPIC,
* as ebx is a special register in PIC code. Yes, GCC is indeed not
* able to just push a register onto the stack before the __asm__ block
* and to pop it afterwards.
*/
__asm__ (
"xchg{l} { %%ebx, %%edi | edi, ebx }\n\t"
"cpuid\n\t"
"xchg{l} { %%edi, %%ebx | ebx, edi }"
: "=a"(regs.eax), "=D"(regs.ebx), "=c"(regs.ecx), "=d"(regs.edx)
: "a"(eax), "c"(ecx)
);
# else
memset(®s, 0, sizeof(regs));
# endif
|