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
 | 
