|
|
PAGE ,132 TITLE NTNPXEM.ASM -- Support for fielding exceptions from npx em
; Copyright (c) Microsoft Corporation 1988-1991. All Rights Reserved.
;**************************************************************** ;* * ;* NTNPXEM.ASM - Exception handler for npx emulation * ;* * ;**************************************************************** ;* * ;* Module Description: * ;* This module contains code to field exceptions from the * ;* Nt NPX emulator. These exceptions will only be * ;* received on machines without 387's, on which the app * ;* has set the EM bit. * ;****************************************************************
.286p .287
; ------------------------------------------------------- ; INCLUDE FILE DEFINITIONS ; -------------------------------------------------------
.xlist .sall include segdefs.inc include gendefs.inc include pmdefs.inc include ks386.inc include intmac.inc .list
; ------------------------------------------------------- ; GENERAL SYMBOL DEFINITIONS ; -------------------------------------------------------
; ------------------------------------------------------- ; EXTERNAL SYMBOL DEFINITIONS ; -------------------------------------------------------
extrn PmFaultEntryVector:near
; ------------------------------------------------------- ; DATA SEGMENT DEFINITIONS ; -------------------------------------------------------
DXDATA segment
extrn rgw0stack:word
DXDATA ends
; ------------------------------------------------------- ; Exception Handler ; -------------------------------------------------------
DXPMCODE segment assume cs:DXPMCODE .386p ; ; N.B. The following routine will be executed on a special ; code selector. The following routine must ALWAYS ; appear at offset zero in this code selector. ;
; ------------------------------------------------------- ; NpxExceptionHandler -- This function switches to the ; exception handler stack, pushes an exception frame, ; and restores the registers. It then transfers control ; the trap 7 fault handler. ; ; Input: ss:esp -> an NT CONTEXT record ; Output: all registers restored to fault time ; values, and exception frame pushed. ; Errors: none ; Uses: all
assume ds:NOTHING,es:NOTHING,ss:NOTHING,fs:NOTHING public NpxExceptionHandler,EndNpxExceptionHandler
NpxExceptionHandler proc far
FCLI mov ax,ss mov ds,ax mov ebx,esp ; ds:ebx->CONTEXT mov ax,SEL_DXDATA OR STD_RING mov ss,ax mov esp,offset DXDATA:rgw0Stack ; ss:esp->exception stack
; ; Push exception frame on exception stack ; movzx eax,word ptr [ebx].CsSegSs push eax push dword ptr [ebx].CsEsp push dword ptr [ebx].CsEFlags movzx eax,word ptr [ebx].CsSegCs push eax push dword ptr [ebx].CsEip ; ; Restore registers ; mov gs,[ebx].CsSegGs mov fs,[ebx].CsSegFs mov es,[ebx].CsSegEs mov ebp,[ebx].CsEbp mov edi,[ebx].CsEdi mov esi,[ebx].CsEsi mov edx,[ebx].CsEdx mov ecx,[ebx].CsEcx mov ax,[ebx].CsSegDs push ax push dword ptr [ebx].CsEbx mov eax,[ebx].CsEax pop ebx pop ds db 0eah dw (offset PmFaultEntryVector + 21) dw SEL_DXPMCODE OR STD_RING EndNpxExceptionHandler: NpxExceptionHandler endp
DXPMCODE ends end
|