Trap work
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 8 Mar 2009 21:37:04 +0000 (14:37 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sun, 8 Mar 2009 21:37:04 +0000 (14:37 -0700)
Set all IDT entries to use interrupt gates for now, til IRQ and APIC
issues are sorted.  DF might need to be NOEC (is now, though the books
say it generates an EC).  Long range, DF might be a task gate (it is in
linux).

kern/trap.c
kern/trapentry.S

index 4dd4df2..b789e41 100644 (file)
@@ -32,7 +32,7 @@ static const char *NTS (IN_HANDLER trapname)(int trapno)
                "BOUND Range Exceeded",
                "Invalid Opcode",
                "Device Not Available",
-               "Double Falt",
+               "Double Fault",
                "Coprocessor Segment Overrun",
                "Invalid TSS",
                "Segment Not Present",
@@ -70,14 +70,14 @@ idt_init(void)
 
        // set all to default, to catch everything
        for(i = 0; i < 256; i++)
-               SETGATE(idt[i], 1, GD_KT, &ISR_default, 0);
+               SETGATE(idt[i], 0, GD_KT, &ISR_default, 0);
        
        // set all entries that have real trap handlers
        // we need to stop short of the last one, since the last is the default
        // handler with a fake interrupt number (500) that is out of bounds of
        // the idt[]
        for(i = 0; i < trap_tbl_size - 1; i++)
-               SETGATE(idt[trap_tbl[i].trapnumber], 1, GD_KT, trap_tbl[i].trapaddr, 0);
+               SETGATE(idt[trap_tbl[i].trapnumber], 0, GD_KT, trap_tbl[i].trapaddr, 0);
 
        // turn on syscall handling and other user-accessible ints
        // DPL 3 means this can be triggered by the int instruction
@@ -171,8 +171,10 @@ void
 {
        cprintf("Incoming TRAP frame at %p\n", tf);
 
-       if ((tf->tf_cs & ~3) != GD_UT && (tf->tf_cs & ~3) != GD_KT)
+       if ((tf->tf_cs & ~3) != GD_UT && (tf->tf_cs & ~3) != GD_KT) {
+               print_trapframe(tf);
                panic("Trapframe with invalid CS!");
+       }
 
        if ((tf->tf_cs & 3) == 3) {
                // Trapped from user mode.
index 4305c80..80c5f11 100644 (file)
@@ -59,7 +59,10 @@ 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);
+/* supposedly, DF generates an error code, but the one time we've had a DF so
+ * far, it didn't eventually, this should probably be handled with a task gate
+ */
+TRAPHANDLER_NOEC(ISR_double_fault, T_DBLFLT);
 /* 9 reserved */
 TRAPHANDLER(ISR_invalid_TSS, T_TSS);
 TRAPHANDLER(ISR_segment_not_present, T_SEGNP);