;++ ; ; Copyright (c) 1989 Microsoft Corporation ; ; Module Name: ; ; vdm.inc ; ; Abstract: ; ; This module contains the structure and constant definitions for ; the vdm component ; ; Author: ; ; Dave Hastings (daveh) 20-Feb-1992 ; ; Revision History ; Sudeepb (30-Nov-1992) ; Merged all the equates in one place ; ;-- .386p TRUE equ 1 FALSE equ 0 ; ; Macro's to only do locked memory operations on MP systems ; IFDEF NT_UP MPLOCK equ <> ELSE MPLOCK equ ENDIF page , 132 subttl "Macro to dispatch exception" ;++ ; ; Macro Description: ; ; This macro allocates exception record on stack, sets up exception ; record using specified parameters and finally sets up arguments ; and calls _KiDispatchException. ; ; Arguments: ; ; ExcepCode - Exception code to put into exception record ; ExceptFlags - Exception flags to put into exception record ; ExceptRecord - Associated exception record ; ExceptAddress - Addr of instruction which the hardware exception occurs ; NumParms - Number of additional parameters ; ParameterList - the additional parameter list ; ; Return Value: ; ; None. ; ;-- DISPATCH_EXCEPTION macro ExceptCode, ExceptFlags, ExceptRecord, ExceptAddress,\ NumParms, ParameterList local de10, de20 ; Set up exception record for raising exception ?i = 0 sub esp, ExceptionRecordSize + NumParms * 4 ; allocate exception record mov dword ptr [esp]+ErExceptionCode, ExceptCode ; set up exception code mov dword ptr [esp]+ErExceptionFlags, ExceptFlags ; set exception flags mov dword ptr [esp]+ErExceptionRecord, ExceptRecord ; set associated exception record mov dword ptr [esp]+ErExceptionAddress, ExceptAddress mov dword ptr [esp]+ErNumberParameters, NumParms ; set number of parameters IRP z, mov dword ptr [esp]+(ErExceptionInformation+?i*4), z ?i = ?i + 1 ENDM ; set up arguments and call _KiDispatchException mov ecx, esp ; (ecx)->exception record test dword ptr [ebp]+TsEFlags,EFLAGS_V86_MASK jz de10 mov eax,0FFFFh jmp de20 de10: mov eax,[ebp]+TsSegCs de20: and eax,MODE_MASK ; 1 - set first chance TRUE ; eax - PreviousMode ; ebp - trap frame addr ; 0 - Null exception frame ; ecx - exception record addr ; dispatchexception as appropriate stdCall _KiDispatchException, IFDEF STD_CALL add esp,ExceptionRecordSize + NumParms*4 ELSE add esp,20 + ExceptionRecordSize + NumParms*4 ENDIF ENDM ; ; Prefix Flags ; PREFIX_ES equ 00000100h PREFIX_CS equ 00000200h PREFIX_SS equ 00000400h PREFIX_DS equ 00000800h PREFIX_FS equ 00001000h PREFIX_GS equ 00002000h PREFIX_OPER32 equ 00004000h PREFIX_ADDR32 equ 00008000h PREFIX_LOCK equ 00010000h PREFIX_REPNE equ 00020000h PREFIX_REP equ 00040000h PREFIX_SEG_ALL equ 00003f00h NUM_OPCODE equ 255 ; ; Reginfo structure ; RegInfo struc RiSegSs dd 0 RiEsp dd 0 RiEFlags dd 0 RiSegCs dd 0 RiEip dd 0 RiTrapFrame dd 0 RiCsLimit dd 0 RiCsBase dd 0 RiCsFlags dd 0 RiSsLimit dd 0 RiSsBase dd 0 RiSsFlags dd 0 RiPrefixFlags dd 0 RiOperand dd 0 RegInfo ends REGINFOSIZE EQU 56 MAX_VDM_ADDR EQU 0FFFFFFH DR7_GLOBAL EQU 002AAH ; ;Fast Read/Write Defines ; SVC_DEMFASTREAD equ 42h SVC_DEMFASTWRITE equ 43h DOS_BOP equ 50h ; ; ; Size of Exception Record ; ExceptionRecordSize = (ErNumberParameters + 4 + 3) AND 0fffffffcH ; ; ; Magic value ; OPCODE_MAGIC equ 00f5ah ;++ ; diBEGIN - BEGIN index table ; ; ENTRY name = name of di table ; badindex = local label for unspecified entries ; ; EXIT ?sindex = specific entry index ; ?badindex = default index for unspecified entries ;-- diBEGIN macro name,badindex ;; Beginning of dispatch table ?sopc = 0 ?badindex = badindex name label byte ;; Start of dispatch table endm ;++ ; dtI - SPECIFIC index table entry ; ; ENTRY opc = opcode value ; index = INDEX_ value corresponding to opcode ; ?badindex = unspecified entry index ; ?sopc = specific entry index ; ; EXIT Unspecified entries prior to "index" filled in; ; Specified entry filled in. ; ?sopc = next index to fill in; ;-- dtI macro opc,index ;; Specific entry in dispatch table if ?sopc gt opc %out dtI: opcode out of order .err else if ?sopc lt opc ;; Fill unspecified entries rept opc - ?sopc db ?badindex endm endif db index ;; Specified entry ?sopc = opc+1 ;; Set new start index endif endm ;++ ; diEND - END index table ; ; ENTRY index = highest entry in table ; ?sopc = specific entry index ; ; EXIT rest of the table filled in ;-- diEND macro index ;; End of dispatch table if ?sopc lt index ;; Fill in rest of table rept index - ?sopc db ?badindex endm db ?badindex ;; fill in last entry of table! endif endm ;++ ; dtBEGIN - BEGIN dispatch table ; ; ENTRY name = name of dt table ; badaddr = local label for unspecified entries ; ; EXIT ?sindex = specific entry index ; ?badaddr = default handler for unspecified entries ;-- dtBEGIN macro name,badaddr ;; Beginning of dispatch table ?sindex = 0 ?badaddr = badaddr name label dword ;; Start of dispatch table endm ;++ ; dtS - SPECIFIC dispatch table entry ; ; ENTRY index = index of entry ; addr = address of handler ; ?badaddr = unspecified entry handler ; ?sindex = specific entry index ; ; EXIT Unspecified entries prior to "index" filled in; ; Specified entry filled in. ; ?sindex = next index to fill in; ;-- dtS macro index,addr ;; Specific entry in dispatch table if ?sindex gt index %out dtS: index out of order .err else if ?sindex lt index ;; Fill unspecified entries rept index - ?sindex dd offset FLAT:?badaddr endm endif dd offset FLAT:addr ;; Specified entry ?sindex = index+1 ;; Set new start index endif endm ;++ ; dtEND - END dispatch table ; ; ENTRY index = highest entry in table ; ?sindex = specific entry index ; ; EXIT rest of the table filled in ;-- dtEND macro index ;; End of dispatch table if ?sindex lt index ;; Fill in rest of table rept index - ?sindex dd offset FLAT:?badaddr endm dd offset FLAT:?badaddr ;; fill in last entry of table! endif endm ;++ ; CsToLinearPM ; ;-- CsToLinearPM macro sel, erraddr lea eax,[esi].RiCsLimit push eax lea eax,[esi].RiCsBase push eax lea eax,[esi].RiCsFlags push eax push sel IFDEF STD_CALL call _Ki386GetSelectorParameters@16 ELSE call _Ki386GetSelectorParameters add esp,10h ENDIF or al,al jz erraddr test [esi].RiCsFlags,SEL_TYPE_EXECUTE jz erraddr test [esi].RiCsFlags,SEL_TYPE_2GIG jz @f ; Correct limit value for granularity shl [esi].RiCsLimit,12 or [esi].RiCsLimit,0FFFh @@: endm ;++ ; CsToLinearV86 ; ;-- CsToLinearV86 macro movzx eax,word ptr [esi].RiSegCs shl eax,4 mov [esi].RiCsBase,eax mov [esi].RiCsLimit,0FFFFh mov [esi].RiCsFlags,0 endm