1*bad58c9cSBen Gras/* _cpuid() - interface to cpuid instruction */ 2*bad58c9cSBen Gras 3*bad58c9cSBen Gras 4*bad58c9cSBen Gras/* void _cpuid(u32_t *eax, u32_t *ebx, u32_t *ecx, u32_t *edx); */ 5*bad58c9cSBen Gras/* 0 for OK, nonzero for unsupported */ 6*bad58c9cSBen Gras 7*bad58c9cSBen Gras#include <machine/asm.h> 8*bad58c9cSBen Gras 9*bad58c9cSBen GrasENTRY(_cpuid) 10*bad58c9cSBen Gras/* save work registers */ 11*bad58c9cSBen Gras push %ebp 12*bad58c9cSBen Gras push %ebx 13*bad58c9cSBen Gras 14*bad58c9cSBen Gras/* set eax parameter to cpuid and execute cpuid */ 15*bad58c9cSBen Gras movl 12(%esp), %ebp 16*bad58c9cSBen Gras mov (%ebp), %eax 17*bad58c9cSBen Gras movl 16(%esp), %ebp 18*bad58c9cSBen Gras mov (%ebp), %ebx 19*bad58c9cSBen Gras movl 20(%esp), %ebp 20*bad58c9cSBen Gras mov (%ebp), %ecx 21*bad58c9cSBen Gras movl 24(%esp), %ebp 22*bad58c9cSBen Gras mov (%ebp), %edx 23*bad58c9cSBen Gras 24*bad58c9cSBen Gras.byte 0x0F, 0xA2 /* CPUID */ 25*bad58c9cSBen Gras 26*bad58c9cSBen Gras/* store results in pointer arguments */ 27*bad58c9cSBen Gras movl 12(%esp), %ebp 28*bad58c9cSBen Gras movl %eax, (%ebp) 29*bad58c9cSBen Gras movl 16(%esp), %ebp 30*bad58c9cSBen Gras movl %ebx, (%ebp) 31*bad58c9cSBen Gras movl 20(%esp), %ebp 32*bad58c9cSBen Gras movl %ecx, (%ebp) 33*bad58c9cSBen Gras movl 24(%esp), %ebp 34*bad58c9cSBen Gras movl %edx, (%ebp) 35*bad58c9cSBen Gras 36*bad58c9cSBen Gras/* restore registers */ 37*bad58c9cSBen Gras pop %ebx 38*bad58c9cSBen Gras pop %ebp 39*bad58c9cSBen Gras 40*bad58c9cSBen Gras ret 41