327 lines
5.7 KiB
PHP
327 lines
5.7 KiB
PHP
;++
|
|
;
|
|
; Copyright (c) 1989 Microsoft Corporation
|
|
;
|
|
; Module Name:
|
|
;
|
|
; intmac.inc
|
|
;
|
|
; Abstract:
|
|
;
|
|
; This module contains macros to allow code running in 16 bit protected
|
|
; mode to manipulate the virtual interrupt flag
|
|
;
|
|
; Author:
|
|
;
|
|
; Dave Hastings (daveh) 24-Apr-1992
|
|
;
|
|
; Revision History:
|
|
;
|
|
;--
|
|
|
|
|
|
VDM_INT_TRAP_GATE EQU 00000000h
|
|
VDM_INT_INT_GATE EQU 00000001h
|
|
VDM_INT_32 EQU 00000002h
|
|
VDM_INT_16 EQU 00000000h
|
|
EFLAGS_VIF equ 080000H
|
|
|
|
ifdef WOW_x86
|
|
include vint.inc
|
|
riret macro
|
|
local a,b,c,d
|
|
push bp
|
|
mov bp,sp
|
|
push ax
|
|
push ds
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov ax,[bp+6]
|
|
test ax,200h
|
|
jz a
|
|
test ds:FIXED_NTVDMSTATE_REL40,RI_BIT_MASK
|
|
jz c
|
|
sti
|
|
c: lock or word ptr ds:FIXED_NTVDMSTATE_REL40, VIRTUAL_INTERRUPT_BIT
|
|
jmp short b
|
|
a:
|
|
test ds:FIXED_NTVDMSTATE_REL40,RI_BIT_MASK
|
|
jz d
|
|
cli
|
|
d: lock and word ptr ds:FIXED_NTVDMSTATE_REL40,NOT VIRTUAL_INTERRUPT_BIT
|
|
b:
|
|
pop ds
|
|
pop ax
|
|
pop bp
|
|
iret
|
|
endm
|
|
|
|
riretd macro
|
|
local a,b,c,d
|
|
push bp
|
|
mov bp,sp
|
|
push ax
|
|
push ds
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov ax,[bp+10]
|
|
test ax,200h
|
|
jz a
|
|
test ds:FIXED_NTVDMSTATE_REL40,RI_BIT_MASK
|
|
jz c
|
|
sti
|
|
c: lock or word ptr ds:FIXED_NTVDMSTATE_REL40, VIRTUAL_INTERRUPT_BIT
|
|
jmp short b
|
|
a:
|
|
test ds:FIXED_NTVDMSTATE_REL40,RI_BIT_MASK
|
|
jz d
|
|
cli
|
|
d: lock and word ptr ds:FIXED_NTVDMSTATE_REL40,NOT VIRTUAL_INTERRUPT_BIT
|
|
b:
|
|
pop ds
|
|
pop ax
|
|
pop bp
|
|
iretd
|
|
endm
|
|
|
|
riretd32 macro
|
|
local a,b,c,d
|
|
push ebp
|
|
mov ebp,esp
|
|
push ax
|
|
push ds
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov ax,[ebp+0ch]
|
|
test ax,200h
|
|
jz a
|
|
test ds:FIXED_NTVDMSTATE_REL40,RI_BIT_MASK
|
|
jz c
|
|
sti
|
|
c: lock or word ptr ds:FIXED_NTVDMSTATE_REL40, VIRTUAL_INTERRUPT_BIT
|
|
jmp short b
|
|
a:
|
|
test ds:FIXED_NTVDMSTATE_REL40,RI_BIT_MASK
|
|
jz d
|
|
cli
|
|
d: lock and word ptr ds:FIXED_NTVDMSTATE_REL40,NOT VIRTUAL_INTERRUPT_BIT
|
|
b:
|
|
pop ds
|
|
pop ax
|
|
pop ebp
|
|
iretd
|
|
endm
|
|
|
|
rpopf macro
|
|
local a,b,c,d
|
|
push bp
|
|
mov bp,sp
|
|
push ax
|
|
push ds
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov ax,[bp+2]
|
|
test ax,200h
|
|
jz a
|
|
test ds:FIXED_NTVDMSTATE_REL40,RI_BIT_MASK
|
|
jz c
|
|
sti
|
|
c: lock or word ptr ds:FIXED_NTVDMSTATE_REL40, VIRTUAL_INTERRUPT_BIT
|
|
jmp short b
|
|
a:
|
|
test ds:FIXED_NTVDMSTATE_REL40,RI_BIT_MASK
|
|
jz d
|
|
cli
|
|
d: lock and word ptr ds:FIXED_NTVDMSTATE_REL40,NOT VIRTUAL_INTERRUPT_BIT
|
|
b:
|
|
pop ds
|
|
pop ax
|
|
pop bp
|
|
popf
|
|
endm
|
|
|
|
rpopfd macro
|
|
local a,b,c,d
|
|
push bp
|
|
mov bp,sp
|
|
push ax
|
|
push ds
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov ax,[bp+2]
|
|
test ax,200h
|
|
jz a
|
|
test ds:FIXED_NTVDMSTATE_REL40,RI_BIT_MASK
|
|
jz c
|
|
sti
|
|
c: lock or word ptr ds:FIXED_NTVDMSTATE_REL40, VIRTUAL_INTERRUPT_BIT
|
|
jmp short b
|
|
a:
|
|
test ds:FIXED_NTVDMSTATE_REL40,RI_BIT_MASK
|
|
jz d
|
|
cli
|
|
d: lock and word ptr ds:FIXED_NTVDMSTATE_REL40,NOT VIRTUAL_INTERRUPT_BIT
|
|
b:
|
|
pop ds
|
|
pop ax
|
|
pop bp
|
|
popfd
|
|
endm
|
|
|
|
;
|
|
; The following assume that the RI bit implies a virtual interrupt flag
|
|
; in eflags. See appendix h of the Pentium user's manual
|
|
;
|
|
rpushf macro
|
|
local a,b,c,d
|
|
.386p
|
|
pushf
|
|
push ebp
|
|
mov ebp,esp
|
|
push eax
|
|
push ds
|
|
|
|
mov ax,ss
|
|
movzx eax,ax
|
|
lar eax,eax
|
|
test eax,(AB_BIG SHL 8)
|
|
jnz @f
|
|
movzx ebp,bp
|
|
@@:
|
|
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov ax,word ptr ds:FIXED_NTVDMSTATE_REL40
|
|
test ax,RI_BIT_MASK
|
|
jz c
|
|
pushfd
|
|
test dword ptr [ebp-10],EFLAGS_VIF
|
|
jz d
|
|
or word ptr [ebp+4],200h
|
|
popfd
|
|
jmp b
|
|
d:
|
|
and word ptr [ebp+4],NOT 200h
|
|
popfd
|
|
jmp b
|
|
c:
|
|
test ax,VIRTUAL_INTERRUPT_BIT
|
|
jz a
|
|
or word ptr [ebp+4],200h
|
|
jmp b
|
|
a:
|
|
and word ptr [ebp+4],NOT 200h
|
|
b:
|
|
pop ds
|
|
pop eax
|
|
pop ebp
|
|
.286p
|
|
endm
|
|
|
|
rpushfd macro
|
|
local a,b,c,d
|
|
pushfd
|
|
push bp
|
|
mov bp,sp
|
|
push ax
|
|
push ds
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov ax,word ptr ds:FIXED_NTVDMSTATE_REL40
|
|
test ax,RI_BIT_MASK
|
|
jz c
|
|
test dword ptr [bp+2],EFLAGS_VIF
|
|
jz d
|
|
or word ptr [bp+2],200h
|
|
jmp b
|
|
d:
|
|
and word ptr [bp+2],NOT 200h
|
|
jmp b
|
|
c:
|
|
test ax,VIRTUAL_INTERRUPT_BIT
|
|
jz a
|
|
or word ptr [bp+2],200h
|
|
jmp b
|
|
a:
|
|
and word ptr [bp+2],NOT 200h
|
|
b:
|
|
pop ds
|
|
pop ax
|
|
pop bp
|
|
endm
|
|
|
|
|
|
rpushfd32 macro
|
|
local a,b,c,d
|
|
pushfd
|
|
push ebp
|
|
mov ebp,esp
|
|
push ax
|
|
push ds
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov ax,word ptr ds:FIXED_NTVDMSTATE_REL40
|
|
test ax,RI_BIT_MASK
|
|
jz c
|
|
test dword ptr [ebp+4],EFLAGS_VIF
|
|
jz d
|
|
or word ptr [ebp+4],200h
|
|
jmp b
|
|
d:
|
|
and word ptr [ebp+4],NOT 200h
|
|
jmp b
|
|
c:
|
|
test ax,VIRTUAL_INTERRUPT_BIT
|
|
jz a
|
|
or word ptr [ebp+4],200h
|
|
jmp b
|
|
a:
|
|
and word ptr [ebp+4],NOT 200h
|
|
b:
|
|
pop ds
|
|
pop ax
|
|
pop ebp
|
|
endm
|
|
ELSE
|
|
riret macro
|
|
iret
|
|
endm
|
|
|
|
riretd macro
|
|
iretd
|
|
endm
|
|
|
|
riretd32 macro
|
|
iretd
|
|
endm
|
|
|
|
rpopf macro
|
|
popf
|
|
endm
|
|
|
|
rpopfd macro
|
|
popfd
|
|
endm
|
|
|
|
rpushf macro
|
|
pushf
|
|
endm
|
|
|
|
rpushfd macro
|
|
pushfd
|
|
endm
|
|
|
|
rpushfd32 macro
|
|
pushfd
|
|
endm
|
|
|
|
FCLI macro
|
|
cli
|
|
endm
|
|
|
|
FSTI macro
|
|
sti
|
|
endm
|
|
|
|
ENDIF
|