summaryrefslogtreecommitdiffstats
path: root/private/ntos/ex/i386/raisests.asm
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/ex/i386/raisests.asm')
-rw-r--r--private/ntos/ex/i386/raisests.asm316
1 files changed, 316 insertions, 0 deletions
diff --git a/private/ntos/ex/i386/raisests.asm b/private/ntos/ex/i386/raisests.asm
new file mode 100644
index 000000000..9a9688b1b
--- /dev/null
+++ b/private/ntos/ex/i386/raisests.asm
@@ -0,0 +1,316 @@
+ title "Raise Exception"
+;++
+;
+; Copyright (c) 1990 Microsoft Corporation
+;
+; Module Name:
+;
+; raisests.asm
+;
+; Abstract:
+;
+; This module implements the function to raise a software exception.
+;
+; Author:
+;
+; Bryan Willman 11 Nov 90
+;
+; Environment:
+;
+; Any mode.
+;
+; Revision History:
+;
+;--
+.386p
+ .xlist
+include ks386.inc
+include callconv.inc ; calling convention macros
+ .list
+
+ EXTRNP _RtlDispatchException,2
+ EXTRNP _ZwContinue,2
+ EXTRNP _ZwRaiseException,3
+
+_TEXT$01 SEGMENT DWORD PUBLIC 'CODE'
+ ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
+
+;
+; Context flags definition.
+;
+
+CONTEXT_SETTING EQU CONTEXT_INTEGER OR CONTEXT_CONTROL OR CONTEXT_SEGMENTS
+
+;
+; Exception record length definition.
+;
+
+EXCEPTION_RECORD_LENGTH EQU (ErExceptionInformation + 16) AND 0fffffff0H
+
+ page
+ subttl "Raise Software Exception"
+;++
+;
+; VOID
+; ExRaiseException (
+; IN PEXCEPTION_RECORD ExceptionRecord
+; )
+;
+; Routine Description:
+;
+; This function raises a software exception by building a context record,
+; establishing the stack limits of the current processor mode, and calling
+; the exception dispatcher. If the exception dispatcher finds a handler
+; to process the exception, then control is returned to the caller using
+; the NtContinue system service. Otherwise the NtLastChance system service
+; is called to provide default handing.
+;
+; N.B. On the 386, floating point state is not defined for non-fp
+; exceptions. Therefore, this routine does not attempt to
+; capture it.
+;
+; This means this routine cannot be used to report fp exceptions.
+;
+; Arguments:
+;
+; ExceptionRecord (ebp+8) - Supplies a pointer to an exception record.
+;
+; Return Value:
+;
+; None.
+;
+;--
+
+cPublicProc _ExRaiseException , 1
+
+ push ebp
+ mov ebp,esp
+ pushfd ; save flags before sub
+ sub esp,ContextFrameLength ; Allocate a context record
+
+;
+; Save regs we use in context record
+;
+
+ mov [(ebp-ContextFrameLength-4)+CsEax],eax
+ mov [(ebp-ContextFrameLength-4)+CsEcx],ecx
+
+;
+; Get pointer to exception report record, and set the exceptionaddress
+; field to be our return address
+;
+
+ mov eax,[ebp+8] ; (eax) -> ExceptionReportRecord
+
+ mov ecx,[ebp+4]
+ mov [eax.ErExceptionAddress],ecx
+
+;
+; Copy machine context into the context record
+;
+
+ lea eax,[ebp-ContextFrameLength-4] ; (eax) -> Context record
+
+ mov [eax.CsEip],ecx
+
+ mov [eax.CsEbx],ebx
+ mov [eax.CsEdx],edx
+
+ mov [eax.CsEsi],esi
+ mov [eax.CsEdi],edi
+
+ lea ecx,[ebp+8]
+ mov [eax.CsEsp],ecx
+
+ mov ecx,[ebp]
+ mov [eax.CsEbp],ecx
+
+ mov ecx,[ebp-4]
+ mov [eax.CsEflags],ecx
+
+ mov dword ptr [eax.CsSegCs],cs
+ mov dword ptr [eax.CsSegDs],ds
+ mov dword ptr [eax.CsSegEs],es
+ mov dword ptr [eax.CsSegFs],fs
+ mov dword ptr [eax.CsSegGs],gs
+ mov dword ptr [eax.CsSegSs],ss
+
+;
+; Set Context flags, note that FLOATING_POINT is NOT set.
+;
+
+ mov dword ptr [eax.CsContextFlags],CONTEXT_SETTING
+
+;
+; _RtlDispatchException(ExceptionRecord, ContextRecord)
+;
+ stdCall _RtlDispatchException, <[ebp+8],eax>
+;
+; If the exception is successfully dispatched, then continue execution.
+; Otherwise, give the kernel debugger a chance to handle the exception.
+;
+ lea ecx,[ebp-ContextFrameLength-4] ; (eax) -> Context record
+
+ or eax, eax
+ jz short ere10
+
+ stdCall _ZwContinue, <ecx,0>
+ jmp short ere20
+
+ere10:
+ stdCall _ZwRaiseException, <[ebp+8],ecx,0>
+
+ere20:
+;
+; Either the attempt to continue execution or the attempt to give
+; the kernel debugger a chance to handle the exception failed. Raise
+; a noncontinuable exception.
+;
+ stdCall _ExRaiseStatus, <eax>
+
+
+stdENDP _ExRaiseException
+
+ page
+ subttl "Raise Software Exception"
+;++
+;
+; VOID
+; ExRaiseStatus (
+; IN NTSTATUS Status
+; )
+;
+; Routine Description:
+;
+; This function raises a software exception with the specified status value
+; by building a context record, establishing the stack limits of the current
+; processor mode, and calling the exception dispatcher. If the exception
+; dispatcher finds a handler to process the exception, then control is
+; returned to the caller using the NtContinue system service. Otherwise
+; the NtLastChance system service is called to provide default handing.
+;
+; N.B. On the 386, floating point state is not defined for non-fp
+; exceptions. Therefore, this routine does not attempt to
+; capture it.
+;
+; This means this routine cannot be used to report fp exceptions.
+;
+; Arguments:
+;
+; Status - Supplies the status value to be used as the exception code
+; for the exception that is to be raised.
+;
+; Return Value:
+;
+; None.
+
+; Arguments:
+;
+;--
+
+cPublicProc _ExRaiseStatus,1
+
+ push ebp
+ mov ebp,esp
+ pushfd ; save flags before sub
+ sub esp,ContextFrameLength+ExceptionRecordLength
+
+;
+; Save regs we use in context record
+;
+
+ mov [(ebp-ContextFrameLength-4)+CsEax],eax
+ mov [(ebp-ContextFrameLength-4)+CsEcx],ecx
+
+;
+; Copy machine context into the context record
+;
+
+
+ lea eax,[ebp-ContextFrameLength-4] ; (eax) -> Context record
+
+ mov ecx,[ebp+4] ; [ecx] = returned address
+ mov [eax.CsEip],ecx
+
+ mov [eax.CsEbx],ebx
+ mov [eax.CsEdx],edx
+
+ mov [eax.CsEsi],esi
+ mov [eax.CsEdi],edi
+
+ lea ecx,[ebp+8]
+ mov [eax.CsEsp],ecx
+
+ mov ecx,[ebp]
+ mov [eax.CsEbp],ecx
+
+ mov ecx,[ebp-4]
+ mov [eax.CsEflags],ecx
+
+ mov dword ptr [eax.CsSegCs],cs
+ mov dword ptr [eax.CsSegDs],ds
+ mov dword ptr [eax.CsSegEs],es
+ mov dword ptr [eax.CsSegFs],fs
+ mov dword ptr [eax.CsSegGs],gs
+ mov dword ptr [eax.CsSegSs],ss
+
+;
+; Set Context flags, note that FLOATING_POINT is NOT set.
+;
+
+ mov dword ptr [eax.CsContextFlags],CONTEXT_SETTING
+
+;
+; Get pointer to exception report record, and set the exceptionaddress
+; field to be our return address
+;
+
+ lea eax,[ebp-ContextFrameLength-ExceptionRecordLength-4]
+ ; (eax) -> ExceptionRecord
+ mov ecx,[ebp+4]
+ mov dword ptr [eax.ErExceptionAddress],ecx
+ mov ecx,[ebp+8]
+ mov dword ptr [eax.ErExceptionCode],ecx
+ mov dword ptr [eax.ErNumberParameters], 0
+ mov dword ptr [eax.ErExceptionRecord], 0
+ mov dword ptr [eax.ErExceptionFlags], EXCEPTION_NONCONTINUABLE
+
+;
+; _RtlDispatchException(ExceptionRecord, ContextRecord)
+;
+
+ lea ecx,[ebp-ContextFrameLength-4] ; (eax) -> Context record
+
+; ecx - Context record
+; eax - Exception record
+ stdCall _RtlDispatchException, <eax, ecx>
+
+;
+; An unwind was not initiated during the dispatching of a noncontinuable
+; exception. Give the kernel debugger a chance to handle the exception.
+;
+
+;
+; _ZwRaiseException(ExceptionRecord, ContextRecord, FirstChance=TRUE)
+;
+
+ lea ecx,[ebp-ContextFrameLength-4] ; (eax) -> Context record
+ lea eax,[ebp-ContextFrameLength-ExceptionRecordLength-4]
+; 1 - TRUE
+; ecx - Context Record
+; eax - Exception Report Record
+ stdCall _ZwRaiseException, <eax, ecx, 1>
+
+;
+; We came back, suggesting some sort of error in the call. Raise
+; a status exception to report this, return from ZwRaiseException is type.
+;
+
+ stdCall _ExRaiseStatus, <eax>
+
+
+stdENDP _ExRaiseStatus
+
+_TEXT$01 ends
+ end
+