Author: ion Date: Sat Aug 26 10:14:32 2006 New Revision: 23714
URL: http://svn.reactos.org/svn/reactos?rev=23714&view=rev Log: - Transform TRAP_PROLOG into a GAS macro. - Remove code in the page fault handler which was corrupting the trap frame. - Remove some ROS hacks that dealt with the fact the trap frame was getting corrupted, since now it isn't anymore. - Enable code that checks for Teb->GdiBatchCount during win32k system calls. The bugs that were mentionned in the #if 0 are fixed.
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/mm/i386/pfault.c
Modified: trunk/reactos/include/ndk/asm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/asm.h?rev=23714... ============================================================================== --- trunk/reactos/include/ndk/asm.h (original) +++ trunk/reactos/include/ndk/asm.h Sat Aug 26 10:14:32 2006 @@ -327,6 +327,7 @@ #define TEB_EXCEPTION_CODE 0x1A4 #define TEB_ACTIVATION_CONTEXT_STACK_POINTER 0x1A8 #define TEB_DEALLOCATION_STACK 0xE0C +#define TEB_GDI_BATCH_COUNT 0xF70 #define TEB_GUARANTEED_STACK_BYTES 0xF78 #define TEB_FLS_DATA 0xFB4
Modified: trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/i... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S (original) +++ trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S Sat Aug 26 10:14:32 2006 @@ -266,63 +266,64 @@ // /* Handle trap */ // <Your Trap Code Here> // -#define TRAP_PROLOG(Label) \ - /* Just to be safe, clear out the HIWORD, since it's reserved */ \ - mov word ptr [esp+2], 0; \ -\ - /* Save the non-volatiles */ \ - push ebp; \ - push ebx; \ - push esi; \ - push edi; \ -\ - /* Save FS and set it to PCR */ \ - push fs; \ - mov ebx, KGDT_R0_PCR; \ - mov fs, bx; \ -\ - /* Save exception list and bogus previous mode */ \ - push fs:[KPCR_EXCEPTION_LIST]; \ - push -1; \ -\ - /* Save volatiles and segment registers */ \ - push eax; \ - push ecx; \ - push edx; \ - push ds; \ - push es; \ - push gs; \ -\ - /* Set the R3 data segment */ \ - mov ax, KGDT_R3_DATA + RPL_MASK; \ -\ - /* Skip debug registers and debug stuff */ \ - sub esp, 0x30; \ -\ - /* Load the segment registers */ \ - mov ds, ax; \ - mov es, ax; \ -\ - /* Set up frame */ \ - mov ebp, esp; \ -\ - /* Check if this was from V86 Mode */ \ - /* test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK; */ \ - /* jnz V86_Label; */ \ -\ - /* Get current thread */ \ - 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; */ \ - /* jnz Dr_Label; */ \ -\ - /* Set the Trap Frame Debug Header */ \ +.macro TRAP_PROLOG Label + /* Just to be safe, clear out the HIWORD, since it's reserved */ + mov word ptr [esp+2], 0 + + /* Save the non-volatiles */ + push ebp + push ebx + push esi + push edi + + /* Save FS and set it to PCR */ + push fs + mov ebx, KGDT_R0_PCR + mov fs, bx + + /* Save exception list and bogus previous mode */ + push fs:[KPCR_EXCEPTION_LIST] + push -1 + + /* Save volatiles and segment registers */ + push eax + push ecx + push edx + push ds + push es + push gs + + /* Set the R3 data segment */ + mov ax, KGDT_R3_DATA + RPL_MASK + + /* Skip debug registers and debug stuff */ + sub esp, 0x30 + + /* Load the segment registers */ + mov ds, ax + mov es, ax + + /* Set up frame */ + mov ebp, esp + + /* Check if this was from V86 Mode */ + /* test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK; */ + /* jnz V86_Label; */ + + /* Get current thread */ + 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; */ + /* jnz Dr_Label; */ + + /* Set the Trap Frame Debug Header */ SET_TF_DEBUG_HEADER +.endm
// // @name INT_PROLOG @@ -507,23 +508,6 @@ /* Set the trap frame debug header */ SET_TF_DEBUG_HEADER
-#ifdef DBG // FIXME: Is this for GDB? Can it be moved in the stub? - /* - * We want to know the address from where the syscall stub was called. - * If PrevMode is KernelMode, that address is stored in our own (kernel) - * stack, at location KTRAP_FRAME_ESP. - * If we're coming from UserMode, we load the usermode stack pointer - * and go back two frames (first frame is the syscall stub, second call - * is the caller of the stub). - */ - mov edi, [ebp+KTRAP_FRAME_ESP] - test byte ptr [esi+KTHREAD_PREVIOUS_MODE], 0x01 - jz 0f - mov edi, [edi+4] -0: - mov [ebp+KTRAP_FRAME_DEBUGEIP], edi -#endif - /* Enable interrupts */ sti .endm @@ -754,20 +738,9 @@
#if DBG 0: -#if 0 - /* Print a message */ - mov esi, [esp+KTRAP_FRAME_DEBUGARGMARK] - mov edi, [esp+KTRAP_FRAME_DEBUGARGMARK-4] - push edi - push esi - push offset Broken - call _DbgPrint - add esp, 12 -#endif - jmp 2b // ros hack - /* Fix up the mask */ add dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00 + 6: int 3 jmp 5b
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 Sat Aug 26 10:14:32 2006 @@ -187,23 +187,6 @@ /* Set the trap frame debug header */ SET_TF_DEBUG_HEADER
-#ifdef DBG // FIXME: Is this for GDB? Can it be moved in the stub? - /* - * We want to know the address from where the syscall stub was called. - * If PrevMode is KernelMode, that address is stored in our own (kernel) - * stack, at location KTRAP_FRAME_ESP. - * If we're coming from UserMode, we load the usermode stack pointer - * and go back two frames (first frame is the syscall stub, second call - * is the caller of the stub). - */ - mov edi, [ebp+KTRAP_FRAME_ESP] - test byte ptr [esi+KTHREAD_PREVIOUS_MODE], 0x01 - jz PrevWasKernelMode - mov edi, [edi+4] -PrevWasKernelMode: - mov [ebp+KTRAP_FRAME_DEBUGEIP], edi -#endif - /* Enable interrupts */ sti
@@ -229,9 +212,6 @@ /* Invalid ID, try to load Win32K Table */ jnb KiBBTUnexpectedRange
-#if 0 // <== Disabled for two reasons: We don't save TEB in 0x18, but KPCR. - // <== We don't have a KeGdiFlushUserBatch callback yet (needs to be - // sent through the PsInitializeWin32Callouts structure) /* Check if this was Win32K */ cmp ecx, SERVICE_TABLE_TEST jnz NotWin32K @@ -242,15 +222,14 @@ /* Check if we should flush the User Batch */ xor ebx, ebx or ebx, [ecx+TEB_GDI_BATCH_COUNT] - jz NoWin32K + jz NotWin32K
/* Flush it */ push edx push eax - call [_KeGdiFlushUserBatch] + //call [_KeGdiFlushUserBatch] pop eax pop edx -#endif
NotWin32K: /* Increase total syscall count */
Modified: trunk/reactos/ntoskrnl/mm/i386/pfault.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/i386/pfault.c?r... ============================================================================== --- trunk/reactos/ntoskrnl/mm/i386/pfault.c (original) +++ trunk/reactos/ntoskrnl/mm/i386/pfault.c Sat Aug 26 10:14:32 2006 @@ -36,9 +36,6 @@
ASSERT(ExceptionNr == 14);
- /* Store the exception number in an unused field in the trap frame. */ - Tf->DbgArgMark = 14; - /* get the faulting address */ cr2 = Ke386GetCr2(); Tf->DbgArgPointer = cr2;