Initial revision
This commit is contained in:
Executable
+92
@@ -0,0 +1,92 @@
|
||||
! getprocessor() - determine processor type Author: Kees J. Bot
|
||||
! 26 Jan 1994
|
||||
|
||||
.text
|
||||
|
||||
o32 = 0x66 ! 32 bit operand size prefix
|
||||
|
||||
! int getprocessor(void);
|
||||
! Return 86, 186, 286, 386, 486, 586, ...
|
||||
|
||||
.define _getprocessor
|
||||
|
||||
_getprocessor:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push sp ! see if pushed sp == sp
|
||||
pop ax
|
||||
cmp ax, sp
|
||||
jz new_processor
|
||||
mov cx, #0x0120 ! see if shifts are mod 32
|
||||
shlb ch, cl ! zero tells if 86
|
||||
mov ax, #86
|
||||
jz got_processor
|
||||
mov ax, #186
|
||||
jmp got_processor
|
||||
|
||||
new_processor: ! see if high bits are set in saved IDT
|
||||
sub sp, #6 ! space for IDT ptr
|
||||
sidt -6(bp) ! save 3 word IDT ptr
|
||||
cmpb -1(bp), #0xFF ! top byte of IDT ptr is always FF on 286
|
||||
mov ax, #286
|
||||
je got_processor
|
||||
|
||||
! 386, 486, 586
|
||||
and sp, #0xFFFC ! Align stack to avoid AC fault (needed?)
|
||||
mov cx, #0x0004 ! Try to flip the AC bit introduced on the 486
|
||||
call flip
|
||||
mov ax, #386 ! 386 if it didn't react to "flipping"
|
||||
jz got_processor
|
||||
mov cx, #0x0020 ! Try to flip the ID bit introduced on the 586
|
||||
call flip
|
||||
mov ax, #486 ! 486 if it didn't react
|
||||
jz got_processor
|
||||
.data1 o32
|
||||
pushf
|
||||
.data1 o32
|
||||
pusha ! Save the world
|
||||
.data1 o32
|
||||
xor ax, ax
|
||||
inc ax ! eax = 1
|
||||
.data1 0x0F, 0xA2 ! CPUID instruction tells the processor type
|
||||
andb ah, #0x0F ! Extract the family (5, 6, ...)
|
||||
movb al, ah
|
||||
movb ah, #100
|
||||
mulb ah ! 500, 600, ...
|
||||
add ax, #86 ! 586, 686, ...
|
||||
mov bx, sp
|
||||
mov 7*4(bx), ax ! Pass ax through
|
||||
.data1 o32
|
||||
popa
|
||||
.data1 o32
|
||||
popf
|
||||
|
||||
got_processor:
|
||||
mov sp, bp
|
||||
pop bp
|
||||
ret
|
||||
|
||||
flip:
|
||||
push bx ! Save bx and realign stack to multiple of 4
|
||||
.data1 o32 ! About to operate on a 32 bit object
|
||||
pushf ! Push eflags
|
||||
pop ax
|
||||
pop dx ! dx:ax = eflags
|
||||
mov bx, dx ! Save original eflags (high word only)
|
||||
xor dx, cx ! Flip the bit to test
|
||||
push dx
|
||||
push ax ! Push modified eflags value
|
||||
.data1 o32
|
||||
popf ! Load modified eflags register
|
||||
.data1 o32
|
||||
pushf
|
||||
pop ax
|
||||
pop dx ! Get it again
|
||||
push bx
|
||||
push ax
|
||||
.data1 o32
|
||||
popf ! Restore original eflags register
|
||||
xor dx, bx ! See if the bit changed
|
||||
test dx, cx
|
||||
pop bx ! Restore bx
|
||||
ret
|
||||
Reference in New Issue
Block a user