Changed the trap prolog, each exception can have its own trap handler.
Modified: trunk/reactos/ntoskrnl/ke/i386/trap.s
_____
Modified: trunk/reactos/ntoskrnl/ke/i386/trap.s
--- trunk/reactos/ntoskrnl/ke/i386/trap.s 2005-05-08 16:02:38 UTC
(rev 15131)
+++ trunk/reactos/ntoskrnl/ke/i386/trap.s 2005-05-08 16:07:43 UTC
(rev 15132)
@@ -66,8 +66,10 @@
/* Restore the old previous mode */
popl %ebx
+ cmpl $0, %esi
+ je .L7
movb %bl, %ss:KTHREAD_PREVIOUS_MODE(%esi)
-
+.L7:
/* Restore the old exception handler list */
popl %ebx
movl %ebx, %fs:KPCR_EXCEPTION_LIST
@@ -83,48 +85,16 @@
.globl _KiTrapProlog
_KiTrapProlog:
-
+ movl $_KiTrapHandler, %ebx
+
+.global _KiTrapProlog2
+_KiTrapProlog2:
pushl %edi
pushl %fs
- /*
- * Check that the PCR exists, very early in the boot process it
may
- * not
- */
- cmpl $0, %ss:_KiPcrInitDone
- je .L5
-
- /* Load the PCR selector into fs */
- movl $PCR_SELECTOR, %ebx
- movl %ebx, %fs
+ /* Make room for the previous mode and the exception list */
+ subl $8, %esp
- /* Save the old exception list */
- movl %fs:KPCR_EXCEPTION_LIST, %ebx
- pushl %ebx
-
- /* Get a pointer to the current thread */
- movl %fs:KPCR_CURRENT_THREAD, %edi
-
- /* The current thread may be NULL early in the boot process */
- cmpl $0, %edi
- je .L4
-
- /* Save the old previous mode */
- movl $0, %ebx
- movb %ss:KTHREAD_PREVIOUS_MODE(%edi), %bl
- pushl %ebx
-
- /* Set the new previous mode based on the saved CS selector */
- movl 0x24(%esp), %ebx
- andl $0x0000FFFF, %ebx
- cmpl $KERNEL_CS, %ebx
- jne .L1
- movb $KernelMode, %ss:KTHREAD_PREVIOUS_MODE(%edi)
- jmp .L3
-.L1:
- movb $UserMode, %ss:KTHREAD_PREVIOUS_MODE(%edi)
-.L3:
-
/* Save other registers */
pushl %eax
pushl %ecx
@@ -147,70 +117,88 @@
pushl %eax /* Dr1 */
movl %dr0, %eax
pushl %eax /* Dr0 */
- leal 0x64(%esp), %eax
- pushl %eax /* XXX: TempESP */
- pushl %ss /* XXX: TempSS */
- pushl $0 /* XXX: DebugPointer */
- pushl $0 /* XXX: DebugArgMark */
- movl 0x60(%esp), %ebx
- pushl %ebx /* XXX: DebugEIP */
- pushl %ebp /* XXX: DebugEBP */
-
+ leal 0x64(%esp), %eax
+ pushl %eax /* XXX: TempESP */
+ pushl %ss /* XXX: TempSS */
+ pushl $0 /* XXX: DebugPointer */
+ pushl $0 /* XXX: DebugArgMark */
+ movl 0x60(%esp), %eax
+ pushl %eax /* XXX: DebugEIP */
+ pushl %ebp /* XXX: DebugEBP */
+
/* Load the segment registers */
- movl $KERNEL_DS, %ebx
- movl %ebx, %ds
- movl %ebx, %es
- movl %ebx, %gs
+ movl $KERNEL_DS, %eax
+ movl %eax, %ds
+ movl %eax, %es
+ movl %eax, %gs
- /* Set ES to kernel segment */
- movw $KERNEL_DS,%bx
- movw %bx,%es
-
- movl %esp, %ebx
+ /* save the trap frame */
movl %esp, %ebp
+
+ /* Load the PCR selector into fs */
+ movl $PCR_SELECTOR, %eax
+ movl %eax, %fs
- /* Save the old trap frame. */
+ /* Save the old exception list */
+ movl %fs:KPCR_EXCEPTION_LIST, %eax
+ movl %eax, KTRAP_FRAME_EXCEPTION_LIST(%ebp)
+
+ /* Get a pointer to the current thread */
+ movl %fs:KPCR_CURRENT_THREAD, %edi
+
+ /* The current thread may be NULL early in the boot process */
cmpl $0, %edi
- je .L7
- movl %ss:KTHREAD_TRAP_FRAME(%edi), %edx
- pushl %edx
- jmp .L8
-.L7:
- pushl $0
-.L8:
+ je .L4
+
+ /* Save the old previous mode */
+ movl $0, %eax
+ movb KTHREAD_PREVIOUS_MODE(%edi), %al
+ movl %eax, KTRAP_FRAME_PREVIOUS_MODE(%ebp)
+
+ /* Set the new previous mode based on the saved CS selector */
+ movl KTRAP_FRAME_CS(%ebp), %eax
+ andl $0x0000FFFF, %eax
+ cmpl $KERNEL_CS, %eax
+ jne .L1
+ movb $KernelMode, KTHREAD_PREVIOUS_MODE(%edi)
+ jmp .L3
+.L1:
+ movb $UserMode, KTHREAD_PREVIOUS_MODE(%edi)
+.L3:
+ /* Save the old trap frame. */
+ movl KTHREAD_TRAP_FRAME(%edi), %edx
+ pushl %edx
+
/* Save a pointer to the trap frame in the current KTHREAD */
- cmpl $0, %edi
- je .L6
- movl %ebx, %ss:KTHREAD_TRAP_FRAME(%edi)
+ movl %ebp, KTHREAD_TRAP_FRAME(%edi)
.L6:
/* Call the C exception handler */
pushl %esi
- pushl %ebx
- call _KiTrapHandler
- addl $4, %esp
- addl $4, %esp
+ pushl %ebp
+ call *%ebx
+ addl $8, %esp
/* Get a pointer to the current thread */
movl %fs:KPCR_CURRENT_THREAD, %esi
-
+
/* Restore the old trap frame pointer */
popl %ebx
+ cmpl $0, %esi
+ je _KiTrapEpilog
movl %ebx, KTHREAD_TRAP_FRAME(%esi)
-
+
/* Return to the caller */
jmp _KiTrapEpilog
- /* Handle the no-pcr case out of line */
-.L5:
- pushl $0
-
/* Handle the no-thread case out of line */
.L4:
- pushl $0
- jmp .L3
-
+ movl $0, %eax /* previous mode */
+ movl %eax, KTRAP_FRAME_PREVIOUS_MODE(%ebp)
+ pushl %eax /* old trap frame */
+ jmp .L6
+
.globl _KiTrap0
_KiTrap0:
/* No error code */
@@ -337,7 +325,8 @@
pushl %ebx
pushl %esi
movl $14, %esi
- jmp _KiTrapProlog
+ movl $_KiTrapHandler, %ebx
+ jmp _KiTrapProlog2
.globl _KiTrap15
_KiTrap15: