Author: ion
Date: Tue Aug 22 02:40:23 2006
New Revision: 23645
URL:
http://svn.reactos.org/svn/reactos?rev=23645&view=rev
Log:
- Implement GENERATE_IDT_STUBS/GENERATE_INT_HANDLERS
- Generate actual Unexpected Interrupt entries in the IDT for INTs > 0x30 (basically
IRQs).
- Generated all 208 Unexpected Interrupt Handlers for all INTs (using a single macro line)
and implement a "Tail" function to handle them instead of bugchecking like
before (they're now sent to HAL properly).
- Implement INT_PROLOG macro to create KTRAP_FRAME for interrupts (similar to traps).
- Part 1 of major changes to come....
Modified:
trunk/reactos/include/ndk/asm.h
trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S
trunk/reactos/ntoskrnl/ke/i386/trap.s
trunk/reactos/ntoskrnl/ntoskrnl.def
Modified: trunk/reactos/include/ndk/asm.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/asm.h?rev=2364…
==============================================================================
--- trunk/reactos/include/ndk/asm.h (original)
+++ trunk/reactos/include/ndk/asm.h Tue Aug 22 02:40:23 2006
@@ -135,6 +135,9 @@
#define KPCR_SELF 0x1C
#define KPCR_PRCB 0x20
#define KPCR_IRQL 0x24
+#define KPCR_IRR 0x28
+#define KPCR_IRR_ACTIVE 0x2C
+#define KPCR_IDR 0x30
#define KPCR_KD_VERSION_BLOCK 0x34
#define KPCR_IDT 0x38
#define KPCR_GDT 0x3C
@@ -148,6 +151,7 @@
#define KPCR_NPX_THREAD 0x640
#define KPCR_DR6 0x428
#define KPCR_DR7 0x42C
+#define KPCR_PRCB_INTERRUPT_COUNT 0x644
#define KPCR_SYSTEM_CALLS 0x6B8
#define KPCR_PRCB_DPC_ROUTINE_ACTIVE 0x994
@@ -400,6 +404,9 @@
//
#define PASSIVE_LEVEL 0x0
#define APC_LEVEL 0x1
+#define DISPATCH_LEVEL 0x2
+#define CLOCK2_LEVEL 0x1C
+#define HIGH_LEVEL 0x1F
#endif
//
@@ -425,6 +432,11 @@
#define MACHINE_TYPE_MCA 0x0002
//
+// Vector base
+//
+#define PRIMARY_VECTOR_BASE 0x30
+
+//
// Kernel Feature Bits
//
#define KF_RDTSC 0x00000002
Modified: trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S (original)
+++ trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S Tue Aug 22 02:40:23 2006
@@ -64,19 +64,86 @@
#endif
//
-// @name SET_TF_DEBUG_HEADER
-//
-// This macro sets up the debug header in the trap frame.
-//
-// @param None.
-//
-// @remark ebp = PKTRAP_FRAME.
-// edi/ebx = Have been saved and can be used.
+// @name IDT
+//
+// This macro creates an IDT entry for the given handler
+//
+// @param Handler
+// Pointer to the IDT handler
+//
+// @param Bits
+// Descriptor Bits to associate
+//
+// @remark None.
//
.macro idt Handler, Bits
.long \Handler
.short \Bits
.short KGDT_R0_CODE
+.endm
+
+//
+// @name GENERATE_IDT_STUB
+//
+// This macro creates an IDT entry for an unexpected interrupt handler.
+//
+// @param None.
+//
+// @remark None.
+//
+.macro GENERATE_IDT_STUB Number
+idt _KiUnexpectedInterrupt&Number, INT_32_DPL0
+.endm
+
+//
+// @name GENERATE_IDT_STUBS
+//
+// This macro creates unexpected interrupt IDT entries.
+//
+// @param None.
+//
+// @remark None.
+//
+.altmacro
+.macro GENERATE_IDT_STUBS
+.set i, 0
+.rept 208
+ GENERATE_IDT_STUB %i
+ .set i, i + 1
+.endr
+.endm
+
+//
+// @name GENERATE_INT_HANDLER
+//
+// This macro creates an unexpected interrupt handler.
+//
+// @param None.
+//
+// @remark None.
+//
+.macro GENERATE_INT_HANDLER Number
+_KiUnexpectedInterrupt&Number:
+ push PRIMARY_VECTOR_BASE + Number
+ jmp _KiEndUnexpected
+.endm
+
+//
+// @name GENERATE_INT_HANDLERS
+//
+// This macro creates the unexpected interrupt handlers.
+//
+// @param None.
+//
+// @remark None.
+//
+.altmacro
+.macro GENERATE_INT_HANDLERS
+.set i, 0
+.rept 208
+ GENERATE_INT_HANDLER %i
+ .set i, i + 1
+.endr
.endm
//
@@ -252,6 +319,93 @@
\
/* Set the Trap Frame Debug Header */ \
SET_TF_DEBUG_HEADER
+
+//
+// @name INT_PROLOG
+//
+// This macro creates a standard interrupt entry prologue.
+// It should be used for entry into any interrupt, including software.
+//
+// @param Label
+// Identifying name of the caller function; will be used to append
+// to the name V86, ABIOS and DR helper functions, which must exist.
+//
+// @remark For software interrupts, make sure that a fake INT stack is created.
+//
+.macro INT_PROLOG Label
+ /* Save fake error code */
+ push esp
+
+ /* Save the non-volatiles */
+ push ebp
+ push ebx
+ push esi
+ push edi
+
+ /* Skip debug registers and other stuff */
+ sub esp, 0x54
+
+ /* Set up frame */
+ mov ebp, esp
+
+ /* Save volatiles */
+ mov [esp+KTRAP_FRAME_EAX], eax
+ mov [esp+KTRAP_FRAME_ECX], ecx
+ mov [esp+KTRAP_FRAME_EDX], edx
+ mov dword ptr [esp+KTRAP_FRAME_EXCEPTION_LIST], -1
+
+ /* Check if this was from V86 Mode */
+ /* test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK */
+ /* jnz V86_&Label*/
+
+ /* Check if this was kernel mode */
+ cmp dword ptr [esp+KTRAP_FRAME_CS], KGDT_R0_CODE
+ jz 1f
+
+ /* Set segments */
+ mov word ptr [esp+KTRAP_FRAME_FS], fs
+ mov word ptr [esp+KTRAP_FRAME_DS], ds
+ mov word ptr [esp+KTRAP_FRAME_ES], es
+ mov word ptr [esp+KTRAP_FRAME_GS], gs
+
+ /* Load the segment registers */
+ mov ebx, KGDT_R0_PCR
+ mov eax, KGDT_R3_DATA | RPL_MASK
+ mov fs, bx
+ mov ds, ax
+ mov es, ax
+
+1:
+ /* Save the previous exception list */
+ mov ebx, [fs:KPCR_EXCEPTION_LIST]
+ mov [esp+KTRAP_FRAME_EXCEPTION_LIST], ebx
+
+ /* Set the exception handler chain terminator */
+ mov dword ptr [fs:KPCR_EXCEPTION_LIST], -1
+
+ /* Check if this is the ABIOS stack */
+ /* cmp esp, 0x10000*/
+ /* jb Abios_Label*/
+
+ /* Delete error code */
+ and dword ptr [esp+KTRAP_FRAME_ERROR_CODE], 0
+
+ /* Get the current thread and clear direction flag */
+ mov ecx, [fs:KPCR_CURRENT_THREAD]
+ cld
+
+ /* Flush DR7 */
+ and dword ptr [ebp+KTRAP_FRAME_DR7], 0
+
+ /* Check if the thread was being debugged */
+ test byte ptr [ecx+KTHREAD_DEBUG_ACTIVE], 0xFF
+
+ /* Save DR registers if needed */
+ //jnz Dr_&Label
+
+ /* Set the trap frame debug header */
+ SET_TF_DEBUG_HEADER
+.endm
//
// @name SYSCALL_PROLOG
Modified: trunk/reactos/ntoskrnl/ke/i386/trap.s
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/trap.s?re…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/trap.s (original)
+++ trunk/reactos/ntoskrnl/ke/i386/trap.s Tue Aug 22 02:40:23 2006
@@ -46,9 +46,7 @@
idt _KiDebugService, INT_32_DPL3 /* INT 2D: Debug Service Handler */
idt _KiSystemService, INT_32_DPL3 /* INT 2E: System Call Service Handler */
idt _KiTrap0F, INT_32_DPL0 /* INT 2F: RESERVED */
-.rept 220
-idt _KiTrap0F, INT_32_DPL0 /* INT 30-FF: UNDEFINED INTERRUPTS */
-.endr
+GENERATE_IDT_STUBS /* INT 30-FF: UNEXPECTED INTERRUPTS */
/* System call entrypoints: */
.globl _KiFastCallEntry
@@ -62,13 +60,14 @@
.globl _KiServiceExit /* Exit from syscall */
.globl _KiServiceExit2 /* Exit from syscall with complete frame*/
.globl _Kei386EoiHelper@0 /* Exit from interrupt or H/W trap */
+.globl _Kei386EoiHelper2ndEntry /* Exit from unexpected interrupt */
.globl _KiIdtDescriptor
_KiIdtDescriptor:
.short 0x800
.long _KiIdt
-/* FUNCTIONS ****************************************************************/
+/* SOFTWARE INTERRUPT SERVICES ***********************************************/
_KiGetTickCount:
_KiCallbackReturn:
@@ -490,6 +489,7 @@
CHECK_FOR_APC_DELIVER 0
/* Exit and cleanup */
+_Kei386EoiHelper2ndEntry:
TRAP_EPILOG NotFromSystemCall, DoNotRestorePreviousMode, DoRestoreSegments,
DoRestoreVolatiles, DoNotRestoreEverything
.endfunc
@@ -670,6 +670,8 @@
jmp _KiServiceExit
.endfunc
+/* EXCEPTION DISPATCHERS *****************************************************/
+
.func CommonDispatchException
_CommonDispatchException:
@@ -746,6 +748,8 @@
mov ecx, 2
call _CommonDispatchException
.endfunc
+
+/* HARDWARE TRAP HANDLERS ****************************************************/
.func KiTrap0
_KiTrap0:
@@ -1291,4 +1295,54 @@
ret
.endfunc
-
+/* INTERRUPT HANDLERS ********************************************************/
+
+.globl _KiStartUnexpected
+_KiStartUnexpected:
+
+GENERATE_INT_HANDLERS
+
+_KiEndUnexpected:
+ jmp _KiUnexpectedInterruptTail
+
+.func KiUnexpectedInterruptTail
+_KiUnexpectedInterruptTail:
+
+ /* Enter interrupt trap */
+ INT_PROLOG(kui)
+
+ /* Increase interrupt count */
+ inc dword ptr [fs:KPCR_PRCB_INTERRUPT_COUNT]
+
+ /* Put vector in EBX and make space for KIRQL */
+ mov ebx, [esp]
+ sub esp, 4
+
+ /* Begin interrupt */
+ push esp
+ push ebx
+ push HIGH_LEVEL
+ call _HalBeginSystemInterrupt@12
+
+ /* Check if it was spurious or not */
+ or eax, eax
+ jnz Handled
+
+ /* Spurious, ignore it */
+ add esp, 8
+ jmp _Kei386EoiHelper2ndEntry
+
+Handled:
+ /* Unexpected, exit the interrupt */
+ mov esi, $
+ cli
+ call _HalEndSystemInterrupt@8
+ jmp _Kei386EoiHelper@0
+.endfunc
+
+.globl _KiUnexpectedInterrupt
+_KiUnexpectedInterrupt:
+
+ /* Bugcheck with invalid interrupt code */
+ push 0x12
+ call _KeBugCheck@4
Modified: trunk/reactos/ntoskrnl/ntoskrnl.def
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl.def?rev=…
==============================================================================
--- trunk/reactos/ntoskrnl/ntoskrnl.def (original)
+++ trunk/reactos/ntoskrnl/ntoskrnl.def Tue Aug 22 02:40:23 2006
@@ -656,7 +656,7 @@
KeWaitForSingleObject@20
@KefAcquireSpinLockAtDpcLevel@4
@KefReleaseSpinLockFromDpcLevel@4
-;Kei386EoiHelper
+Kei386EoiHelper@0
@KiAcquireSpinLock@4
;KiBugCheckData DATA
KiCoprocessorError@0
@@ -667,7 +667,7 @@
KiInterruptDispatch2@8
KiIpiServiceRoutine@8
@KiReleaseSpinLock@4
-KiUnexpectedInterrupt@0
+KiUnexpectedInterrupt
;Kii386SpinOnSpinLock
KiRawTicks DATA
LdrAccessResource@16