Fixed traphandlers; they were backwards.
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 23 Feb 2009 02:53:29 +0000 (18:53 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 23 Feb 2009 02:53:29 +0000 (18:53 -0800)
If you want to learn something, go back a commit, run the four fault*
userprograms, and debug the problem based on the output.  This patch
also changes softint to texas's intentions, since we now have the fault
programs.

kern/trap.c
kern/trapentry.S
user/softint.c

index a31f6cf..c4f8131 100644 (file)
@@ -134,6 +134,13 @@ trap_dispatch(struct Trapframe *tf)
        // Handle processor exceptions.
        // LAB 3: Your code here.
        
+       switch(tf->tf_trapno) {
+               case (T_PGFLT):
+                       page_fault_handler(tf);
+                       break;
+               default:
+                       break;
+       }
 
        // Unexpected trap: The user process or the kernel has a bug.
        print_trapframe(tf);
@@ -150,6 +157,9 @@ trap(struct Trapframe *tf)
 {
        cprintf("Incoming TRAP frame at %p\n", tf);
 
+       if ((tf->tf_cs & ~3) != GD_UT && (tf->tf_cs & ~3) != GD_KT)
+               panic("Trapframe with invalid CS!");
+
        if ((tf->tf_cs & 3) == 3) {
                // Trapped from user mode.
                // Copy trap frame (which is currently on the stack)
index 85abc62..4305c80 100644 (file)
@@ -51,27 +51,30 @@ trap_tbl:
 /*
  * Lab 3: Your code here for generating entry points for the different traps.
  */
-TRAPHANDLER(ISR_divide_error, T_DIVIDE);
-TRAPHANDLER(ISR_debug_exceptions, T_DEBUG);
-TRAPHANDLER(ISR_breakpoint, T_BRKPT);
-TRAPHANDLER(ISR_overflow, T_OFLOW);
-TRAPHANDLER(ISR_bounds_check, T_BOUND);
-TRAPHANDLER(ISR_invalid_opcode, T_ILLOP);
-TRAPHANDLER(ISR_device_not_available, T_DEVICE);
-TRAPHANDLER_NOEC(ISR_double_fault, T_DBLFLT);
-TRAPHANDLER_NOEC(ISR_invalid_TSS, T_TSS);
-TRAPHANDLER_NOEC(ISR_segment_not_present, T_SEGNP);
-TRAPHANDLER_NOEC(ISR_stack_exception, T_STACK);
-TRAPHANDLER_NOEC(ISR_general_protection_fault, T_GPFLT);
-TRAPHANDLER_NOEC(ISR_page_fault, T_PGFLT);
-TRAPHANDLER(ISR_floating_point_error, T_FPERR);
+TRAPHANDLER_NOEC(ISR_divide_error, T_DIVIDE);
+TRAPHANDLER_NOEC(ISR_debug_exceptions, T_DEBUG);
+/* NMI is int 2 */
+TRAPHANDLER_NOEC(ISR_breakpoint, T_BRKPT);
+TRAPHANDLER_NOEC(ISR_overflow, T_OFLOW);
+TRAPHANDLER_NOEC(ISR_bounds_check, T_BOUND);
+TRAPHANDLER_NOEC(ISR_invalid_opcode, T_ILLOP);
+TRAPHANDLER_NOEC(ISR_device_not_available, T_DEVICE);
+TRAPHANDLER(ISR_double_fault, T_DBLFLT);
+/* 9 reserved */
+TRAPHANDLER(ISR_invalid_TSS, T_TSS);
+TRAPHANDLER(ISR_segment_not_present, T_SEGNP);
+TRAPHANDLER(ISR_stack_exception, T_STACK);
+TRAPHANDLER(ISR_general_protection_fault, T_GPFLT);
+TRAPHANDLER(ISR_page_fault, T_PGFLT);
+/* 15 reserved */
+TRAPHANDLER_NOEC(ISR_floating_point_error, T_FPERR);
 TRAPHANDLER(ISR_alignment_check, T_ALIGN);
 TRAPHANDLER_NOEC(ISR_machine_check, T_MCHK);
 TRAPHANDLER_NOEC(ISR_simd_error, T_SIMDERR);
 
-TRAPHANDLER(ISR_syscall, T_SYSCALL);
-/* make sure default is last */
-TRAPHANDLER(ISR_default, T_DEFAULT);
+TRAPHANDLER_NOEC(ISR_syscall, T_SYSCALL);
+/* Make sure default is last!! */
+TRAPHANDLER_NOEC(ISR_default, T_DEFAULT);
 
 .data
 .globl trap_tbl_end;
index f928824..addd8bf 100644 (file)
@@ -7,10 +7,10 @@ umain(void)
 {
        // this is a fake page fault.  it can only be used if the DPL is 3
        // if the DPL = 0, this causes a general prot fault, not a PF
-       //asm volatile("int $14");
+       asm volatile("int $14");
 
        // this is a real page fault.  volatile, so the compiler doesn't remove it
        // this will cause a PF regardless of DPL, since it's a real PF.
-       volatile int x = *((int*)0xc0000000);
+       //volatile int x = *((int*)0xc0000000);
 }