57 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable File
		
	
	
	
	
!	getprocessor() - determine processor type	Author: Kees J. Bot
 | 
						|
!								26 Jan 1994
 | 
						|
 | 
						|
.sect .text; .sect .rom; .sect .data; .sect .bss
 | 
						|
.sect .text
 | 
						|
 | 
						|
! int getprocessor(void);
 | 
						|
!	Return 386, 486, 586, ...
 | 
						|
 | 
						|
.define	_getprocessor
 | 
						|
 | 
						|
_getprocessor:
 | 
						|
	push	ebp
 | 
						|
	mov	ebp, esp
 | 
						|
	and	esp, 0xFFFFFFFC	! Align stack to avoid AC fault
 | 
						|
	mov	ecx, 0x00040000	! Try to flip the AC bit introduced on the 486
 | 
						|
	call	flip
 | 
						|
	mov	eax, 386	! 386 if it didn't react to "flipping"
 | 
						|
	jz	gotprocessor
 | 
						|
	mov	ecx, 0x00200000	! Try to flip the ID bit introduced on the 586
 | 
						|
	call	flip
 | 
						|
	mov	eax, 486	! 486 if it didn't react
 | 
						|
	jz	gotprocessor
 | 
						|
	pushf
 | 
						|
	pusha			! Save the world
 | 
						|
	mov	eax, 1
 | 
						|
	.data1	0x0F, 0xA2	! CPUID instruction tells the processor type
 | 
						|
	andb	ah, 0x0F	! Extract the family (5, 6, ...)
 | 
						|
	movzxb	eax, ah
 | 
						|
	cmp	eax, 15		! 15: extended family
 | 
						|
	jne	direct
 | 
						|
	mov	eax, 6		! Make it 686
 | 
						|
direct:
 | 
						|
	imul	eax, 100	! 500, 600, ...
 | 
						|
	add	eax, 86		! 586, 686, ...
 | 
						|
	mov	7*4(esp), eax	! Pass eax through
 | 
						|
	popa
 | 
						|
	popf
 | 
						|
gotprocessor:
 | 
						|
	leave
 | 
						|
	ret
 | 
						|
 | 
						|
flip:
 | 
						|
	pushf			! Push eflags
 | 
						|
	pop	eax		! eax = eflags
 | 
						|
	mov	edx, eax	! Save original eflags
 | 
						|
	xor	eax, ecx	! Flip the bit to test
 | 
						|
	push	eax		! Push modified eflags value
 | 
						|
	popf			! Load modified eflags register
 | 
						|
	pushf
 | 
						|
	pop	eax		! Get it again
 | 
						|
	push	edx
 | 
						|
	popf			! Restore original eflags register
 | 
						|
	xor	eax, edx	! See if the bit changed
 | 
						|
	test	eax, ecx
 | 
						|
	ret
 |