From c0cde8777bbc67b78b5a97c3ebbd8445525f31c9 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 19 Jul 2008 06:53:03 +0000 Subject: [PATCH] - Enable interrupts after probing and capturing parameters during a system call. - Enable WFI during idle loop. - Implement undefined exception handler, and get rid of reserved exception code -- this will never happen except for an SoC bug. - Request an APC interrupt if the new thread we context switched to has APCs pending and enabled. - Perform DPC watchdog debugging code if a DPC lasted more than a second. - Do the appropriate bugcheck if DPCs are active during a context switch. - Go over the FIXMEs in the assembly files too, and create a new FIXME-PERF category. svn path=/trunk/; revision=34584 --- .../ntoskrnl/include/internal/arm/intrin_i.h | 6 +++ reactos/ntoskrnl/include/internal/ke.h | 1 + reactos/ntoskrnl/ke/arm/ctxswtch.s | 10 ++--- reactos/ntoskrnl/ke/arm/kiinit.c | 11 ----- reactos/ntoskrnl/ke/arm/time.c | 25 ++++++++++- reactos/ntoskrnl/ke/arm/trap.s | 33 +++++++------- reactos/ntoskrnl/ke/arm/trapc.c | 44 ++++++++++++++----- reactos/ntoskrnl/ke/arm/usercall.c | 5 +++ 8 files changed, 88 insertions(+), 47 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/arm/intrin_i.h b/reactos/ntoskrnl/include/internal/arm/intrin_i.h index 666299eca32..33d3db00681 100644 --- a/reactos/ntoskrnl/include/internal/arm/intrin_i.h +++ b/reactos/ntoskrnl/include/internal/arm/intrin_i.h @@ -148,5 +148,11 @@ KeArmFlushIcache(VOID) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 0" : : "r"(0) : "cc"); } +FORCEINLINE +VOID +KeArmWaitForInterrupt(VOID) +{ + __asm__ __volatile__ ("mcr p15, 0, %0, c7, c0, 4" : : "r"(0) : "cc"); +} #endif diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 54a8ff4f771..01262518ccc 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -155,6 +155,7 @@ extern UCHAR KiDebugRegisterContextOffsets[9]; extern ULONG KeTimeIncrement; extern ULONG_PTR KiBugCheckData[5]; extern ULONG KiFreezeFlag; +extern ULONG KiDPCTimeout; /* MACROS *************************************************************************/ diff --git a/reactos/ntoskrnl/ke/arm/ctxswtch.s b/reactos/ntoskrnl/ke/arm/ctxswtch.s index 0063133df02..a8f391f8ec3 100644 --- a/reactos/ntoskrnl/ke/arm/ctxswtch.s +++ b/reactos/ntoskrnl/ke/arm/ctxswtch.s @@ -25,7 +25,7 @@ // // Build exception frame - // FIXME: Change to stmdb later + // FIXME-PERF: Change to stmdb later // str r4, [sp, #ExR4] str r5, [sp, #ExR5] @@ -58,7 +58,7 @@ // // Restore the registers - // FIXME: Use LDMIA later + // FIXME-PERF: Use LDMIA later // ldr r4, [sp, #ExR4] ldr r5, [sp, #ExR5] @@ -84,11 +84,7 @@ NESTED_ENTRY KiThreadStartup PROLOG_END KiThreadStartup - - // - // FIXME: Make space on stack and clean it up? - // - + // // Lower to APC_LEVEL // diff --git a/reactos/ntoskrnl/ke/arm/kiinit.c b/reactos/ntoskrnl/ke/arm/kiinit.c index 9c4db983574..aa542829958 100644 --- a/reactos/ntoskrnl/ke/arm/kiinit.c +++ b/reactos/ntoskrnl/ke/arm/kiinit.c @@ -23,17 +23,6 @@ extern PVOID KiArmVectorTable; /* FUNCTIONS ******************************************************************/ -VOID -DebugService2(IN ULONG Arg1, - IN ULONG Arg2, - IN ULONG Service) -{ - // - // FIXME-TODO: Implement this for symbol load and such - // - return; -} - VOID NTAPI KiInitMachineDependent(VOID) diff --git a/reactos/ntoskrnl/ke/arm/time.c b/reactos/ntoskrnl/ke/arm/time.c index aee2c7df621..988c4aff92a 100644 --- a/reactos/ntoskrnl/ke/arm/time.c +++ b/reactos/ntoskrnl/ke/arm/time.c @@ -224,8 +224,31 @@ KeUpdateRunTime(IN PKTRAP_FRAME TrapFrame, Prcb->DpcTime++; // - // FIXME-TODO: Handle DPC checks + // Update Debug DPC time // + Prcb->DebugDpcTime++; + + // + // Check if we've timed out + // + if (Prcb->DebugDpcTime >= KiDPCTimeout) + { + // + // Print a message + // + DbgPrint("\n*** DPC routine > 1 sec --- This is not a break in " + "KeUpdateSystemTime\n"); + + // + // Break if a debugger is attached + // + if (KdDebuggerEnabled) DbgBreakPoint(); + + // + // Restore the debug DPC time + // + Prcb->DebugDpcTime = 0; + } } } diff --git a/reactos/ntoskrnl/ke/arm/trap.s b/reactos/ntoskrnl/ke/arm/trap.s index 63c327a61bd..fde9d354f5c 100644 --- a/reactos/ntoskrnl/ke/arm/trap.s +++ b/reactos/ntoskrnl/ke/arm/trap.s @@ -17,7 +17,7 @@ ldr pc, _KiSoftwareInterruptJump // Software Interrupt ldr pc, _KiPrefetchAbortJump // Prefetch Abort ldr pc, _KiDataAbortJump // Data Abort - ldr pc, _KiReservedJump // Reserved + b . // Reserved ldr pc, _KiInterruptJump // Interrupt ldr pc, _KiFastInterruptJump // Fast Interrupt @@ -25,7 +25,6 @@ _KiSoftwareInterruptJump: .word KiSoftwareInterruptException _KiPrefetchAbortJump: .word KiPrefetchAbortException _KiDataAbortJump: .word KiDataAbortException - _KiReservedJump: .word KiReservedException _KiInterruptJump: .word KiInterruptException _KiFastInterruptJump: .word KiFastInterruptException @@ -34,9 +33,22 @@ PROLOG_END KiUndefinedInstructionException // - // FIXME: TODO + // Handle trap entry // - b . + TRAP_PROLOG 0 // NotFromAbort + + // + // Call the C handler + // + adr lr, 1f + mov r0, sp + ldr pc, =KiUndefinedExceptionHandler + +1: + // + // Handle trap exit + // + TRAP_EPILOG 0 // NotFromSystemCall ENTRY_END KiUndefinedInstructionException @@ -137,19 +149,8 @@ PROLOG_END KiFastInterruptException // - // FIXME: TODO + // FIXME-PERF: Implement FIQ exception // b . ENTRY_END KiFastInterruptException - - - NESTED_ENTRY KiReservedException - PROLOG_END KiReservedException - - // - // FIXME: TODO - // - b . - - ENTRY_END KiReservedException diff --git a/reactos/ntoskrnl/ke/arm/trapc.c b/reactos/ntoskrnl/ke/arm/trapc.c index 4e1cef33eb5..28581e9c005 100644 --- a/reactos/ntoskrnl/ke/arm/trapc.c +++ b/reactos/ntoskrnl/ke/arm/trapc.c @@ -80,8 +80,9 @@ KiIdleLoop(VOID) else { // - // FIXME-TODO: Wait-For-Interrupt ARM Opcode + // Go into WFI (sleep more) // + KeArmWaitForInterrupt(); } } } @@ -155,10 +156,13 @@ KiSwapContextInternal(IN PKTHREAD OldThread, if (Prcb->DpcRoutineActive) { // - // FIXME-TODO: Implement bugcheck code + // Crash the machine // - DPRINT1("DPCS ACTIVE!!!\n"); - ASSERT(FALSE); + KeBugCheckEx(ATTEMPTED_SWITCH_FROM_DPC, + (ULONG_PTR)OldThread, + (ULONG_PTR)NewThread, + (ULONG_PTR)OldThread->InitialStack, + 0); } // @@ -167,10 +171,16 @@ KiSwapContextInternal(IN PKTHREAD OldThread, if (NewThread->ApcState.KernelApcPending) { // - // FIXME-TODO: Implement bugcheck code + // Are APCs enabled? // - DPRINT1("APCs pending!\n"); - ASSERT(FALSE); + if (NewThread->SpecialApcDisable == 0) + { + // + // Request APC delivery + // + HalRequestSoftwareInterrupt(APC_LEVEL); + return TRUE; + } } // @@ -517,13 +527,23 @@ KiSoftwareInterruptHandler(IN PKTRAP_FRAME TrapFrame) // Read the opcode // Instruction = *(PULONG)(TrapFrame->Pc - sizeof(ULONG)); - - // - // FIXME-TODO: Enable interrupts? - // - + // // Call the service call dispatcher // KiSystemService(Thread, TrapFrame, Instruction); } + +NTSTATUS +KiUndefinedExceptionHandler(IN PKTRAP_FRAME TrapFrame) +{ + ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00); + + // + // This should never happen + // + DPRINT1("[UNDEF] @ %p/%p\n", TrapFrame->SvcLr, TrapFrame->Pc); + UNIMPLEMENTED; + ASSERT(FALSE); + return STATUS_SUCCESS; +} diff --git a/reactos/ntoskrnl/ke/arm/usercall.c b/reactos/ntoskrnl/ke/arm/usercall.c index 7b55ae272fb..7ffc6ad0668 100644 --- a/reactos/ntoskrnl/ke/arm/usercall.c +++ b/reactos/ntoskrnl/ke/arm/usercall.c @@ -199,6 +199,11 @@ KiSystemService(IN PKTHREAD Thread, } } + // + // We can safely enable interrupts here + // + _enable(); + // // Do the system call and save result in EAX //