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