00001 ;++
00002 ;
00003 ;
Copyright (c) 1989 Microsoft Corporation
00004 ;
00005 ; Module
Name:
00006 ;
00007 ; vdm.inc
00008 ;
00009 ; Abstract:
00010 ;
00011 ; This module contains
the structure and constant definitions
for
00012 ;
the vdm component
00013 ;
00014 ; Author:
00015 ;
00016 ; Dave Hastings (daveh) 20-Feb-1992
00017 ;
00018 ; Revision
History
00019 ; Sudeepb (30-Nov-1992)
00020 ; Merged all
the equates in one place
00021 ;
00022 ;--
00023 .386p
00024
00025
TRUE equ 1
00026
FALSE equ 0
00027
00028 ;
00029 ; Macro's to
only do locked memory operations on MP systems
00030 ;
00031
00032 IFDEF NT_UP
00033 MPLOCK equ <>
00034 ELSE
00035 MPLOCK equ <lock>
00036 ENDIF
00037
00038 page , 132
00039 subttl
"Macro to dispatch exception"
00040
00041 ;++
00042 ;
00043 ; Macro
Description:
00044 ;
00045 ; This macro allocates exception record on stack, sets up exception
00046 ; record
using specified parameters and finally sets up arguments
00047 ; and calls _KiDispatchException.
00048 ;
00049 ; Arguments:
00050 ;
00051 ; ExcepCode - Exception code to put into exception record
00052 ; ExceptFlags - Exception flags to put into exception record
00053 ; ExceptRecord - Associated exception record
00054 ; ExceptAddress - Addr of instruction which
the hardware exception occurs
00055 ; NumParms - Number of additional parameters
00056 ; ParameterList -
the additional parameter list
00057 ;
00058 ; Return Value:
00059 ;
00060 ; None.
00061 ;
00062 ;--
00063
00064 DISPATCH_EXCEPTION macro ExceptCode, ExceptFlags, ExceptRecord, ExceptAddress,\
00065 NumParms, ParameterList
00066 local de10, de20
00067
00068 ; Set up exception record
for raising exception
00069
00070 ?i = 0
00071 sub esp, ExceptionRecordSize + NumParms * 4
00072 ; allocate exception record
00073 mov dword ptr [esp]+
ErExceptionCode, ExceptCode
00074 ; set up exception code
00075 mov dword ptr [esp]+
ErExceptionFlags, ExceptFlags
00076 ; set exception flags
00077 mov dword ptr [esp]+
ErExceptionRecord, ExceptRecord
00078 ; set associated exception record
00079 mov dword ptr [esp]+
ErExceptionAddress, ExceptAddress
00080 mov dword ptr [esp]+
ErNumberParameters, NumParms
00081 ; set number of parameters
00082
IRP z, <ParameterList>
00083 mov dword ptr [esp]+(
ErExceptionInformation+?i*4), z
00084 ?i = ?i + 1
00085 ENDM
00086
00087 ; set up arguments and call _KiDispatchException
00088
00089 mov ecx, esp ; (ecx)->exception record
00090
00091 test dword ptr [ebp]+TsEFlags,EFLAGS_V86_MASK
00092 jz de10
00093
00094 mov eax,0FFFFh
00095 jmp de20
00096
00097 de10: mov eax,[ebp]+TsSegCs
00098 de20: and eax,MODE_MASK
00099
00100 ; 1 - set first chance
TRUE
00101 ; eax - PreviousMode
00102 ; ebp - trap frame addr
00103 ; 0 - Null exception frame
00104 ; ecx - exception record addr
00105
00106 ; dispatchexception as appropriate
00107 stdCall _KiDispatchException, <ecx, 0, ebp, eax, 1>
00108 IFDEF STD_CALL
00109 add esp,ExceptionRecordSize + NumParms*4
00110 ELSE
00111 add esp,20 + ExceptionRecordSize + NumParms*4
00112 ENDIF
00113
00114 ENDM
00115
00116
00117 ;
00118 ; Prefix Flags
00119 ;
00120
00121 PREFIX_ES equ 00000100h
00122 PREFIX_CS equ 00000200h
00123 PREFIX_SS equ 00000400h
00124 PREFIX_DS equ 00000800h
00125 PREFIX_FS equ 00001000h
00126 PREFIX_GS equ 00002000h
00127 PREFIX_OPER32 equ 00004000h
00128 PREFIX_ADDR32 equ 00008000h
00129 PREFIX_LOCK equ 00010000h
00130 PREFIX_REPNE equ 00020000h
00131 PREFIX_REP equ 00040000h
00132 PREFIX_SEG_ALL equ 00003f00h
00133
00134 NUM_OPCODE equ 255
00135 ;
00136 ; Reginfo structure
00137 ;
00138
00139 RegInfo struc
00140 RiSegSs dd 0
00141 RiEsp dd 0
00142 RiEFlags dd 0
00143 RiSegCs dd 0
00144 RiEip dd 0
00145 RiTrapFrame dd 0
00146 RiCsLimit dd 0
00147 RiCsBase dd 0
00148 RiCsFlags dd 0
00149 RiSsLimit dd 0
00150 RiSsBase dd 0
00151 RiSsFlags dd 0
00152 RiPrefixFlags dd 0
00153 RiOperand dd 0
00154 RegInfo ends
00155 REGINFOSIZE EQU 56
00156
00157 MAX_VDM_ADDR EQU 0FFFFFFH
00158
00159 DR7_GLOBAL EQU 002AAH
00160
00161 ;
00162 ;Fast Read/Write Defines
00163 ;
00164
00165
SVC_DEMFASTREAD equ 42h
00166
SVC_DEMFASTWRITE equ 43h
00167 DOS_BOP equ 50h
00168
00169 ;
00170 ;
00171 ;
Size of Exception Record
00172 ;
00173
00174 ExceptionRecordSize = (
ErNumberParameters + 4 + 3) AND 0fffffffcH ;
00175
00176 ;
00177 ; Magic value
00178 ;
00179
00180 OPCODE_MAGIC equ 00f5ah
00181
00182 ;++
00183 ; diBEGIN - BEGIN index table
00184 ;
00185 ;
ENTRY name = name of
di table
00186 ; badindex = local label
for unspecified entries
00187 ;
00188 ;
EXIT ?sindex = specific entry index
00189 ; ?badindex =
default index
for unspecified entries
00190 ;--
00191
00192 diBEGIN macro name,badindex ;; Beginning of dispatch table
00193 ?sopc = 0
00194 ?badindex = badindex
00195 name label byte ;;
Start of dispatch table
00196 endm
00197
00198 ;++
00199 ; dtI - SPECIFIC index table entry
00200 ;
00201 ;
ENTRY opc = opcode value
00202 ; index = INDEX_ value corresponding to opcode
00203 ; ?badindex = unspecified entry index
00204 ; ?sopc = specific entry index
00205 ;
00206 ;
EXIT Unspecified entries prior to
"index" filled in;
00207 ; Specified entry filled in.
00208 ; ?sopc = next index to fill in;
00209 ;--
00210
00211 dtI macro opc,index ;; Specific entry in dispatch table
00212
if ?sopc gt opc
00213 %
out dtI: opcode
out of order
00214 .err
00215
else
00216
if ?sopc lt opc ;; Fill unspecified entries
00217 rept opc - ?sopc
00218 db ?badindex
00219 endm
00220 endif
00221 db index ;; Specified entry
00222 ?sopc = opc+1 ;; Set
new start index
00223 endif
00224 endm
00225
00226 ;++
00227 ; diEND - END index table
00228 ;
00229 ;
ENTRY index = highest entry in table
00230 ; ?sopc = specific entry index
00231 ;
00232 ;
EXIT rest of
the table filled in
00233 ;--
00234
00235 diEND macro index ;;
End of dispatch table
00236
if ?sopc lt index ;; Fill in rest of table
00237 rept index - ?sopc
00238 db ?badindex
00239 endm
00240 db ?badindex ;; fill in last entry of table!
00241 endif
00242 endm
00243
00244
00245 ;++
00246 ; dtBEGIN - BEGIN dispatch table
00247 ;
00248 ;
ENTRY name = name of
dt table
00249 ; badaddr = local label
for unspecified entries
00250 ;
00251 ;
EXIT ?sindex = specific entry index
00252 ; ?badaddr =
default handler
for unspecified entries
00253 ;--
00254
00255 dtBEGIN macro name,badaddr ;; Beginning of dispatch table
00256 ?sindex = 0
00257 ?badaddr = badaddr
00258 name label dword ;;
Start of dispatch table
00259 endm
00260
00261 ;++
00262 ; dtS - SPECIFIC dispatch table entry
00263 ;
00264 ;
ENTRY index = index of entry
00265 ; addr = address of handler
00266 ; ?badaddr = unspecified entry handler
00267 ; ?sindex = specific entry index
00268 ;
00269 ;
EXIT Unspecified entries prior to
"index" filled in;
00270 ; Specified entry filled in.
00271 ; ?sindex = next index to fill in;
00272 ;--
00273
00274 dtS macro index,addr ;; Specific entry in dispatch table
00275
if ?sindex gt index
00276 %
out dtS: index
out of order
00277 .err
00278
else
00279
if ?sindex lt index ;; Fill unspecified entries
00280 rept index - ?sindex
00281 dd offset FLAT:?badaddr
00282 endm
00283 endif
00284 dd offset FLAT:addr ;; Specified entry
00285 ?sindex = index+1 ;; Set
new start index
00286 endif
00287 endm
00288
00289 ;++
00290 ; dtEND - END dispatch table
00291 ;
00292 ;
ENTRY index = highest entry in table
00293 ; ?sindex = specific entry index
00294 ;
00295 ;
EXIT rest of
the table filled in
00296 ;--
00297
00298 dtEND macro index ;;
End of dispatch table
00299
if ?sindex lt index ;; Fill in rest of table
00300 rept index - ?sindex
00301 dd offset FLAT:?badaddr
00302 endm
00303 dd offset FLAT:?badaddr ;; fill in last entry of table!
00304 endif
00305 endm
00306
00307 ;++
00308 ; CsToLinearPM
00309 ;
00310 ;--
00311
00312 CsToLinearPM macro sel, erraddr
00313 lea eax,[esi].RiCsLimit
00314 push eax
00315 lea eax,[esi].RiCsBase
00316 push eax
00317 lea eax,[esi].RiCsFlags
00318 push eax
00319 push sel
00320
00321 IFDEF STD_CALL
00322 call _Ki386GetSelectorParameters@16
00323 ELSE
00324 call _Ki386GetSelectorParameters
00325 add esp,10h
00326 ENDIF
00327 or al,al
00328 jz erraddr
00329
00330 test [esi].RiCsFlags,
SEL_TYPE_EXECUTE
00331 jz erraddr
00332
00333 test [esi].RiCsFlags,
SEL_TYPE_2GIG
00334 jz @f
00335
00336 ; Correct limit value
for granularity
00337 shl [esi].RiCsLimit,12
00338 or [esi].RiCsLimit,0FFFh
00339 @@:
00340 endm
00341
00342 ;++
00343 ; CsToLinearV86
00344 ;
00345 ;--
00346
00347 CsToLinearV86 macro
00348 movzx eax,word ptr [esi].RiSegCs
00349 shl eax,4
00350 mov [esi].RiCsBase,eax
00351 mov [esi].RiCsLimit,0FFFFh
00352 mov [esi].RiCsFlags,0
00353 endm