From 7bd79bce9e04cc8fdf8963858059e518b93b5874 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 19 Jan 2010 08:41:03 +0000 Subject: [PATCH] [NTOS]: We don't actually need wrappers for NtContinue/NtRaiseException. These are now fully portable C code, so move them appropriately. svn path=/trunk/; revision=45145 --- reactos/ntoskrnl/include/internal/ke.h | 6 ++ reactos/ntoskrnl/ke/except.c | 80 +++++++++++++++++++++++++- reactos/ntoskrnl/ke/i386/trap.s | 17 ------ reactos/ntoskrnl/ke/i386/traphdlr.c | 71 ----------------------- 4 files changed, 84 insertions(+), 90 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 880383a945c..186acde21a7 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -950,6 +950,12 @@ KiContinue( IN PKTRAP_FRAME TrapFrame ); +VOID +FASTCALL +KiServiceExit( + IN PKTRAP_FRAME TrapFrame +); + VOID FASTCALL KiServiceExit2( diff --git a/reactos/ntoskrnl/ke/except.c b/reactos/ntoskrnl/ke/except.c index 7a7713b950e..c8533d077ef 100644 --- a/reactos/ntoskrnl/ke/except.c +++ b/reactos/ntoskrnl/ke/except.c @@ -1,9 +1,10 @@ /* * PROJECT: ReactOS Kernel - * LICENSE: GPL - See COPYING in the top level directory + * LICENSE: BSD - See COPYING.ARM in the top level directory * FILE: ntoskrnl/ke/except.c * PURPOSE: Platform independent exception handling - * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * PROGRAMMERS: ReactOS Portable Systems Group + * Alex Ionescu (alex.ionescu@reactos.org) */ /* INCLUDES ******************************************************************/ @@ -164,4 +165,79 @@ KiRaiseException(IN PEXCEPTION_RECORD ExceptionRecord, return STATUS_SUCCESS; } +/* SYSTEM CALLS ***************************************************************/ + +NTSTATUS +NTAPI +NtRaiseException(IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context, + IN BOOLEAN FirstChance) +{ + NTSTATUS Status; + PKTHREAD Thread; + PKTRAP_FRAME TrapFrame; + + /* Get trap frame and link previous one*/ + Thread = KeGetCurrentThread(); + TrapFrame = Thread->TrapFrame; + Thread->TrapFrame = (PKTRAP_FRAME)TrapFrame->Edx; + + /* Set exception list */ + KeGetPcr()->Tib.ExceptionList = TrapFrame->ExceptionList; + + /* Raise the exception */ + Status = KiRaiseException(ExceptionRecord, + Context, + NULL, + TrapFrame, + FirstChance); + if (NT_SUCCESS(Status)) + { + /* It was handled, so exit restoring all state */ + KiServiceExit2(TrapFrame); + } + else + { + /* Exit with error */ + KiServiceExit(TrapFrame, Status); + } + + /* We don't actually make it here */ + return Status; +} + +NTSTATUS +NTAPI +NtContinue(IN PCONTEXT Context, + IN BOOLEAN TestAlert) +{ + PKTHREAD Thread; + NTSTATUS Status; + PKTRAP_FRAME TrapFrame; + + /* Get trap frame and link previous one*/ + Thread = KeGetCurrentThread(); + TrapFrame = Thread->TrapFrame; + Thread->TrapFrame = (PKTRAP_FRAME)TrapFrame->Edx; + + /* Continue from this point on */ + Status = KiContinue(Context, NULL, TrapFrame); + if (NT_SUCCESS(Status)) + { + /* Check if alert was requested */ + if (TestAlert) KeTestAlertThread(Thread->PreviousMode); + + /* Exit to new trap frame */ + KiServiceExit2(TrapFrame); + } + else + { + /* Exit with an error */ + KiServiceExit(TrapFrame, Status); + } + + /* We don't actually make it here */ + return Status; +} + /* EOF */ diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index 0debd88fa4f..054b6ad8d2c 100644 --- a/reactos/ntoskrnl/ke/i386/trap.s +++ b/reactos/ntoskrnl/ke/i386/trap.s @@ -393,23 +393,6 @@ GENERATE_TRAP_HANDLER KiCallbackReturn, 1 GENERATE_TRAP_HANDLER KiRaiseAssertion, 1 GENERATE_TRAP_HANDLER KiDebugService, 1 -.func NtRaiseException@12 -_NtRaiseException@12: - /* Call C code */ - mov ecx, [esp+4] - mov edx, [esp+8] - or edx, [esp+12] - jmp @NtRaiseExceptionHandler@8 -.endfunc - -.func NtContinue@8 -_NtContinue@8: - /* Call C code */ - mov ecx, [esp+4] - mov edx, [esp+8] - jmp @NtContinueHandler@8 -.endfunc - /* HARDWARE TRAP HANDLERS ****************************************************/ GENERATE_TRAP_HANDLER KiTrap00 diff --git a/reactos/ntoskrnl/ke/i386/traphdlr.c b/reactos/ntoskrnl/ke/i386/traphdlr.c index 74670c02ce3..7fa419f7fc6 100644 --- a/reactos/ntoskrnl/ke/i386/traphdlr.c +++ b/reactos/ntoskrnl/ke/i386/traphdlr.c @@ -1691,77 +1691,6 @@ KiDebugServiceHandler(IN PKTRAP_FRAME TrapFrame) KiDebugHandler(TrapFrame, TrapFrame->Eax, TrapFrame->Ecx, TrapFrame->Edx); } -VOID -FASTCALL -NtRaiseExceptionHandler(IN PEXCEPTION_RECORD ExceptionRecord, - IN PCONTEXT Context) -{ - BOOLEAN FirstChance; - NTSTATUS Status; - PKTHREAD Thread; - PKTRAP_FRAME TrapFrame; - - /* Fixup parameters */ - FirstChance = (ULONG_PTR)Context & 1; - Context = (PVOID)((ULONG_PTR)Context & ~1); - - /* Get trap frame and link previous one*/ - Thread = KeGetCurrentThread(); - TrapFrame = Thread->TrapFrame; - Thread->TrapFrame = (PKTRAP_FRAME)TrapFrame->Edx; - - /* Set exception list */ - KeGetPcr()->Tib.ExceptionList = TrapFrame->ExceptionList; - - /* Raise the exception */ - Status = KiRaiseException(ExceptionRecord, - Context, - NULL, - TrapFrame, - FirstChance); - if (NT_SUCCESS(Status)) - { - /* It was handled, so exit restoring all state */ - KiServiceExit2(TrapFrame); - } - else - { - /* Exit with error */ - KiServiceExit(TrapFrame, Status); - } -} - -VOID -FASTCALL -NtContinueHandler(IN PCONTEXT Context, - IN BOOLEAN TestAlert) -{ - PKTHREAD Thread; - NTSTATUS Status; - PKTRAP_FRAME TrapFrame; - - /* Get trap frame and link previous one*/ - Thread = KeGetCurrentThread(); - TrapFrame = Thread->TrapFrame; - Thread->TrapFrame = (PKTRAP_FRAME)TrapFrame->Edx; - - /* Continue from this point on */ - Status = KiContinue(Context, NULL, TrapFrame); - if (NT_SUCCESS(Status)) - { - /* Check if alert was requested */ - if (TestAlert) KeTestAlertThread(Thread->PreviousMode); - - /* Exit to new trap frame */ - KiServiceExit2(TrapFrame); - } - else - { - /* Exit with an error */ - KiServiceExit(TrapFrame, Status); - } -} - /* HARDWARE INTERRUPTS ********************************************************/ /*