windows-nt/Source/XPSP1/NT/base/mvdm/wow16/inc/gpfix.inc
2020-09-26 16:20:57 +08:00

63 lines
1.6 KiB
PHP

; GPFix.inc - definitions for GP exception handler code
; usage -
; 1) include gpfix.inc
; 2) bracket critical code with "beg_fault_trap handler" and
; "end_fault_trap"
; 3) define a handler entry point where execution should continue
; a) this must be in the same code segment as the faulty code
; b) two extra words (fault IP/fault) will be pushed on the stack when
; an exception occurs. They should be popped before continuing.
; This can be done with the 'fault_fix_stack' macro.
; They are there if you want to determine which instruction faulted.
; c) This handler can do whatever it likes. Usually, it will return
; an error code to the caller.
; 4) if you don't want to worry about the extra values on the stack,
; use the fix_fault_stack macro to remove them
_bft_count = 0
_eft_count = 0
_bft_ macro handler, count
_bft_&count:
_hft_&count = handler
endm
;
; Begin fault critical region. 'handler' is the address of
; the exception handler to jmp to if a fault occurs.
;
beg_fault_trap macro handler
if _bft_count - _eft_count
.err
%out Mismatched beg_fault_trap/end_fault_trap pairs in beg_fault_trap
endif
_bft_ handler, %_bft_count
_bft_count = _bft_count + 1
endm
_eft_ macro count
_eft_&count:
_GPFIX SEGMENT
dw seg _bft_&count, _bft_&count, _eft_&count, _hft_&count
_GPFIX ENDS
endm
;
; End fault critical region.
;
end_fault_trap macro
_eft_ %_eft_count
_eft_count = _eft_count+1
if _bft_count - _eft_count
.err
%out Mismatched beg_fault_trap/end_fault_trap pairs in end_fault_trap
endif
endm
;
; Clean up stack in fault handler.
;
fault_fix_stack macro
add sp, 4
endm