129 lines
3.9 KiB
NASM
129 lines
3.9 KiB
NASM
|
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
|