Permissions on IDTs.
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 23 Feb 2009 00:26:51 +0000 (16:26 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 23 Feb 2009 00:26:51 +0000 (16:26 -0800)
See user/softint.c for more info.

kern/trap.c
user/softint.c

index ec7cd1b..b1707fa 100644 (file)
@@ -69,14 +69,18 @@ idt_init(void)
 
        // set all to default, to catch everything
        for(i = 0; i < 256; i++)
-               SETGATE(idt[i], 1, GD_KT, &ISR_default, 3);
+               SETGATE(idt[i], 1, 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, 3);
+               SETGATE(idt[trap_tbl[i].trapnumber], 1, GD_KT, trap_tbl[i].trapaddr, 0);
+
+       // turn on syscall handling.  
+       // DPL 3 means this can be triggered by the int instruction
+       idt[48].gd_dpl = 3;
 
        // Setup a TSS so that we get the right stack
        // when we trap to the kernel.
index ec2c8d8..f928824 100644 (file)
@@ -5,6 +5,12 @@
 void
 umain(void)
 {
-       asm volatile("int $14");        // page fault
+       // 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");
+
+       // 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);
 }