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: