42 lines
728 B
ArmAsm
42 lines
728 B
ArmAsm
|
/* _cpuid() - interface to cpuid instruction */
|
||
|
|
||
|
|
||
|
/* void _cpuid(u32_t *eax, u32_t *ebx, u32_t *ecx, u32_t *edx); */
|
||
|
/* 0 for OK, nonzero for unsupported */
|
||
|
|
||
|
.globl __cpuid
|
||
|
|
||
|
.text
|
||
|
__cpuid:
|
||
|
/* save work registers */
|
||
|
push %ebp
|
||
|
push %ebx
|
||
|
|
||
|
/* set eax parameter to cpuid and execute cpuid */
|
||
|
movl 12(%esp), %ebp
|
||
|
mov (%ebp), %eax
|
||
|
movl 16(%esp), %ebp
|
||
|
mov (%ebp), %ebx
|
||
|
movl 20(%esp), %ebp
|
||
|
mov (%ebp), %ecx
|
||
|
movl 24(%esp), %ebp
|
||
|
mov (%ebp), %edx
|
||
|
|
||
|
.byte 0x0F, 0xA2 /* CPUID */
|
||
|
|
||
|
/* store results in pointer arguments */
|
||
|
movl 12(%esp), %ebp
|
||
|
movl %eax, (%ebp)
|
||
|
movl 16(%esp), %ebp
|
||
|
movl %ebx, (%ebp)
|
||
|
movl 20(%esp), %ebp
|
||
|
movl %ecx, (%ebp)
|
||
|
movl 24(%esp), %ebp
|
||
|
movl %edx, (%ebp)
|
||
|
|
||
|
/* restore registers */
|
||
|
pop %ebx
|
||
|
pop %ebp
|
||
|
|
||
|
ret
|