* Add more documented flags from ks386.inc to asm.h * Isolate and clean-up the VMWare hack; the shared trap exit macro can now be implemented. Modified: trunk/reactos/include/ndk/asm.h Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S Modified: trunk/reactos/ntoskrnl/ke/i386/usercall_asm.S _____
Modified: trunk/reactos/include/ndk/asm.h --- trunk/reactos/include/ndk/asm.h 2006-01-17 03:28:33 UTC (rev 20932) +++ trunk/reactos/include/ndk/asm.h 2006-01-17 05:05:35 UTC (rev 20933) @@ -354,10 +354,13 @@
#define CBSTACK_RESULT_LENGTH 0x24
// -// NTSTATUS Codes +// NTSTATUS and Bugcheck Codes // #ifdef __ASM__ #define STATUS_INVALID_SYSTEM_SERVICE 0xC000001C +#define STATUS_NO_CALLBACK_ACTIVE 0xC0000258 +#define APC_INDEX_MISMATCH 1 +#define IRQL_GT_ZERO_AT_SYSTEM_SERVICE 0x4A #endif
// _____
Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S --- trunk/reactos/ntoskrnl/ke/i386/syscall.S 2006-01-17 03:28:33 UTC (rev 20932) +++ trunk/reactos/ntoskrnl/ke/i386/syscall.S 2006-01-17 05:05:35 UTC (rev 20933) @@ -7,8 +7,6 @@
#include <asm.h> #include <internal/i386/asmmacro.S> -#define APC_INDEX_MISMATCH 1 -#define IRQL_GT_ZERO_AT_SYSTEM_SERVICE 0x4A
.globl _KiServiceExit .globl _KiServiceExit2 @@ -18,7 +16,7 @@ .intel_syntax noprefix
/* - * There are 3 main types of Trap Entries: + * There are 3 main types of Trap Entries: <= Move this to asmmacro.S * * - System Calls * - TODO @@ -31,7 +29,7 @@ */
/* - * There are 3 main types of Trap Exits: + * There are 3 main types of Trap Exits: <= Correct some things and move to asmmacro.S * * - KiServiceExit * - Clear interrupt flag @@ -66,17 +64,10 @@ * All these are exemplified by the 3 trap exits shown above */
-/* - * There is also common Debug Code present in the common exit code, which - * in turn calls common code to save the debug registers - */ - /* * FIXMEs: - * - Dig in trap code and see why we need to push/pop the segments, - * which -shouldn't- be needed on syscalls; one of the things - * missing for this to work is lazy loading in the GPF handler, - * but there are other things to consider. + * - Figure out why ES/DS gets messed up in VMWare, when doing KiServiceExit only, + * and only when called from user-mode, and returning to user-mode. * - Use macros and merge with trap.s nicely */
@@ -159,15 +150,13 @@ /* Push previous mode */ push UserMode
-.att_syntax - /* Save other registers */ - sub $0xC, %esp // + 0x70 - pushl $KGDT_R3_DATA + RPL_MASK // + 0x40 - pushl $KGDT_R3_DATA + RPL_MASK // + 0x44 - pushl $0 // + 0x48 - sub $0x30, %esp // + 0x70 -.intel_syntax noprefix + /* Skip the other registers */ + sub esp, 0x48
+ /* Hack: it seems that on VMWare someone damages ES/DS on exit. Investigate! */ + mov dword ptr [esp+KTRAP_FRAME_DS], KGDT_R3_DATA + RPL_MASK + mov dword ptr [esp+KTRAP_FRAME_ES], KGDT_R3_DATA + RPL_MASK + /* Make space for us on the stack */ sub ebp, 0x29C
@@ -216,16 +205,14 @@
/* Save the old previous mode */ push ss:[esi+KTHREAD_PREVIOUS_MODE] - -.att_syntax - /* Save other registers */ - sub $0xC, %esp // + 0x70 - pushl %ds // + 0x40 - pushl %es // + 0x44 - pushl %gs // + 0x48 - sub $0x30, %esp // + 0x70 -.intel_syntax noprefix
+ /* Skip the other registers */ + sub esp, 0x48 + + /* Hack: it seems that on VMWare someone damages ES/DS on exit. Investigate! */ + mov [esp+KTRAP_FRAME_DS], ds + mov [esp+KTRAP_FRAME_ES], es + /* Set the new previous mode based on the saved CS selector */ mov ebx, [esp+0x6C] and ebx, 1 @@ -424,6 +411,10 @@ /* Check for, and deliver, User-Mode APCs if needed */ CHECK_FOR_APC_DELIVER 1
+ /* Hack for VMWare: Sometimes ES/DS seem to be invalid when returning to user-mode. Investigate! */ + mov es, [ebp+KTRAP_FRAME_ES] + mov ds, [ebp+KTRAP_FRAME_DS] + // ========================= COMMON TRAP EXIT CODE ===================// #ifdef DBG /* Assert the flags */ @@ -515,14 +506,6 @@ jz CommonStackClean // ==================== END IF FULL RESTORE NEEDED ====================//
-//badbadbad - add esp, 0x30 - pop gs - pop es - pop ds - add esp, 0x14 -//badbadbad - /* Restore FS */ RestoreFs: lea esp, [ebp+KTRAP_FRAME_FS] _____
Modified: trunk/reactos/ntoskrnl/ke/i386/usercall_asm.S --- trunk/reactos/ntoskrnl/ke/i386/usercall_asm.S 2006-01-17 03:28:33 UTC (rev 20932) +++ trunk/reactos/ntoskrnl/ke/i386/usercall_asm.S 2006-01-17 05:05:35 UTC (rev 20933) @@ -9,17 +9,9 @@
/* INCLUDES ******************************************************************/
#include <asm.h> -//#include <bugcodes.h> -#define APC_INDEX_MISMATCH 1 -#define IRQL_GT_ZERO_AT_SYSTEM_SERVICE 0x4A -#define STATUS_NO_CALLBACK_ACTIVE 0xC0000258 +#include <internal/i386/asmmacro.S> .intel_syntax noprefix
-// This file is a work in progress. Most of the code is currently disabled. - -/* GLOBALS ****************************************************************/ -.extern PVOID _KeUserCallbackDispatcher - /* FUNCTIONS ****************************************************************/
.globl _KiGetUserModeStackAddress@0 @@ -186,8 +178,7 @@ lea esi, [edx+KTRAP_FRAME_FS] rep movsd
- /* TODO: Ugly hack because of some missing logic in syscall.s */ - mov dword ptr [esp+KTRAP_FRAME_GS], 0 + /* VMWARE Hack because ES/DS sometimes gets smashed when returning to User-Mode. Investigate! */ mov dword ptr [esp+KTRAP_FRAME_DS], KGDT_R3_DATA + RPL_MASK mov dword ptr [esp+KTRAP_FRAME_ES], KGDT_R3_DATA + RPL_MASK
@@ -209,12 +200,7 @@ sti
/* Write the debug data */ - mov edi, [ebp+KTRAP_FRAME_EBP] - mov edx, [ebp+KTRAP_FRAME_EIP] - mov [ebp+KTRAP_FRAME_DEBUGPOINTER], edx - mov dword ptr [ebp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00 - mov [ebp+KTRAP_FRAME_DEBUGEBP], ebx - mov [ebp+KTRAP_FRAME_DEBUGEIP], edi + SET_TF_DEBUG_HEADER
/* Exit to user-mode */ jmp _KiServiceExit