Author: ion Date: Wed Aug 23 23:02:00 2006 New Revision: 23674
URL: http://svn.reactos.org/svn/reactos?rev=23674&view=rev Log: - Enable the code in KeInitializeInterrupt that copies the Interrupt Template to the KINTERRUPT object and modifies the template pointer to point to the KINTERRUPT. - Add the template code in trap.s.
Modified: trunk/reactos/ntoskrnl/ke/i386/irq.c trunk/reactos/ntoskrnl/ke/i386/trap.s
Modified: trunk/reactos/ntoskrnl/ke/i386/irq.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/irq.c?rev=... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/irq.c (original) +++ trunk/reactos/ntoskrnl/ke/i386/irq.c Wed Aug 23 23:02:00 2006 @@ -23,6 +23,9 @@
#define NDEBUG #include <internal/debug.h> + +extern ULONG KiInterruptTemplate[KINTERRUPT_DISPATCH_CODES]; +extern PULONG KiInterruptTemplateObject;
/* GLOBALS *****************************************************************/
@@ -245,7 +248,6 @@ * At this point we have interrupts disabled, nothing has been done to * the PIC. */ - KeGetCurrentPrcb()->InterruptCount++;
/* @@ -302,9 +304,9 @@ PISR_TABLE CurrentIsr; BOOLEAN Result;
- DPRINT("KeConnectInterrupt()\n");
Vector = InterruptObject->Vector; + DPRINT1("KeConnectInterrupt(): %lx\n", Vector);
if (Vector < IRQ_BASE || Vector >= IRQ_BASE + NR_IRQS) return FALSE; @@ -437,10 +439,13 @@ CHAR ProcessorNumber, BOOLEAN FloatingSave) { + ULONG i; + PULONG DispatchCode = &Interrupt->DispatchCode[0], Patch = DispatchCode; + /* Set the Interrupt Header */ Interrupt->Type = InterruptObject; Interrupt->Size = sizeof(KINTERRUPT); - + /* Check if we got a spinlock */ if (SpinLock) { @@ -452,7 +457,7 @@ KeInitializeSpinLock(&Interrupt->SpinLock); Interrupt->ActualLock = &Interrupt->SpinLock; } - + /* Set the other settings */ Interrupt->ServiceRoutine = ServiceRoutine; Interrupt->ServiceContext = ServiceContext; @@ -463,7 +468,22 @@ Interrupt->ShareVector = ShareVector; Interrupt->Number = ProcessorNumber; Interrupt->FloatingSave = FloatingSave; - + + /* Loop the template in memory */ + for (i = 0; i < KINTERRUPT_DISPATCH_CODES; i++) + { + /* Copy the dispatch code */ + *DispatchCode++ = KiInterruptTemplate[i]; + } + + /* Jump to the last 4 bytes */ + Patch = (PULONG)((ULONG_PTR)Patch + + ((ULONG_PTR)&KiInterruptTemplateObject - + (ULONG_PTR)KiInterruptTemplate) - 4); + + /* Apply the patch */ + *Patch = PtrToUlong(Interrupt); + /* Disconnect it at first */ Interrupt->Connected = FALSE; }
Modified: trunk/reactos/ntoskrnl/ke/i386/trap.s URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/trap.s?rev... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/trap.s (original) +++ trunk/reactos/ntoskrnl/ke/i386/trap.s Wed Aug 23 23:02:00 2006 @@ -56,6 +56,10 @@ .globl _NtRaiseException@12 .globl _NtContinue@8
+/* Interrupt template entrypoints */ +.globl _KiInterruptTemplate +.globl _KiInterruptTemplateObject + /* We implement the following trap exit points: */ .globl _KiServiceExit /* Exit from syscall */ .globl _KiServiceExit2 /* Exit from syscall with complete frame*/ @@ -1295,7 +1299,7 @@ ret .endfunc
-/* INTERRUPT HANDLERS ********************************************************/ +/* UNEXPECTED INTERRUPT HANDLERS **********************************************/
.globl _KiStartUnexpected _KiStartUnexpected: @@ -1346,3 +1350,20 @@ /* Bugcheck with invalid interrupt code */ push 0x12 call _KeBugCheck@4 + +/* INTERRUPT HANDLERS ********************************************************/ + +.func KiInterruptTemplate +_KiInterruptTemplate: + + /* Enter interrupt trap */ + INT_PROLOG kit, DoPushFakeErrorCode +.endfunc + +_KiInterruptTemplate2ndDispatch: + /* Dummy code, will be replaced by the address of the KINTERRUPT */ + mov edi, 0 + +_KiInterruptTemplateObject: + /* Dummy jump, will be replaced by the actual jump */ + jmp _KeSynchronizeExecution@12