--- trunk/reactos/ntoskrnl/ke/i386/syscall.S 2006-01-16 21:12:13 UTC (rev 20920)
+++ trunk/reactos/ntoskrnl/ke/i386/syscall.S 2006-01-16 21:14:32 UTC (rev 20921)
@@ -5,13 +5,9 @@
* PROGRAMMER: Alex Ionescu (alex@relsoft.net)
*/
-#include <roscfg.h>
-#include <internal/i386/ke.h>
-#include <ndk/asm.h>
+#include <asm.h>
+#include <internal/i386/asmmacro.S>
-#define UserMode (1)
-#define STATUS_INVALID_SYSTEM_SERVICE 0xC000001C
-
.globl _KiServiceExit
.globl _KiServiceExit2
.globl _KiFastCallEntry
@@ -20,14 +16,18 @@
.intel_syntax noprefix
/*
- * NOTE: I will create some macros for trap entry and exit,
- * DR* register restoration, modified frame exit, etc, if GAS
- * allows it/I find a way how. This would remove a lot of
- * duplicated code in this file plus the other irq/trap asm files.
- * I think this is similar to what NT does, if you look at teh
- * Dr_kit*_a functions which look auto-generated.
+ * There are 3 main types of Trap Entries:
+ *
+ * - System Calls
+ * - TODO
+ *
+ * - Exceptions
+ * - TODO
+ *
+ * - Interrupts
+ * - TODO
*/
-
+
/*
* There are 3 main types of Trap Exits:
*
@@ -78,10 +78,6 @@
* - Use macros and merge with trap.s nicely
*/
-/*
- * Entries will be discussed later.
- */
-
/*** This file is a mess; it is being worked on. Please contact Alex:
*** alex@relsoft.net if you want to make any changes to it before this
*** message goes away
@@ -132,7 +128,7 @@
push 2 /* Ring 0 EFLAGS */
add edx, 8 /* Skip user parameter list */
popf /* Set our EFLAGS */
- or dword ptr [esp], X86_EFLAGS_IF /* Re-enable IRQs in EFLAGS, to fake INT */
+ or dword ptr [esp], EFLAGS_INTERRUPT_MASK /* Re-enable IRQs in EFLAGS, to fake INT */
push KGDT_R3_CODE + RPL_MASK
push KUSER_SHARED_SYSCALL_RET
@@ -386,7 +382,7 @@
// ================= COMMON USER-MODE APC DELIVERY CHECK ============//
/* Check for V86 mode */
- test dword ptr [ebp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
+ test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
jnz ApcLoop
/* Deliver APCs only if we were called from user mode */
@@ -454,7 +450,7 @@
// ==================== END IF PREVIOUS MODE NEEDED ===================//
/* Check for V86 */
- test dword ptr [esp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
+ test dword ptr [esp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
jnz V86_Exit
/* Check if the frame was edited */
@@ -467,6 +463,8 @@
bt word ptr [esp+KTRAP_FRAME_CS], 0
cmc
ja RestoreAll
+ cmp dword ptr [ebp+KTRAP_FRAME_CS], KGDT_R0_CODE
+ jz CommonStackClean
// ==================== END IF FULL RESTORE NEEDED ====================//
//badbadbad
@@ -518,7 +516,7 @@
/* Is SYSEXIT Supported/Wanted? */
cmp dword ptr ss:[_KiFastSystemCallDisable], 0
jnz IntRet
- test dword ptr [esp+8], X86_EFLAGS_TF
+ test dword ptr [esp+8], EFLAGS_TF
jnz IntRet
/* Restore FS to TIB */
@@ -528,7 +526,7 @@
/* We will be cleaning up the stack ourselves */
pop edx /* New Ring 3 EIP */
add esp, 4 /* Skip Ring 3 DS */
-/* and dword ptr [esp], ~X86_EFLAGS_IF Line below is equivalent to this,
+/* and dword ptr [esp], ~EFLAGS_INTERRUPT_MASK Line below is equivalent to this,
but older binutils versions don't understand ~ */
and dword ptr [esp], 0xfffffdff /* Remove IRQ hack from EFLAGS */
popf /* Restore old EFLAGS */
@@ -647,7 +645,7 @@
cli
/* Check for V86 mode */
- test dword ptr [ebp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
+ test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
jnz ApcLoop2
/* Deliver APCs only if we were called from user mode */
@@ -700,7 +698,7 @@
mov byte ptr [esi+KTHREAD_PREVIOUS_MODE], cl
/* Check for V86 */
- test dword ptr [esp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
+ test dword ptr [esp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
jnz V86_Exit
/* Check if the frame was edited */
@@ -779,66 +777,12 @@
_KiDebugService:
- /* Create the Trap Frame */
+ /* Push error code */
push 0
- push ebp
- push ebx
- push esi
- push edi
- push fs
- /* Switch to correct FS */
- mov bx, KGDT_R0_PCR
- mov fs, bx
+ /* Enter trap */
+ TRAP_PROLOG(kids)
- /* Save Exception List */
- push fs:[KPCR_EXCEPTION_LIST]
-
- /* Traps don't need the previous mode */
- sub esp, 4
-
- /* Continue building the Trap Frame */
- push eax
- push ecx
- push edx
- push ds
- push es
- push gs
- sub esp, 0x30
-
- /* Switch Segments to Kernel */
- mov ax, KGDT_R0_DATA
- 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], X86_EFLAGS_VM
- //jnz V86_kids
-
- /* 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_kids
-
- /* 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
-
/* Increase EIP so we skip the INT3 */
//inc dword ptr [ebp+KTRAP_FRAME_EIP]
@@ -848,7 +792,7 @@
mov edx, [ebp+KTRAP_FRAME_EAX]
/* Check for V86 mode */
- test dword ptr [ebp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
+ test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
jnz NotUserMode
/* Check if this is kernel or user-mode */
@@ -892,7 +836,7 @@
cli
/* Check for V86 mode */
- test dword ptr [ebp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
+ test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
jnz ApcLoop3
/* Deliver APCs only if we were called from user mode */
@@ -940,7 +884,7 @@
mov [fs:KPCR_EXCEPTION_LIST], edx
/* Check for V86 */
- test dword ptr [esp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
+ test dword ptr [esp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
jnz V86_Exit
/* Check if the frame was edited */
--- trunk/reactos/ntoskrnl/ke/i386/trap.s 2006-01-16 21:12:13 UTC (rev 20920)
+++ trunk/reactos/ntoskrnl/ke/i386/trap.s 2006-01-16 21:14:32 UTC (rev 20921)
@@ -3,288 +3,432 @@
* FILE: ntoskrnl/ke/i386/trap.s
* PURPOSE: Exception handlers
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
- * David Welch <welch@cwcom.net>
*/
/* INCLUDES ******************************************************************/
-#include <ndk/asm.h>
+#include <asm.h>
+#include <internal/i386/asmmacro.S>
/* NOTES:
- * The prologue is currently a duplication of the trap enter code in KiDebugService.
- * It will be made a macro and shared later.
+ * Why not share the epilogue?
+ * 1) An extra jmp is expensive (jmps are very costly)
+ * 2) Eventually V86 exit should be handled through ABIOS, and we
+ * handle ABIOS exit in the shared trap exit code already.
+ * Why not share the KiTrapHandler call?
+ * 1) Would make using the trap-prolog macro much harder.
+ * 2) Eventually some of these traps might be re-implemented in assembly
+ * to improve speed and depend less on the compiler and/or use features
+ * not present as C keywords. When that happens, less traps will use the
+ * shared C handler, so the shared-code would need to be un-shared.
*/
/* FUNCTIONS *****************************************************************/
-/*
- * Epilog for exception handlers
- */
-_KiTrapEpilog:
- cmpl $1, %eax /* Check for v86 recovery */
- jne Kei386EoiHelper@0
- jmp _KiV86Complete
+.globl _KiTrap0
+_KiTrap0:
+ /* Push error code */
+ push 0
-.globl _KiTrapProlog
-_KiTrapProlog:
- movl $_KiTrapHandler, %ebx
-
-.global _KiTrapProlog2
-_KiTrapProlog2:
- pushl %edi
- pushl %fs
+ /* Enter trap */
+ TRAP_PROLOG(0)
-.intel_syntax noprefix
- /* Load the PCR selector into fs */
- mov edi, KGDT_R0_PCR
- mov fs, di
+ /* Call the C exception handler */
+ push 0
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
- /* Push exception list and previous mode (invalid) */
- push fs:[KPCR_EXCEPTION_LIST]
- push -1
+ /* Check for v86 recovery */
+ cmp eax, 1
- /* Push volatiles and segments */
- push eax
- push ecx
- push edx
- push ds
- push es
- push gs
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
- /* Set the R3 data segment */
- mov ax, KGDT_R3_DATA + RPL_MASK
+.globl _KiTrap1
+_KiTrap1:
+ /* Push error code */
+ push 0
- /* Skip debug registers and debug stuff */
- sub esp, 0x30
+ /* Enter trap */
+ TRAP_PROLOG(1)
- /* Load the segment registers */
- mov ds, ax
- mov es, ax
+ /* Call the C exception handler */
+ push 1
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
- /* Set up frame */
- mov ebp, esp
+ /* Check for v86 recovery */
+ cmp eax, 1
- /* Check if this was from V86 Mode */
- test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
- //jnz V86_kids
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
- /* Get current thread */
- mov ecx, [fs:KPCR_CURRENT_THREAD]
- cld
+.globl _KiTrap2
+_KiTrap2:
+ /* Push error code */
+ push 0
- /* Flush DR7 */
- and dword ptr [ebp+KTRAP_FRAME_DR7], 0
+ /* Enter trap */
+ TRAP_PROLOG(2)
- /* Check if the thread was being debugged */
- //test byte ptr [ecx+KTHREAD_DEBUG_ACTIVE], 0xFF
- //jnz Dr_kids
+ /* Call the C exception handler */
+ push 2
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
- /* Get the Debug Trap Frame EBP/EIP */
- mov ecx, [ebp+KTRAP_FRAME_EBP]
- mov edi, [ebp+KTRAP_FRAME_EIP]
+ /* Check for v86 recovery */
+ cmp eax, 1
- /* Write the debug data */
- mov [ebp+KTRAP_FRAME_DEBUGPOINTER], edx
- mov dword ptr [ebp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
- mov [ebp+KTRAP_FRAME_DEBUGEBP], ecx
- mov [ebp+KTRAP_FRAME_DEBUGEIP], edi
-.att_syntax
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
-.L6:
-
- /* Call the C exception handler */
- pushl %esi
- pushl %ebp
- call *%ebx
- addl $8, %esp
+.globl _KiTrap3
+_KiTrap3:
+ /* Push error code */
+ push 0
- /* Return to the caller */
- jmp _KiTrapEpilog
+ /* Enter trap */
+ TRAP_PROLOG(3)
-.globl _KiTrap0
-_KiTrap0:
- /* No error code */
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $0, %esi
- jmp _KiTrapProlog
-
-.globl _KiTrap1
-_KiTrap1:
- /* No error code */
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $1, %esi
- jmp _KiTrapProlog
-
-.globl _KiTrap2
-_KiTrap2:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $2, %esi
- jmp _KiTrapProlog
+ /* Call the C exception handler */
+ push 3
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
-.globl _KiTrap3
-_KiTrap3:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $3, %esi
- jmp _KiTrapProlog
+ /* Check for v86 recovery */
+ cmp eax, 1
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap4
_KiTrap4:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $4, %esi
- jmp _KiTrapProlog
+ /* Push error code */
+ push 0
+ /* Enter trap */
+ TRAP_PROLOG(4)
+
+ /* Call the C exception handler */
+ push 4
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap5
_KiTrap5:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $5, %esi
- jmp _KiTrapProlog
+ /* Push error code */
+ push 0
+ /* Enter trap */
+ TRAP_PROLOG(5)
+
+ /* Call the C exception handler */
+ push 5
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap6
_KiTrap6:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $6, %esi
- jmp _KiTrapProlog
+ /* Push error code */
+ push 0
+ /* Enter trap */
+ TRAP_PROLOG(6)
+
+ /* Call the C exception handler */
+ push 6
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap7
_KiTrap7:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $7, %esi
- jmp _KiTrapProlog
+ /* Push error code */
+ push 0
+ /* Enter trap */
+ TRAP_PROLOG(7)
+
+ /* Call the C exception handler */
+ push 7
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap8
_KiTrap8:
- call _KiDoubleFaultHandler
- iret
+ call _KiDoubleFaultHandler
+ iret
.globl _KiTrap9
_KiTrap9:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $9, %esi
- jmp _KiTrapProlog
+ /* Push error code */
+ push 0
+ /* Enter trap */
+ TRAP_PROLOG(9)
+
+ /* Call the C exception handler */
+ push 9
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap10
_KiTrap10:
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $10, %esi
- jmp _KiTrapProlog
+ /* Enter trap */
+ TRAP_PROLOG(10)
+ /* Call the C exception handler */
+ push 10
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap11
_KiTrap11:
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $11, %esi
- jmp _KiTrapProlog
+ /* Enter trap */
+ TRAP_PROLOG(11)
+ /* Call the C exception handler */
+ push 11
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap12
_KiTrap12:
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $12, %esi
- jmp _KiTrapProlog
+ /* Enter trap */
+ TRAP_PROLOG(12)
+ /* Call the C exception handler */
+ push 12
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap13
_KiTrap13:
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $13, %esi
- jmp _KiTrapProlog
+ /* Enter trap */
+ TRAP_PROLOG(13)
+ /* Call the C exception handler */
+ push 13
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap14
_KiTrap14:
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $14, %esi
- movl $_KiPageFaultHandler, %ebx
- jmp _KiTrapProlog2
+ /* Enter trap */
+ TRAP_PROLOG(14)
+ /* Call the C exception handler */
+ push 14
+ push ebp
+ call _KiPageFaultHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap15
_KiTrap15:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $15, %esi
- jmp _KiTrapProlog
+ /* Push error code */
+ push 0
+ /* Enter trap */
+ TRAP_PROLOG(15)
+
+ /* Call the C exception handler */
+ push 15
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap16
_KiTrap16:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $16, %esi
- jmp _KiTrapProlog
-
+ /* Push error code */
+ push 0
+
+ /* Enter trap */
+ TRAP_PROLOG(16)
+
+ /* Call the C exception handler */
+ push 16
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap17
_KiTrap17:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $17, %esi
- jmp _KiTrapProlog
+ /* Push error code */
+ push 0
+ /* Enter trap */
+ TRAP_PROLOG(17)
+
+ /* Call the C exception handler */
+ push 17
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap18
_KiTrap18:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $18, %esi
- jmp _KiTrapProlog
+ /* Push error code */
+ push 0
+ /* Enter trap */
+ TRAP_PROLOG(18)
+
+ /* Call the C exception handler */
+ push 18
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrap19
_KiTrap19:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $19, %esi
- jmp _KiTrapProlog
+ /* Push error code */
+ push 0
+ /* Enter trap */
+ TRAP_PROLOG(19)
+
+ /* Call the C exception handler */
+ push 19
+ push ebp
+ call _KiTrapHandler
+ add esp, 8
+
+ /* Check for v86 recovery */
+ cmp eax, 1
+
+ /* Return to caller */
+ jne Kei386EoiHelper@0
+ jmp _KiV86Complete
+
.globl _KiTrapUnknown
_KiTrapUnknown:
- pushl $0
- pushl %ebp
- pushl %ebx
- pushl %esi
- movl $255, %esi
- jmp _KiTrapProlog
+ /* Push error code */
[truncated at 1000 lines; 16 more skipped]