;++ ; ; 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