diff --git a/reactos/include/ndk/i386/ketypes.h b/reactos/include/ndk/i386/ketypes.h index 9473ce270e5..8cbdde72532 100644 --- a/reactos/include/ndk/i386/ketypes.h +++ b/reactos/include/ndk/i386/ketypes.h @@ -440,11 +440,10 @@ typedef struct _KIPCR ULONG IrrActive; /* 2C */ ULONG IDR; /* 30 */ PVOID KdVersionBlock; /* 34 */ + PKIDTENTRY IDT; /* 38 */ #ifdef _REACTOS_ - PUSHORT IDT; /* 38 */ PUSHORT GDT; /* 3C */ #else - PKIDTENTRY IDT; /* 38 */ PKGDTENTRY GDT; /* 3C */ #endif struct _KTSS *TSS; /* 40 */ diff --git a/reactos/ntoskrnl/include/internal/i386/asmmacro.S b/reactos/ntoskrnl/include/internal/i386/asmmacro.S index d0cf360f6f1..3e60f78520e 100644 --- a/reactos/ntoskrnl/include/internal/i386/asmmacro.S +++ b/reactos/ntoskrnl/include/internal/i386/asmmacro.S @@ -22,6 +22,10 @@ #define DoNotRestoreSegments 0 #define DoNotRestoreVolatiles 0 +// Arguments for idt +#define INT_32_DPL0 0x8E00 +#define INT_32_DPL3 0xEE00 + .intel_syntax noprefix // @@ -59,6 +63,22 @@ #define RELEASE_SPINLOCK(x) #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. +// +.macro idt Handler, Bits + .long \Handler + .short \Bits + .short KGDT_R0_CODE +.endm + // // @name SET_TF_DEBUG_HEADER // diff --git a/reactos/ntoskrnl/include/internal/ntoskrnl.h b/reactos/ntoskrnl/include/internal/ntoskrnl.h index e50921b6537..2b28d37e3d0 100644 --- a/reactos/ntoskrnl/include/internal/ntoskrnl.h +++ b/reactos/ntoskrnl/include/internal/ntoskrnl.h @@ -46,8 +46,6 @@ typedef struct __DESCRIPTOR } IDT_DESCRIPTOR, GDT_DESCRIPTOR; #include - -extern IDT_DESCRIPTOR KiIdt[256]; //extern GDT_DESCRIPTOR KiGdt[256]; /* diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index d71bc2f4235..a71bce076b0 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -9,6 +9,14 @@ * Skywing (skywing@valhallalegends.com) */ +/* + * FIXMES: + * - Clean up file (remove all stack functions and use RtlWalkFrameChain/RtlCaptureStackBacktrace) + * - Sanitize some context fields. + * - Add PSEH handler when an exception occurs in an exception (KiCopyExceptionRecord). + * - Forward exceptions to user-mode debugger. + */ + /* INCLUDES *****************************************************************/ #include @@ -20,19 +28,13 @@ #pragma alloc_text(INIT, KeInitExceptions) #endif - -/* - * FIXMES: - * - Clean up file. - * - Sanitize some context fields. - * - Add PSEH handler when an exception occurs in an exception (KiCopyExceptionRecord). - * - Implement official stack trace functions (exported) and remove stuff here. - * - Forward exceptions to user-mode debugger. - */ - VOID NTAPI -Ki386AdjustEsp0(IN PKTRAP_FRAME TrapFrame); +Ki386AdjustEsp0( + IN PKTRAP_FRAME TrapFrame +); + +extern KIDTENTRY KiIdt[]; /* GLOBALS *****************************************************************/ @@ -45,31 +47,6 @@ Ki386AdjustEsp0(IN PKTRAP_FRAME TrapFrame); # define ARRAY_SIZE(x) (sizeof (x) / sizeof (x[0])) #endif -extern void KiSystemService(void); -extern void KiDebugService(void); - -extern VOID KiTrap0(VOID); -extern VOID KiTrap1(VOID); -extern VOID KiTrap2(VOID); -extern VOID KiTrap3(VOID); -extern VOID KiTrap4(VOID); -extern VOID KiTrap5(VOID); -extern VOID KiTrap6(VOID); -extern VOID KiTrap7(VOID); -extern VOID KiTrap8(VOID); -extern VOID KiTrap9(VOID); -extern VOID KiTrap10(VOID); -extern VOID KiTrap11(VOID); -extern VOID KiTrap12(VOID); -extern VOID KiTrap13(VOID); -extern VOID KiTrap14(VOID); -extern VOID KiTrap15(VOID); -extern VOID KiTrap16(VOID); -extern VOID KiTrap17(VOID); -extern VOID KiTrap18(VOID); -extern VOID KiTrap19(VOID); -extern VOID KiTrapUnknown(VOID); - extern ULONG init_stack; extern ULONG init_stack_top; @@ -388,8 +365,8 @@ KiDoubleFaultHandler(VOID) DbgPrint("{"); if (StackRepeatLength[i] == 0) { - for(;;); - } + for(;;); +} for (j = 0; j < StackRepeatLength[i]; j++) { KeRosPrintAddress(StackTrace[i + j]); @@ -1168,83 +1145,24 @@ KeRosGetStackFrames ( PULONG Frames, ULONG FrameCount ) return Count; } -static void -set_system_call_gate(unsigned int sel, unsigned int func) -{ - DPRINT("sel %x %d\n",sel,sel); - KiIdt[sel].a = (((int)func)&0xffff) + - (KGDT_R0_CODE << 16); - KiIdt[sel].b = 0xef00 + (((int)func)&0xffff0000); - DPRINT("idt[sel].b %x\n",KiIdt[sel].b); -} - -static void set_interrupt_gate(unsigned int sel, unsigned int func) -{ - DPRINT("set_interrupt_gate(sel %d, func %x)\n",sel,func); - KiIdt[sel].a = (((int)func)&0xffff) + - (KGDT_R0_CODE << 16); - KiIdt[sel].b = 0x8e00 + (((int)func)&0xffff0000); -} - -static void set_trap_gate(unsigned int sel, unsigned int func, unsigned int dpl) -{ - DPRINT("set_trap_gate(sel %d, func %x, dpl %d)\n",sel, func, dpl); - ASSERT(dpl <= 3); - KiIdt[sel].a = (((int)func)&0xffff) + - (KGDT_R0_CODE << 16); - KiIdt[sel].b = 0x8f00 + (dpl << 13) + (((int)func)&0xffff0000); -} - -static void -set_task_gate(unsigned int sel, unsigned task_sel) -{ - KiIdt[sel].a = task_sel << 16; - KiIdt[sel].b = 0x8500; -} - VOID INIT_FUNCTION NTAPI KeInitExceptions(VOID) -/* - * FUNCTION: Initalize CPU exception handling - */ { - int i; + ULONG i; + USHORT FlippedSelector; - DPRINT("KeInitExceptions()\n"); + /* Loop the IDT */ + for (i = 0; i <= MAXIMUM_IDTVECTOR; i ++) + { + /* Save the current Selector */ + FlippedSelector = KiIdt[i].Selector; - /* - * Set up the other gates - */ - set_trap_gate(0, (ULONG)KiTrap0, 0); - set_trap_gate(1, (ULONG)KiTrap1, 0); - set_trap_gate(2, (ULONG)KiTrap2, 0); - set_trap_gate(3, (ULONG)KiTrap3, 3); - set_trap_gate(4, (ULONG)KiTrap4, 0); - set_trap_gate(5, (ULONG)KiTrap5, 0); - set_trap_gate(6, (ULONG)KiTrap6, 0); - set_trap_gate(7, (ULONG)KiTrap7, 0); - set_task_gate(8, KGDT_DF_TSS); - set_trap_gate(9, (ULONG)KiTrap9, 0); - set_trap_gate(10, (ULONG)KiTrap10, 0); - set_trap_gate(11, (ULONG)KiTrap11, 0); - set_trap_gate(12, (ULONG)KiTrap12, 0); - set_trap_gate(13, (ULONG)KiTrap13, 0); - set_interrupt_gate(14, (ULONG)KiTrap14); - set_trap_gate(15, (ULONG)KiTrap15, 0); - set_trap_gate(16, (ULONG)KiTrap16, 0); - set_trap_gate(17, (ULONG)KiTrap17, 0); - set_trap_gate(18, (ULONG)KiTrap18, 0); - set_trap_gate(19, (ULONG)KiTrap19, 0); - - for (i = 20; i < 256; i++) - { - set_trap_gate(i,(int)KiTrapUnknown, 0); - } - - set_system_call_gate(0x2d,(int)KiDebugService); - set_system_call_gate(0x2e,(int)KiSystemService); + /* Flip Selector and Extended Offset */ + KiIdt[i].Selector = KiIdt[i].ExtendedOffset; + KiIdt[i].ExtendedOffset = FlippedSelector; + } } VOID diff --git a/reactos/ntoskrnl/ke/i386/irq.c b/reactos/ntoskrnl/ke/i386/irq.c index cb0fd4d4d66..ca93e4aae9e 100644 --- a/reactos/ntoskrnl/ke/i386/irq.c +++ b/reactos/ntoskrnl/ke/i386/irq.c @@ -131,6 +131,7 @@ static ISR_TABLE IsrTable[NR_IRQS][1]; #endif #define TAG_ISR_LOCK TAG('I', 'S', 'R', 'L') +extern IDT_DESCRIPTOR KiIdt[256]; /* FUNCTIONS ****************************************************************/ diff --git a/reactos/ntoskrnl/ke/i386/kernel.c b/reactos/ntoskrnl/ke/i386/kernel.c index e362f9c565f..d1e013e8ba8 100644 --- a/reactos/ntoskrnl/ke/i386/kernel.c +++ b/reactos/ntoskrnl/ke/i386/kernel.c @@ -31,7 +31,7 @@ ULONG KeI386XMMIPresent = 0; ULONG KeI386FxsrPresent = 0; extern PVOID Ki386InitialStackArray[MAXIMUM_PROCESSORS]; extern ULONG IdleProcessorMask; - +extern KIDTENTRY KiIdt[256]; static VOID INIT_FUNCTION Ki386GetCpuId(VOID); #if defined (ALLOC_PRAGMA) @@ -309,7 +309,7 @@ KeInit1(PCHAR CommandLine, PULONG LastKernelAddress) KPCR->Irql = SYNCH_LEVEL; KPCR->NtTib.Self = &KPCR->NtTib; KPCR->GDT = KiBootGdt; - KPCR->IDT = (PUSHORT)KiIdt; + KPCR->IDT = KiIdt; KPCR->TSS = &KiBootTss; KPCR->Number = 0; KPCR->SetMember = 1 << 0; diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index 43ec33971ef..41dc1edff42 100644 --- a/reactos/ntoskrnl/ke/i386/trap.s +++ b/reactos/ntoskrnl/ke/i386/trap.s @@ -20,44 +20,52 @@ * - Handle failure after PsConvertToGuiThread. * - Figure out what the DEBUGEIP hack is for and how it can be moved away. * - Add DR macro/save and VM macro/save. - * - Add .func .endfunc to everything that doesn't have it yet. * - Implement KiCallbackReturn, KiGetTickCount, KiRaiseAssertion. */ /* GLOBALS ******************************************************************/ +.globl _KiIdt +_KiIdt: /* This is the Software Interrupt Table that we handle in this file: */ -.globl _KiTrap0 /* INT 0: Divide Error (#DE) */ -.globl _KiTrap1 /* INT 1: Debug Exception (#DB) */ -.globl _KiTrap2 /* INT 2: NMI Interrupt */ -.globl _KiTrap3 /* INT 3: Breakpoint Exception (#BP) */ -.globl _KiTrap4 /* INT 4: Overflow Exception (#OF) */ -.globl _KiTrap5 /* INT 5: BOUND Range Exceeded (#BR) */ -.globl _KiTrap6 /* INT 6: Invalid Opcode Code (#UD) */ -.globl _KiTrap7 /* INT 7: Device Not Available (#NM) */ -.globl _KiTrap8 /* INT 8: Double Fault Exception (#DF) */ -.globl _KiTrap9 /* INT 9: RESERVED */ -.globl _KiTrap10 /* INT 10: Invalid TSS Exception (#TS) */ -.globl _KiTrap11 /* INT 11: Segment Not Present (#NP) */ -.globl _KiTrap12 /* INT 12: Stack Fault Exception (#SS) */ -.globl _KiTrap13 /* INT 13: General Protection (#GP) */ -.globl _KiTrap14 /* INT 14: Page-Fault Exception (#PF) */ -.globl _KiTrap15 /* INT 15: RESERVED */ -.globl _KiTrap16 /* INT 16: x87 FPU Error (#MF) */ -.globl _KiTrap17 /* INT 17: Align Check Exception (#AC) */ -.globl _KiTrap18 /* INT 18: Machine Check Exception (#MC)*/ -.globl _KiTrap19 /* INT 19: SIMD FPU Exception (#XF) */ -.globl _KiTrapUnknown /* INT 20-30: UNDEFINED INTERRUPTS */ -.globl _KiDebugService /* INT 31: Get Tick Count Handler */ -.globl _KiCallbackReturn /* INT 32: User-Mode Callback Return */ -.globl _KiRaiseAssertion /* INT 33: Debug Assertion Handler */ -.globl _KiDebugService /* INT 34: Debug Service Handler */ -.globl _KiSystemService /* INT 35: System Call Service Handler */ +idt _KiTrap0, INT_32_DPL0 /* INT 00: Divide Error (#DE) */ +idt _KiTrap1, INT_32_DPL0 /* INT 01: Debug Exception (#DB) */ +idt _KiTrap2, INT_32_DPL0 /* INT 02: NMI Interrupt */ +idt _KiTrap3, INT_32_DPL3 /* INT 03: Breakpoint Exception (#BP) */ +idt _KiTrap4, INT_32_DPL3 /* INT 04: Overflow Exception (#OF) */ +idt _KiTrap5, INT_32_DPL0 /* INT 05: BOUND Range Exceeded (#BR) */ +idt _KiTrap6, INT_32_DPL0 /* INT 06: Invalid Opcode Code (#UD) */ +idt _KiTrap7, INT_32_DPL0 /* INT 07: Device Not Available (#NM) */ +idt _KiTrap8, INT_32_DPL0 /* INT 08: Double Fault Exception (#DF) */ +idt _KiTrap9, INT_32_DPL0 /* INT 09: RESERVED */ +idt _KiTrap10, INT_32_DPL0 /* INT 0A: Invalid TSS Exception (#TS) */ +idt _KiTrap11, INT_32_DPL0 /* INT 0B: Segment Not Present (#NP) */ +idt _KiTrap12, INT_32_DPL0 /* INT 0C: Stack Fault Exception (#SS) */ +idt _KiTrap13, INT_32_DPL0 /* INT 0D: General Protection (#GP) */ +idt _KiTrap14, INT_32_DPL0 /* INT 0E: Page-Fault Exception (#PF) */ +idt _KiTrap15, INT_32_DPL0 /* INT 0F: RESERVED */ +idt _KiTrap16, INT_32_DPL0 /* INT 10: x87 FPU Error (#MF) */ +idt _KiTrap17, INT_32_DPL0 /* INT 11: Align Check Exception (#AC) */ +idt _KiTrap18, INT_32_DPL0 /* INT 12: Machine Check Exception (#MC)*/ +idt _KiTrap19, INT_32_DPL0 /* INT 13: SIMD FPU Exception (#XF) */ +.rept 22 +idt _KiTrapUnknown, INT_32_DPL0 /* INT 14-29: UNDEFINED INTERRUPTS */ +.endr +idt _KiGetTickCount, INT_32_DPL3 /* INT 2A: Get Tick Count Handler */ +idt _KiCallbackReturn, INT_32_DPL3 /* INT 2B: User-Mode Callback Return */ +idt _KiRaiseAssertion, INT_32_DPL3 /* INT 2C: Debug Assertion Handler */ +idt _KiDebugService, INT_32_DPL3 /* INT 2D: Debug Service Handler */ +idt _KiSystemService, INT_32_DPL3 /* INT 2E: System Call Service Handler */ +idt _KiTrapUnknown, INT_32_DPL0 /* INT 2F: RESERVED */ +.rept 220 +idt _KiTrapUnknown, INT_32_DPL0 /* INT 30-FF: UNDEFINED INTERRUPTS */ +.endr -/* We also handle LSTAR Entry */ +/* System call entrypoints: */ .globl _KiFastCallEntry +.globl _KiSystemService -/* And special system-defined software traps */ +/* And special system-defined software traps: */ .globl _NtRaiseException@12 .globl _NtContinue@8 @@ -66,8 +74,18 @@ .globl _KiServiceExit2 /* Exit from syscall with complete frame*/ .globl _Kei386EoiHelper@0 /* Exit from interrupt or H/W trap */ +.globl _KiIdtDescriptor +_KiIdtDescriptor: + .short 0x800 + .long _KiIdt + /* FUNCTIONS ****************************************************************/ +_KiGetTickCount: +_KiCallbackReturn: +_KiRaiseAssertion: + int 3 + .func KiSystemService _KiSystemService: @@ -473,6 +491,7 @@ AbiosExit: /* Not yet supported */ int 3 +.func KiDebugService _KiDebugService: /* Push error code */ @@ -526,7 +545,9 @@ NotUserMode: /* Exit through common routine */ jmp _Kei386EoiHelper@0 +.endfunc +.func NtRaiseException@12 _NtRaiseException@12: /* NOTE: We -must- be called by Zw* to have the right frame! */ @@ -571,7 +592,9 @@ _NtRaiseException@12: /* Restore debug registers too */ jmp _KiServiceExit +.endfunc +.func NtContinue@8 _NtContinue@8: /* NOTE: We -must- be called by Zw* to have the right frame! */ @@ -619,6 +642,7 @@ Error: pop ebp mov esp, ebp jmp _KiServiceExit +.endfunc _KiTrap0: /* Push error code */ @@ -780,6 +804,7 @@ _KiTrap7: jne _Kei386EoiHelper@0 jmp _KiV86Complete +.globl _KiTrap8 _KiTrap8: call _KiDoubleFaultHandler iret diff --git a/reactos/ntoskrnl/ntoskrnl.xml b/reactos/ntoskrnl/ntoskrnl.xml index ecfc96f1006..6e60e5a0a48 100644 --- a/reactos/ntoskrnl/ntoskrnl.xml +++ b/reactos/ntoskrnl/ntoskrnl.xml @@ -30,7 +30,6 @@ exp.c fpu.c gdt.c - idt.c irq.c irqhand.s kernel.c