NT4/private/ntos/vdm/i386/vdm.inc

354 lines
8.6 KiB
PHP
Raw Normal View History

2001-01-01 00:00:00 +01:00
;++
;
; 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 <lock>
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, <ParameterList>
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, <ecx, 0, ebp, eax, 1>
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