]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/trap.c
devip: cleanup rudp.c
[plan9front.git] / sys / src / 9 / pc / trap.c
index 071278d031a44bcdcc52adf562004b18f126a616..b76afaff2a1edd5002bcdc968dd24626e78548c0 100644 (file)
@@ -13,6 +13,7 @@ static int trapinited;
 
 void   noted(Ureg*, ulong);
 
+static void debugexc(Ureg*, void*);
 static void debugbpt(Ureg*, void*);
 static void fault386(Ureg*, void*);
 static void doublefault(Ureg*, void*);
@@ -39,13 +40,20 @@ intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name)
                        irq, tbdf, name);
                return;
        }
-
        if(tbdf != BUSUNKNOWN && (irq == 0xff || irq == 0)){
                print("intrenable: got unassigned irq %d, tbdf 0x%uX for %s\n",
                        irq, tbdf, name);
                irq = -1;
        }
 
+       /*
+        * IRQ2 doesn't really exist, it's used to gang the interrupt
+        * controllers together. A device set to IRQ2 will appear on
+        * the second interrupt controller as IRQ9.
+        */
+       if(irq == 2)
+               irq = 9;
+
        if((v = xalloc(sizeof(Vctl))) == nil)
                panic("intrenable: out of memory");
        v->isintr = 1;
@@ -82,6 +90,8 @@ intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name)
        Vctl **pv, *v;
        int vno;
 
+       if(irq == 2)
+               irq = 9;
        if(arch->intrvecno == nil || (tbdf != BUSUNKNOWN && (irq == 0xff || irq == 0))){
                /*
                 * on APIC machine, irq is pretty meaningless
@@ -222,6 +232,7 @@ trapinit(void)
         * Special traps.
         * Syscall() is called directly without going through trap().
         */
+       trapenable(VectorDE, debugexc, 0, "debugexc");
        trapenable(VectorBPT, debugbpt, 0, "debugpt");
        trapenable(VectorPF, fault386, 0, "fault386");
        trapenable(Vector2F, doublefault, 0, "doublefault");
@@ -400,8 +411,8 @@ trap(Ureg* ureg)
                if(0)print("cpu%d: spurious interrupt %d, last %d\n",
                        m->machno, vno, m->lastintr);
                if(0)if(conf.nmach > 1){
-                       for(i = 0; i < 32; i++){
-                               if(!(active.machs & (1<<i)))
+                       for(i = 0; i < MAXMACH; i++){
+                               if(active.machs[i] == 0)
                                        continue;
                                mach = MACHP(i);
                                if(m->machno == mach->machno)
@@ -626,6 +637,40 @@ dumpstack(void)
        callwithureg(_dumpstack);
 }
 
+static void
+debugexc(Ureg *ureg, void *)
+{
+       u32int dr6, m;
+       char buf[ERRMAX];
+       char *p, *e;
+       int i;
+
+       dr6 = getdr6();
+       if(up == nil)
+               panic("kernel debug exception dr6=%#.8ux", dr6);
+       putdr6(up->dr[6]);
+       if(userureg(ureg))
+               qlock(&up->debug);
+       else if(!canqlock(&up->debug))
+               return;
+       m = up->dr[7];
+       m = (m >> 4 | m >> 3) & 8 | (m >> 3 | m >> 2) & 4 | (m >> 2 | m >> 1) & 2 | (m >> 1 | m) & 1;
+       m &= dr6;
+       if(m == 0){
+               sprint(buf, "sys: debug exception dr6=%#.8ux", dr6);
+               postnote(up, 0, buf, NDebug);
+       }else{
+               p = buf;
+               e = buf + sizeof(buf);
+               p = seprint(p, e, "sys: watchpoint ");
+               for(i = 0; i < 4; i++)
+                       if((m & 1<<i) != 0)
+                               p = seprint(p, e, "%d%s", i, (m >> i + 1 != 0) ? "," : "");
+               postnote(up, 0, buf, NDebug);
+       }
+       qunlock(&up->debug);
+}
+
 static void
 debugbpt(Ureg* ureg, void*)
 {
@@ -818,7 +863,7 @@ notify(Ureg* ureg)
                return 0;
 
        if(up->fpstate == FPactive){
-               fpsave(&up->fpsave);
+               fpsave(up->fpsave);
                up->fpstate = FPinactive;
        }
        up->fpstate |= FPillegal;