diff --git a/reactos/include/ndk/arm/ketypes.h b/reactos/include/ndk/arm/ketypes.h index 10486e25b5a..f81afa0f441 100644 --- a/reactos/include/ndk/arm/ketypes.h +++ b/reactos/include/ndk/arm/ketypes.h @@ -59,6 +59,12 @@ Author: // typedef struct _KTRAP_FRAME { + ULONG OldIrql; + // UCHAR PreviousMode; + // ULONG Fpscr; + // ULONG FpExc; + // ULONG S[33]; + // ULONG FpExtra[8]; ULONG Spsr; ULONG R0; ULONG R1; @@ -78,12 +84,6 @@ typedef struct _KTRAP_FRAME ULONG SvcSp; ULONG SvcLr; ULONG Pc; - ULONG OldIrql; -// UCHAR PreviousMode; -// ULONG Fpscr; -// ULONG FpExc; -// ULONG S[33]; -// ULONG FpExtra[8]; } KTRAP_FRAME, *PKTRAP_FRAME; #ifndef NTOS_MODE_USER diff --git a/reactos/include/reactos/armddk.h b/reactos/include/reactos/armddk.h index e562106f697..0577c2d888b 100644 --- a/reactos/include/reactos/armddk.h +++ b/reactos/include/reactos/armddk.h @@ -35,9 +35,9 @@ // #define KeGetCurrentProcessorNumber() PCR->Number #define KeGetCurrentIrql() PCR->CurrentIrql -#define _KeGetCurrentThread() PCR->CurrentThread -#define _KeGetPreviousMode() PCR->CurrentThread->PreviousMode -#define _KeIsExecutingDpc() (PCR->DpcRoutineActive != 0) +#define _KeGetCurrentThread() PCR->CurrentThread +#define _KeGetPreviousMode() PCR->CurrentThread->PreviousMode +#define _KeIsExecutingDpc() (PCR->DpcRoutineActive != 0) #define KeGetDcacheFillSize() PCR->DcacheFillSize // diff --git a/reactos/ntoskrnl/include/internal/arm/ksarm.h b/reactos/ntoskrnl/include/internal/arm/ksarm.h index 169072eb837..98b95061618 100644 --- a/reactos/ntoskrnl/include/internal/arm/ksarm.h +++ b/reactos/ntoskrnl/include/internal/arm/ksarm.h @@ -50,6 +50,11 @@ */ .equ KiPcr, 0xFFFFF000 +/* + * PCR Offsets + */ +.equ PcCurrentIrql, 0x14C + #else /* diff --git a/reactos/ntoskrnl/ke/arm/trap.s b/reactos/ntoskrnl/ke/arm/trap.s index faf2c584d51..6b8b3a88de1 100644 --- a/reactos/ntoskrnl/ke/arm/trap.s +++ b/reactos/ntoskrnl/ke/arm/trap.s @@ -67,12 +67,22 @@ mrs r0, spsr_all str r0, [sp, #-4]! + // + // Make space for IRQL + // + sub sp, sp, #4 + // // Call the C handler // mov r0, sp bl KiSoftwareInterruptHandler + // + // Skip IRQL + // + add sp, sp, #(4) + // // Get the SPSR and restore it // @@ -140,12 +150,7 @@ // Save the SVC sp before we modify it // mov r2, sp - - // - // Dummy OldIrql - // - //str r0, [sp, #-4]! - + // // Save the abort lr // @@ -185,6 +190,11 @@ // mrs r0, spsr_all str r0, [sp, #-4]! + + // + // Make space for IRQL + // + sub sp, sp, #4 // // Call the C handler @@ -194,6 +204,11 @@ ldr pc, =KiDataAbortHandler AbortExit: + + // + // Skip IRQL + // + add sp, sp, #(4) // // Get the SPSR and restore it @@ -252,11 +267,6 @@ AbortExit: // mov r2, sp - // - // Dummy OldIrql - // - //str r0, [sp, #-4]! - // // Save the IRQ lr // @@ -296,6 +306,11 @@ AbortExit: // mrs r0, spsr_all str r0, [sp, #-4]! + + // + // Make space for IRQL + // + sub sp, sp, #4 // // Call the C handler diff --git a/reactos/ntoskrnl/ke/arm/trapc.c b/reactos/ntoskrnl/ke/arm/trapc.c index 852d82fd97d..13da1a188ba 100644 --- a/reactos/ntoskrnl/ke/arm/trapc.c +++ b/reactos/ntoskrnl/ke/arm/trapc.c @@ -125,13 +125,15 @@ KiInterruptHandler(IN PKTRAP_FRAME TrapFrame, // // Get the old IRQL // - OldIrql = TrapFrame->OldIrql; + OldIrql = KeGetCurrentIrql(); + TrapFrame->OldIrql = OldIrql; // // Get the interrupt source // InterruptCause = HalGetInterruptSource(); DPRINT1("Interrupt (%x) @ %p %p\n", InterruptCause, TrapFrame->SvcLr, TrapFrame->Pc); + DPRINT1("OLD IRQL: %x\n", OldIrql); // // Get the new IRQL and Interrupt Mask @@ -144,14 +146,14 @@ KiInterruptHandler(IN PKTRAP_FRAME TrapFrame, // // Make sure the IRQL is valid // - //if (OldIrql < Irql) - //{ + if (OldIrql < Irql) + { // // We should just return, probably // - //DPRINT1("IRQL Race!\n"); - //while (TRUE); - //} + DPRINT1("IRQL Race!\n"); + while (TRUE); + } // // Check if this interrupt is at DISPATCH or higher