xref: /minix3/minix/lib/libc/arch/i386/_cpuid.S (revision bad58c9c5145c5fa2a65ce5ca37ceebbbd315e2d)
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