* Add more PSDK defintions to asm.h * Use these new definitions instead of constants in syscall.S * Document the macros using doxygen-compatible format, and convert SET_TF_DEBUG_HEADER to as macro instead of CPP macro. * Use SET_TF_DEBUG_HEADER in system call handlers instead of duplicating the code. Modified: trunk/reactos/include/ndk/asm.h Modified: trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S _____
Modified: trunk/reactos/include/ndk/asm.h --- trunk/reactos/include/ndk/asm.h 2006-01-17 01:22:21 UTC (rev 20929) +++ trunk/reactos/include/ndk/asm.h 2006-01-17 03:00:21 UTC (rev 20930) @@ -361,6 +361,20 @@
#endif
// +// System Call Table definitions +// +#define NUMBER_SERVICE_TABLES 0x0002 +#define SERVICE_NUMBER_MASK 0x0FFF +#define SERVICE_TABLE_SHIFT 0x0008 +#define SERVICE_TABLE_MASK 0x0010 +#define SERVICE_TABLE_TEST 0x0010 +#define SERVICE_DESCRIPTOR_BASE 0x0000 +#define SERVICE_DESCRIPTOR_COUNT 0x0004 +#define SERVICE_DESCRIPTOR_LIMIT 0x0008 +#define SERVICE_DESCRIPTOR_NUMBER 0x000C +#define SERVICE_DESCRIPTOR_LENGTH 0x0010 + +// // Generic Definitions // #define MAXIMUM_IDTVECTOR 0xFF _____
Modified: trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S --- trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S 2006-01-17 01:22:21 UTC (rev 20929) +++ trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S 2006-01-17 03:00:21 UTC (rev 20930) @@ -46,30 +46,40 @@
#endif
// -// SET_TF_DEBUG_HEADER +// @name SET_TF_DEBUG_HEADER +// // This macro sets up the debug header in the trap frame. -// Assumptions: -// ebp = PKTRAP_FRAME -// edi/ebx = Have been saved and can be used // -#define SET_TF_DEBUG_HEADER \ - /* Get the Debug Trap Frame EBP/EIP */ \ - mov ebx, [ebp+KTRAP_FRAME_EBP]; \ - mov edi, [ebp+KTRAP_FRAME_EIP]; \ -\ - /* Write the debug data */ \ - 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; +// @param None. +// +// @remark ebp = PKTRAP_FRAME. +// edi/ebx = Have been saved and can be used. +// +.macro SET_TF_DEBUG_HEADER + /* Get the Debug Trap Frame EBP/EIP */ + mov ebx, [ebp+KTRAP_FRAME_EBP] + mov edi, [ebp+KTRAP_FRAME_EIP]
+ /* Write the debug data */ + 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 +.endm + // -// These macros help with USer-Mode APC delivery after exiting a trap. -// -// CHECK_FOR_APC_DELIVER +// @name CHECK_FOR_APC_DELIVER +// // This macro checks if the trapframe indicates a return to user-mode, // and, if so, checks if user-mode APCs should be delivered. // +// @param PreserveEax +// Determines if EAX should be preserved. Implies that the segment +// registers will also be saved. +// +// @remark ebp = PKTRAP_FRAME. +// ebx = Saved and will be used. +// .macro CHECK_FOR_APC_DELIVER PreserveEax /* Check for V86 mode */ test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK @@ -129,26 +139,28 @@ 2: .endm
- // -// These macros control common execution paths for Traps and System Call Code -// -// TRAP_PROLOG +// @name TRAP_PROLOG +// // This macro creates a standard trap entry prologue. // It should be used for entry into any kernel trap (KiTrapXx), but not for // system calls, which require special handling. // -// Use as follows: -// _KiTrap00: -// /* Push fake error code */ -// push 0 +// @param Label +// Identifying name of the caller function; will be used to append +// to the name V86 and DR helper functions, which must already exist. // -// /* Enter common prologue */ -// TRAP_PROLOG(0) +// @remark Use as follows: +// _KiTrap00: +// /* Push fake error code */ +// push 0 // -// /* Handle trap */ -// <Your Trap Code Here> +// /* Enter common prologue */ +// TRAP_PROLOG(0) // +// /* 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; \ _____
Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S --- trunk/reactos/ntoskrnl/ke/i386/syscall.S 2006-01-17 01:22:21 UTC (rev 20929) +++ trunk/reactos/ntoskrnl/ke/i386/syscall.S 2006-01-17 03:00:21 UTC (rev 20930) @@ -238,24 +238,20 @@
mov ebx, [esi+KTHREAD_TRAP_FRAME] mov [ebp+KTRAP_FRAME_EDX], ebx
-// ==================== COMMON DR SAVE CHECK.AND DEBUG FRAME SETUP ============// /* Flush DR7 */ and dword ptr [ebp+KTRAP_FRAME_DR7], 0
/* Check if the thread was being debugged */ test byte ptr [esi+KTHREAD_DEBUG_ACTIVE], 0xFF - cld //jnz Dr_kss_a
- /* Save a pointer to the trap frame in the TCB */ SharedCode: mov [esi+KTHREAD_TRAP_FRAME], ebp
- /* Get the Debug Trap Frame EBP/EIP */ - mov ebx, [ebp+KTRAP_FRAME_EBP] - mov edi, [ebp+KTRAP_FRAME_EIP] + /* Set the trap frame debug header */ + SET_TF_DEBUG_HEADER
-#ifdef DBG +#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) @@ -269,15 +265,9 @@ jz PrevWasKernelMode mov edi, [edi+4] PrevWasKernelMode: + mov [ebp+KTRAP_FRAME_DEBUGEIP], edi #endif
- /* Write the debug data */ - 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 - -// ============= END OF COMMON DR SAVE CHECK.AND DEBUG FRAME SETUP ============// /* Enable interrupts */ sti
@@ -288,8 +278,8 @@ * The offset is related to the Table Index as such: Offset = TableIndex x 10 */ mov edi, eax - shr edi, 8 - and edi, 0x10 + shr edi, SERVICE_TABLE_SHIFT + and edi, SERVICE_TABLE_MASK mov ecx, edi
/* Now add the thread's base system table to the offset */ @@ -297,8 +287,8 @@
/* Get the true syscall ID and check it */ mov ebx, eax - and eax, 0xFFF - cmp eax, [edi+8] + and eax, SERVICE_NUMBER_MASK + cmp eax, [edi+SERVICE_DESCRIPTOR_LIMIT]
/* Invalid ID, try to load Win32K Table */ jnb KiBBTUnexpectedRange @@ -307,7 +297,7 @@ // <== We don't have a KeGdiFlushUserBatch callback yet (needs to be // sent through the PsInitializeWin32Callouts structure) /* Check if this was Win32K */ - cmp ecx, 0x10 + cmp ecx, SERVICE_TABLE_TEST jnz NotWin32K
/* Get the TEB */ @@ -332,7 +322,7 @@
#ifdef DBG /* Increase per-syscall count */ - mov ecx, [edi+4] + mov ecx, [edi+SERVICE_DESCRIPTOR_COUNT] jecxz NoCountTable inc dword ptr [ecx+eax*4] #endif @@ -342,12 +332,12 @@ mov esi, edx
/* Allocate room for argument list from kernel stack */ - mov ebx, [edi+12] + mov ebx, [edi+SERVICE_DESCRIPTOR_NUMBER] xor ecx, ecx mov cl, [eax+ebx]
/* Get pointer to function */ - mov edi, [edi] + mov edi, [edi+SERVICE_DESCRIPTOR_BASE] mov ebx, [edi+eax*4]
/* Allocate space on our stack */