- Fix a build issue. - Added more DBG checks for trap exits: * Detect if exiting with incorrect IF state. * Detect if exiting with broken stack. * Detect if exiting with a broken trap frame (note: Disabled in Kei386EoiHelper beause this raises the assertion. The trap frame is valid, it's just that some old code is using DbgArgMark for other purposes. Will fix.) * Detect if exiting with invalid FS. * Detect if exiting with invalid Exception List. * Detect if exiting with incorrect exception list and/or incorrect previmous mode on the stack (to detect macro/calling type mismatch). The trap exit code is now complete and shareable across all 3 trap exit types, except for one broken assertion left to fix. Modified: trunk/reactos/include/ndk/asm.h Modified: trunk/reactos/ntoskrnl/ke/i386/exp.c Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S _____
Modified: trunk/reactos/include/ndk/asm.h --- trunk/reactos/include/ndk/asm.h 2006-01-16 21:41:19 UTC (rev 20922) +++ trunk/reactos/include/ndk/asm.h 2006-01-16 22:07:38 UTC (rev 20923) @@ -356,7 +356,9 @@
// // NTSTATUS Codes // +#ifdef __ASM__ #define STATUS_INVALID_SYSTEM_SERVICE 0xC000001C +#endif
// // Generic Definitions _____
Modified: trunk/reactos/ntoskrnl/ke/i386/exp.c --- trunk/reactos/ntoskrnl/ke/i386/exp.c 2006-01-16 21:41:19 UTC (rev 20922) +++ trunk/reactos/ntoskrnl/ke/i386/exp.c 2006-01-16 22:07:38 UTC (rev 20923) @@ -495,9 +495,6 @@
ASSERT(ExceptionNr != 14);
- /* Store the exception number in an unused field in the trap frame. */ - Tf->DbgArgMark = ExceptionNr; - /* Use the address of the trap frame as approximation to the ring0 esp */ Esp0 = (ULONG)&Tf->Eip;
_____
Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S --- trunk/reactos/ntoskrnl/ke/i386/syscall.S 2006-01-16 21:41:19 UTC (rev 20922) +++ trunk/reactos/ntoskrnl/ke/i386/syscall.S 2006-01-16 22:07:38 UTC (rev 20923) @@ -484,13 +484,74 @@
KiRosTrapReturn: // ========================= COMMON TRAP EXIT CODE ===================// - /* Restore exception list */ +#ifdef DBG + /* Assert the flags */ + pushfd + pop edx + test edx, EFLAGS_INTERRUPT_MASK + jnz InvalidExitState + + /* Assert the stack */ + cmp esp, ebp + jnz InvalidExitState + + /* Assert the trap frame */ +StateCheckDone: + sub dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00 + jnz InvalidTrapFrame + + /* Assert FS */ + mov bx, fs + cmp bx, KGDT_R0_PCR + jnz InvalidFs + + /* Assert exception list */ + cmp dword ptr fs:[KPCR_EXCEPTION_LIST], 0 + jnz ExceptionListOK + +InvalidFs: + push -1 + call _KeBugCheck@4 + +InvalidTrapFrame: + add dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00 + +InvalidExitState: + int 3 + jmp StateCheckDone + +ExceptionListOK: +#endif + + /* Get exception list */ mov edx, [esp+KTRAP_FRAME_EXCEPTION_LIST] + +#ifdef DBG + /* Assert the saved exception list */ + or edx, edx + jnz ListOk + int 3 + +ListOk: +#endif + + /* Restore it */ mov [fs:KPCR_EXCEPTION_LIST], edx
// ==================== ONLY IF PREVIOUS MODE NEEDED ==================// - /* Restore previous mode */ + /* Get previous mode */ mov ecx, [esp+KTRAP_FRAME_PREVIOUS_MODE] + +#ifdef DBG + /* Assert the saved previous mode */ + cmp ecx, -1 + jnz ModeOk + int 3 + +ModeOk: +#endif + + /* Restore the previous mode */ mov esi, [fs:KPCR_CURRENT_THREAD] mov byte ptr [esi+KTHREAD_PREVIOUS_MODE], cl // ==================== END IF PREVIOUS MODE NEEDED ===================// @@ -766,13 +827,74 @@ jmp ApcLoop2
KiRosTrapReturn2: +#ifdef DBG + /* Assert the flags */ + pushfd + pop edx + test edx, EFLAGS_INTERRUPT_MASK + jnz InvalidExitState2
- /* Restore exception list */ + /* Assert the stack */ + cmp esp, ebp + jnz InvalidExitState2 + + /* Assert the trap frame */ +StateCheckDone2: + sub dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00 + jnz InvalidTrapFrame2 + + /* Assert FS */ + mov bx, fs + cmp bx, KGDT_R0_PCR + jnz InvalidFs2 + + /* Assert exception list */ + cmp dword ptr fs:[KPCR_EXCEPTION_LIST], 0 + jnz ExceptionListOK2 + +InvalidFs2: + push -1 + call _KeBugCheck@4 + +InvalidTrapFrame2: + add dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00 + +InvalidExitState2: + int 3 + jmp StateCheckDone2 + +ExceptionListOK2: +#endif + + /* Get exception list */ mov edx, [esp+KTRAP_FRAME_EXCEPTION_LIST] + +#ifdef DBG + /* Assert the saved exception list */ + or edx, edx + jnz ListOk2 + int 3 + +ListOk2: +#endif + + /* Restore it */ mov [fs:KPCR_EXCEPTION_LIST], edx
+// ==================== ONLY IF PREVIOUS MODE NEEDED ==================// + /* Get previous mode */ + mov ecx, [esp+KTRAP_FRAME_PREVIOUS_MODE] + +#ifdef DBG + /* Assert the saved previous mode */ + cmp ecx, -1 + jnz ModeOk2 + int 3 + +ModeOk2: +#endif + /* Restore previous mode */ - mov ecx, [esp+KTRAP_FRAME_PREVIOUS_MODE] mov esi, [fs:KPCR_CURRENT_THREAD] mov byte ptr [esi+KTHREAD_PREVIOUS_MODE], cl
@@ -957,9 +1079,58 @@ jmp ApcLoop3
KiRosTrapReturn3: +#ifdef DBG + /* Assert the flags */ + pushfd + pop edx + test edx, EFLAGS_INTERRUPT_MASK + jnz InvalidExitState3
+ /* Assert the stack */ + cmp esp, ebp + jnz InvalidExitState3 + + /* Assert the trap frame */ +StateCheckDone3: + //sub dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00 + //jnz InvalidTrapFrame3 + + /* Assert FS */ + mov bx, fs + cmp bx, KGDT_R0_PCR + jnz InvalidFs3 + + /* Assert exception list */ + cmp dword ptr fs:[KPCR_EXCEPTION_LIST], 0 + jnz ExceptionListOK3 + +InvalidFs3: + push -1 + call _KeBugCheck@4 + +InvalidTrapFrame3: + add dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00 + +InvalidExitState3: + int 3 + jmp StateCheckDone3 + +ExceptionListOK3: +#endif + + /* Get exception list */ + mov edx, [esp+KTRAP_FRAME_EXCEPTION_LIST] + +#ifdef DBG + /* Assert the saved exception list */ + or edx, edx + jnz ListOk3 + int 3 + +ListOk3: +#endif + /* Restore exception list */ - mov edx, [esp+KTRAP_FRAME_EXCEPTION_LIST] mov [fs:KPCR_EXCEPTION_LIST], edx
/* Check for V86 */