## diffname pc/trap.c 1991/0613 ## diff -e /dev/null /n/bootesdump/1991/0613/sys/src/9/safari/trap.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" void ediv(void); void edebug(void); void enmi(void); void ebp(void); void eover(void); void ebound(void); void ebadop(void); void enoco(void); void edfault(void); void enoway(void); void etss(void); void enoseg(void); void estack(void); void eprot(void); void efault(void); /* * exception types */ enum { Ediv= 0, /* divide error */ Edebug= 1, /* debug exceptions */ Enmi= 2, /* non-maskable interrupt */ Ebp= 3, /* INT 3 */ Eover= 4, /* overflow */ Ebound= 5, /* bounds check */ Ebadop= 6, /* invalid opcode */ Enoco= 7, /* coprocessor not available */ Edfault=8, /* double fault */ Etss= 10, /* invalid tss */ Enoseg= 11, /* segment not present */ Estack= 12, /* stack exception */ Eprot= 13, /* general protection */ Efault= 14, /* page fault */ Eco= 16, /* coprocessor error */ }; /* * exception/trap gates */ Segdesc ilt[256] = { [Ediv] TRAPGATE(KESEL, ediv, 3), [Edebug] TRAPGATE(KESEL, edebug, 3), [Enmi] INTRGATE(KESEL, enmi, 3), [Ebp] TRAPGATE(KESEL, ebp, 3), [Eover] TRAPGATE(KESEL, eover, 3), [Ebound] TRAPGATE(KESEL, ebound, 3), [Ebadop] TRAPGATE(KESEL, ebadop, 3), [Enoco] TRAPGATE(KESEL, enoco, 3), [Edfault] TRAPGATE(KESEL, edfault, 3), [Etss] TRAPGATE(KESEL, etss, 3), [Enoseg] TRAPGATE(KESEL, enoseg, 3), [Estack] TRAPGATE(KESEL, estack, 3), [Eprot] TRAPGATE(KESEL, eprot, 3), [Efault] TRAPGATE(KESEL, efault, 3), [Eco] TRAPGATE(KESEL, eco, 3), }; . ## diffname pc/trap.c 1991/0614 ## diff -e /n/bootesdump/1991/0613/sys/src/9/safari/trap.c /n/bootesdump/1991/0614/sys/src/9/safari/trap.c 65a /* * trap table */ uchar traptab[4096]; /* * set up some basic vectored interrupts */ trapinit( /* * j-random uncaught trap or interrupt */ void trap(void) { panic("unknown trap"); } . 46c * trap/interrupt gates . ## diffname pc/trap.c 1991/0625 ## diff -e /n/bootesdump/1991/0614/sys/src/9/safari/trap.c /n/bootesdump/1991/0625/sys/src/9/safari/trap.c 73,77d ## diffname pc/trap.c 1991/0703 ## diff -e /n/bootesdump/1991/0625/sys/src/9/safari/trap.c /n/bootesdump/1991/0703/sys/src/9/safari/trap.c 78c print("trap %lux\n", ur->trap); print(" edi %lux\n", ur->edi); print(" esi %lux\n", ur->esi); print(" ebp %lux\n", ur->ebp); print(" esp %lux\n", ur->esp); print(" ebx %lux\n", ur->ebx); print(" edx %lux\n", ur->edx); print(" ecx %lux\n", ur->ecx); print(" eax %lux\n", ur->eax); print(" ds %lux\n", ur->ds); print(" trap %lux\n", ur->trap); print(" ecode %lux\n", ur->ecode); print(" eip %lux\n", ur->eip); print(" cs %lux\n", ur->cs); print(" eflags %lux\n", ur->eflags); print(" oesp %lux\n", ur->oesp); print(" ss %lux\n", ur->ss); delay(500); if(ur->trap>=256 || ivec[ur->trap] == 0) panic("bad trap type %d\n", ur->trap); (*ivec[ur->trap])(ur); . 75,76c trap(Ureg *ur) . 73c * All traps . 71a /* * set the standard traps */ sethvec(0, intr0, SEGTG); sethvec(1, intr1, SEGTG); sethvec(2, intr2, SEGTG); sethvec(3, intr3, SEGTG); sethvec(4, intr4, SEGTG); sethvec(5, intr5, SEGTG); sethvec(6, intr6, SEGTG); sethvec(7, intr7, SEGTG); sethvec(8, intr8, SEGTG); sethvec(9, intr9, SEGTG); sethvec(10, intr10, SEGTG); sethvec(11, intr11, SEGTG); sethvec(12, intr12, SEGTG); sethvec(13, intr13, SEGTG); sethvec(14, intr14, SEGTG); sethvec(15, intr15, SEGTG); sethvec(16, intr16, SEGTG); /* * set all others to unknown */ for(i = 17; i < 256; i++) sethvec(i, intrbad, SEGIG); /* * tell the hardware where the table is (and how long) */ lidt(ilt, sizeof(ilt)); } . 70c void trapinit(void) { int i; . 68c * set up the interrupt/trap gates . 66a void setvec(int v, void (*r)(void*), int type) { ilt[v].d1 &= ~SEGTYPE; ilt[v].d1 |= type; ivec[v] = r; } . 50,65c ilt[v].d0 = ((ulong)r)&0xFFFF|(KESEL<<16); ilt[v].d1 = ((ulong)r)&0xFFFF0000|SEGP|SEGPL(3)|type; } . 48c Segdesc ilt[256]; void (*ivec[256])(void*); void sethvec(int v, void (*r)(void), int type) . 25,45d 8,23d 6a #include "ureg.h" . ## diffname pc/trap.c 1991/0704 ## diff -e /n/bootesdump/1991/0703/sys/src/9/safari/trap.c /n/bootesdump/1991/0704/sys/src/9/safari/trap.c 68a /* * Set up the 8259 interrupt processor #1. * Make 8259 interrupts starting at vector I8259vec. * * N.B. This is all magic to me. It comes from the * IBM technical reference manual. I just * changed the vector. */ outb(I8259ctl, 0x11); /* ICW1 - edge, master, ICW4 */ outb(I8259aux, I8259vec); /* ICW2 - interrupt vector */ outb(I8259aux, 0x04); /* ICW3 - master level 2 */ outb(I8259aux, 0x01); /* ICW4 - master, 8086 mode */ outb(I8259aux, 0x00); /* mask - all enabled */ . ## diffname pc/trap.c 1991/0705 ## diff -e /n/bootesdump/1991/0704/sys/src/9/safari/trap.c /n/bootesdump/1991/0705/sys/src/9/safari/trap.c 78,82c outb(Int0ctl, 0x11); /* ICW1 - edge, master, ICW4 */ outb(Int0aux, Int0vec); /* ICW2 - interrupt vector */ outb(Int0aux, 0x04); /* ICW3 - master level 2 */ outb(Int0aux, 0x01); /* ICW4 - master, 8086 mode */ outb(Int0aux, 0x00); /* mask - all enabled */ . ## diffname pc/trap.c 1991/0706 ## diff -e /n/bootesdump/1991/0705/sys/src/9/safari/trap.c /n/bootesdump/1991/0706/sys/src/9/safari/trap.c 112a INT0ENABLE; . 91,108d 62c for(i = 24; i < 256; i++) . 57a sethvec(17, intr17, SEGTG); sethvec(18, intr18, SEGTG); sethvec(19, intr19, SEGTG); sethvec(20, intr20, SEGTG); sethvec(21, intr21, SEGTG); sethvec(22, intr22, SEGTG); sethvec(23, intr23, SEGTG); . 23c setvec(int v, void (*r)(Ureg*), int type) . ## diffname pc/trap.c 1991/0709 ## diff -e /n/bootesdump/1991/0706/sys/src/9/safari/trap.c /n/bootesdump/1991/0709/sys/src/9/safari/trap.c 102c /* * tell the 8259 that we're done with the * highest level interrupt */ outb(Int0ctl, EOI); . 100a /* * call the trap routine */ . 92d 88,89c outb(Int0aux, 0x01); /* ICW4 - 8086 mode, not buffered */ . 85,86c outb(Int0ctl, 0x11); /* ICW1 - edge triggered, master, ICW4 will be sent */ outb(Int0aux, Int0vec); /* ICW2 - interrupt vector offset */ . 78,83c * Set up the first 8259 interrupt processor. * Make 8259 interrupts start at CPU vector Int0vec. * Set the 8259 as master with edge triggered * input with fully nested interrupts. . 27a /* * enable corresponding interrupt in 8259 */ if((v&~0x7) == Int0vec){ int0mask &= ~(1<<(v&7)); outb(Int0aux, int0mask); } . 9a * 8259 interrupt controllers */ enum { Int0ctl= 0x20, /* control port (ICW1, OCW2, OCW3) */ Int0aux= 0x21, /* everything else (ICW2, ICW3, ICW4, OCW1) */ Int1ctl= 0xA0, /* control port */ Int1aux= 0xA1, /* everything else (ICW2, ICW3, ICW4, OCW1) */ EOI= 0x20, /* non-specific end of interrupt */ }; int int0mask = 7; /* interrupts enabled for first 8259 */ int int1mask = 7; /* interrupts enabled for second 8259 */ /* . ## diffname pc/trap.c 1991/0710 ## diff -e /n/bootesdump/1991/0709/sys/src/9/safari/trap.c /n/bootesdump/1991/0710/sys/src/9/safari/trap.c 131a } /* * system calls */ long syscall(Ureg *ur) { panic("syscall"); } #include "errstr.h" void error(int code) { strncpy(u->error, errstrtab[code], ERRLEN); nexterror(); } void errors(char *err) { strncpy(u->error, err, ERRLEN); nexterror(); } void nexterror(void) { gotolabel(&u->errlab[--u->nerrlab]); . 116a void . 96a * system calls */ sethvec(64, intr64, SEGTG, 3); /* setvec(64, syscall, SEGTG); /**/ /* . 94c sethvec(i, intrbad, SEGIG, 0); . 65,88c sethvec(0, intr0, SEGTG, 0); sethvec(1, intr1, SEGTG, 0); sethvec(2, intr2, SEGTG, 0); sethvec(3, intr3, SEGTG, 0); sethvec(4, intr4, SEGTG, 0); sethvec(5, intr5, SEGTG, 0); sethvec(6, intr6, SEGTG, 0); sethvec(7, intr7, SEGTG, 0); sethvec(8, intr8, SEGTG, 0); sethvec(9, intr9, SEGTG, 0); sethvec(10, intr10, SEGTG, 0); sethvec(11, intr11, SEGTG, 0); sethvec(12, intr12, SEGTG, 0); sethvec(13, intr13, SEGTG, 0); sethvec(14, intr14, SEGTG, 0); sethvec(15, intr15, SEGTG, 0); sethvec(16, intr16, SEGTG, 0); sethvec(17, intr17, SEGTG, 0); sethvec(18, intr18, SEGTG, 0); sethvec(19, intr19, SEGTG, 0); sethvec(20, intr20, SEGTG, 0); sethvec(21, intr21, SEGTG, 0); sethvec(22, intr22, SEGTG, 0); sethvec(23, intr23, SEGTG, 0); . 35c ilt[v].d1 = ((ulong)r)&0xFFFF0000|SEGP|SEGPL(pri)|type; . 32c sethvec(int v, void (*r)(void), int type, int pri) . ## diffname pc/trap.c 1991/0711 ## diff -e /n/bootesdump/1991/0710/sys/src/9/safari/trap.c /n/bootesdump/1991/0711/sys/src/9/safari/trap.c 162,170c ((Ureg*)UREGADDR)->pc = entry; . 160c execpc(ulong entry) . 155,156d 153c dumpstack(void) . 150,151d 127c panic("bad trap type %d %lux\n", ur->trap, ur->pc); . ## diffname pc/trap.c 1991/0716 ## diff -e /n/bootesdump/1991/0711/sys/src/9/safari/trap.c /n/bootesdump/1991/0716/sys/src/9/safari/trap.c 100c setvec(64, (void (*)(Ureg*))syscall); . 41,42d 39c setvec(int v, void (*r)(Ureg*)) . ## diffname pc/trap.c 1991/0718 ## diff -e /n/bootesdump/1991/0716/sys/src/9/safari/trap.c /n/bootesdump/1991/0718/sys/src/9/safari/trap.c 144a u->p->insyscall = 1; u->p->pc = ur->pc; . 139a * dump registers */ void dumpregs(Ureg *ur) { if(u) print("registers for %s %d\n", u->p->text, u->p->pid); else print("registers for kernel\n"); print("FLAGS=%lux ECODE=%lux CS=%lux PC=%lux SS=%lux USP=%lux\n", ur->flags, ur->ecode, ur->cs, ur->pc, ur->ss, ur->usp); print(" AX %8.8lux BX %8.8lux CX %8.8lux DX %8.8lux\n", ur->ax, ur->bx, ur->cx, ur->dx); print(" SI %8.8lux DI %8.8lux BP %8.8lux DS %8.8lux\n", ur->si, ur->di, ur->bp, ur->ds); } /* . 103c putidt(ilt, sizeof(ilt)); . 89c * set all others to unknown interrupts . ## diffname pc/trap.c 1991/0719 ## diff -e /n/bootesdump/1991/0718/sys/src/9/safari/trap.c /n/bootesdump/1991/0719/sys/src/9/safari/trap.c 63,86c sethvec(0, intr0, SEGIG, 0); sethvec(1, intr1, SEGIG, 0); sethvec(2, intr2, SEGIG, 0); sethvec(3, intr3, SEGIG, 0); sethvec(4, intr4, SEGIG, 0); sethvec(5, intr5, SEGIG, 0); sethvec(6, intr6, SEGIG, 0); sethvec(7, intr7, SEGIG, 0); sethvec(8, intr8, SEGIG, 0); sethvec(9, intr9, SEGIG, 0); sethvec(10, intr10, SEGIG, 0); sethvec(11, intr11, SEGIG, 0); sethvec(12, intr12, SEGIG, 0); sethvec(13, intr13, SEGIG, 0); sethvec(14, intr14, SEGIG, 0); sethvec(15, intr15, SEGIG, 0); sethvec(16, intr16, SEGIG, 0); sethvec(17, intr17, SEGIG, 0); sethvec(18, intr18, SEGIG, 0); sethvec(19, intr19, SEGIG, 0); sethvec(20, intr20, SEGIG, 0); sethvec(21, intr21, SEGIG, 0); sethvec(22, intr22, SEGIG, 0); sethvec(23, intr23, SEGIG, 0); . ## diffname pc/trap.c 1991/0720 ## diff -e /n/bootesdump/1991/0719/sys/src/9/safari/trap.c /n/bootesdump/1991/0720/sys/src/9/safari/trap.c 178c Ureg *nur; nur = u->ureg; validaddr(nur->pc, 1, 0); validaddr(nur->usp, BY2WD, 0); if(nur->cs!=u->svcs || nur->ss!=u->svss || (nur->flags&0xff)!=(u->svflags&0xff)){ pprint("bad noted ureg cs %ux ss %ux flags %ux\n", nur->cs, nur->ss, nur->flags); pexit("Suicide", 0); } lock(&u->p->debug); if(!u->notified){ unlock(&u->p->debug); return; } u->notified = 0; nur->flags = (u->svflags&0xffffff00) | (ur->flags&0xff); memmove(ur, u->ureg, sizeof(Ureg)); ur->ax = -1; /* return error from the interrupted call */ switch(arg0){ case NCONT: splhi(); unlock(&u->p->debug); rfnote(ur); break; /* never returns */ default: pprint("unknown noted arg 0x%lux\n", arg0); u->lastnote.flag = NDebug; /* fall through */ case NDFLT: if(u->lastnote.flag == NDebug) pprint("suicide: %s\n", u->lastnote.msg); unlock(&u->p->debug); pexit(u->lastnote.msg, u->lastnote.flag!=NDebug); } . 176c noted(Ureg *ur, ulong arg0) . 174a /* * Return user to state before notify() */ . 172a ulong sp; lock(&u->p->debug); if(u->nnote==0){ unlock(&u->p->debug); return; } if(u->note[0].flag!=NUser && (u->notified || u->notify==0)){ if(u->note[0].flag == NDebug) pprint("suicide: %s\n", u->note[0].msg); Die: unlock(&u->p->debug); pexit(u->note[0].msg, u->note[0].flag!=NDebug); } if(!u->notified){ if(!u->notify) goto Die; u->svcs = ur->cs; u->svss = ur->ss; u->svflags = ur->flags; sp = ur->usp; sp -= sizeof(Ureg); u->ureg = (void*)sp; memmove((Ureg*)sp, ur, sizeof(Ureg)); sp -= ERRLEN; memmove((char*)sp, u->note[0].msg, ERRLEN); sp -= 3*BY2WD; *(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */ *(ulong*)(sp+1*BY2WD) = (ulong)u->ureg; /* arg 1 is ureg* */ *(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */ ur->usp = sp; ur->pc = (ulong)u->notify; u->notified = 1; u->nnote--; memmove(&u->lastnote, &u->note[0], sizeof(Note)); memmove(&u->note[0], &u->note[1], u->nnote*sizeof(Note)); } unlock(&u->p->debug); . 171c notify(Ureg *ur) . 169a /* * Call user, if necessary, with note. * Pass user the Ureg struct and the note on his stack. */ . 167c /* * do something about floating point!!! */ ax = ur->ax; sp = ur->usp; u->nerrlab = 0; ret = -1; z = (ulong *)sp; print("syscall %lux %lux %lux %lux\n", *z, *(z+1), *(z+2), *(z+3)); dumpregs(ur); if(++times==3) panic("3rd time in syscall"); if(!waserror()){ if(ax >= sizeof systab/BY2WD){ pprint("bad sys call number %d pc %lux\n", ax, ur->pc); postnote(u->p, 1, "sys: bad sys call", NDebug); error(Ebadarg); } if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-(1+MAXSYSARG)*BY2WD)) validaddr(sp, (1+MAXSYSARG)*BY2WD, 0); ret = (*systab[ax])((ulong*)(sp+BY2WD)); poperror(); } print("return from syscall\n"); if(u->nerrlab){ print("bad errstack [%d]: %d extra\n", ax, u->nerrlab); for(i = 0; i < NERR; i++) print("sp=%lux pc=%lux\n", u->errlab[i].sp, u->errlab[i].pc); panic("error stack"); } u->p->insyscall = 0; if(ax == NOTED){ noted(ur, *(ulong*)(sp+BY2WD)); ret = -1; } else if(u->nnote){ ur->ax = ret; notify(ur); } return ret; . 165a if((ur->cs)&0xffff == KESEL) panic("recursive system call"); u->p->insyscall = 0; . 163a ulong ax; ulong sp; long ret; int i; static int times; ulong *z; . 160a #undef CHDIR /* BUG */ #include "/sys/src/libc/9syscall/sys.h" typedef long Syscall(ulong*); Syscall sysr1, sysfork, sysexec, sysgetpid, syssleep, sysexits, sysdeath, syswait; Syscall sysopen, sysclose, sysread, syswrite, sysseek, syserrstr, sysaccess, sysstat, sysfstat; Syscall sysdup, syschdir, sysforkpgrp, sysbind, sysmount, syspipe, syscreate; Syscall sysbrk_, sysremove, syswstat, sysfwstat, sysnotify, sysnoted, sysalarm; Syscall *systab[]={ sysr1, syserrstr, sysbind, syschdir, sysclose, sysdup, sysalarm, sysexec, sysexits, sysfork, sysforkpgrp, sysfstat, sysdeath, sysmount, sysopen, sysread, sysseek, syssleep, sysstat, syswait, syswrite, syspipe, syscreate, sysdeath, sysbrk_, sysremove, syswstat, sysfwstat, sysnotify, sysnoted, sysdeath, /* sysfilsys */ }; . 157a void dumpstack(void) { } void execpc(ulong entry) { ((Ureg*)UREGADDR)->pc = entry; } . 8a void noted(Ureg*, ulong); void notify(Ureg*); . 7a #include "errno.h" . ## diffname pc/trap.c 1991/0722 ## diff -e /n/bootesdump/1991/0720/sys/src/9/safari/trap.c /n/bootesdump/1991/0722/sys/src/9/safari/trap.c 354,356c return; . 305a if(waserror()){ pprint("suicide: trap in notify\n"); unlock(&u->p->debug); pexit("Suicide", 0); } validaddr((ulong)u->notify, 1, 0); validaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0); poperror(); . ## diffname pc/trap.c 1991/0723 ## diff -e /n/bootesdump/1991/0722/sys/src/9/safari/trap.c /n/bootesdump/1991/0723/sys/src/9/safari/trap.c 259d 243,247d 226,227d ## diffname pc/trap.c 1991/0724 ## diff -e /n/bootesdump/1991/0723/sys/src/9/safari/trap.c /n/bootesdump/1991/0724/sys/src/9/safari/trap.c 349c ur->ax = -1; /* return error from the interrupted syscall */ . 262c } else if(u->nnote && ax!=FORK){ . ## diffname pc/trap.c 1991/0725 ## diff -e /n/bootesdump/1991/0724/sys/src/9/safari/trap.c /n/bootesdump/1991/0725/sys/src/9/safari/trap.c 349c /* ur->ax = -1; /* return error from the interrupted syscall */ . 261,262c else if(u->nnote && ax!=FORK){ . 259c if(ax == NOTED) . ## diffname pc/trap.c 1991/0727 ## diff -e /n/bootesdump/1991/0725/sys/src/9/safari/trap.c /n/bootesdump/1991/0727/sys/src/9/safari/trap.c 281a u->p->notepending = 0; . ## diffname pc/trap.c 1991/0731 ## diff -e /n/bootesdump/1991/0727/sys/src/9/safari/trap.c /n/bootesdump/1991/0731/sys/src/9/safari/trap.c 176,217c #include "../port/systab.h" . 140c c = v&~0x7; if(c==Int0vec || c==Int1vec){ outb(Int0ctl, EOI); if(c == Int1vec) outb(Int1ctl, EOI); } . 134c (*ivec[v])(ur); . 130a v = ur->trap; if(v>=256 || ivec[v] == 0) panic("bad trap type %d %lux\n", v, ur->pc); . 128,129c int v; int c; . 119a /* * Set up the second 8259 interrupt processor. * Make 8259 interrupts start at CPU vector Int0vec. * Set the 8259 as master with edge triggered * input with fully nested interrupts. */ outb(Int1ctl, 0x11); /* ICW1 - edge triggered, master, ICW4 will be sent */ outb(Int1aux, Int1vec); /* ICW2 - interrupt vector offset */ outb(Int1aux, 0x02); /* ICW3 - I am a slave on level 2 */ outb(Int1aux, 0x01); /* ICW4 - 8086 mode, not buffered */ /* * pass #2 8259 interrupts to #1 */ int0mask &= ~0x04; outb(Int0aux, int0mask); . 118c outb(Int0aux, 0x04); /* ICW3 - have slave on level 2 */ . 93,98d 90a sethvec(24, intr24, SEGIG, 0); sethvec(25, intr25, SEGIG, 0); sethvec(26, intr26, SEGIG, 0); sethvec(27, intr27, SEGIG, 0); sethvec(28, intr28, SEGIG, 0); sethvec(29, intr29, SEGIG, 0); sethvec(30, intr30, SEGIG, 0); sethvec(31, intr31, SEGIG, 0); . 82a /* * set the standard devices */ . 64a * set all interrupts to panics */ for(i = 32; i < 256; i++) sethvec(i, intrbad, SEGIG, 0); /* . 52a } else if((v&~0x7) == Int1vec){ int1mask &= ~(1<<(v&7)); outb(Int1aux, int1mask); . 26,27c int int0mask = 0xff; /* interrupts enabled for first 8259 */ int int1mask = 0xff; /* interrupts enabled for second 8259 */ . 12a void intr0(void), intr1(void), intr2(void), intr3(void); void intr4(void), intr5(void), intr6(void), intr7(void); void intr8(void), intr9(void), intr10(void), intr11(void); void intr12(void), intr13(void), intr14(void), intr15(void); void intr16(void), intr17(void), intr18(void), intr19(void); void intr20(void), intr21(void), intr22(void), intr23(void); void intr24(void), intr25(void), intr26(void), intr27(void); void intr28(void), intr29(void), intr30(void), intr31(void); void intr64(void); void intrbad(void); . ## diffname pc/trap.c 1991/0801 ## diff -e /n/bootesdump/1991/0731/sys/src/9/safari/trap.c /n/bootesdump/1991/0801/sys/src/9/safari/trap.c 274d 270a ur->ax = ret; . 193a /* * call the trap routine */ (*ivec[v])(ur); . 186c * highest level interrupt (interrupts are still * off at this point) . 180,184d ## diffname pc/trap.c 1991/0802 ## diff -e /n/bootesdump/1991/0801/sys/src/9/safari/trap.c /n/bootesdump/1991/0802/sys/src/9/safari/trap.c 365d 362d 349c || (nur->flags&0xff00)!=(u->svflags&0xff00)){ . 275c } else if(u->nnote && ax!=FORK){ . 273c if(ax == NOTED){ . 253a spllo(); . ## diffname pc/trap.c 1991/0803 ## diff -e /n/bootesdump/1991/0802/sys/src/9/safari/trap.c /n/bootesdump/1991/0803/sys/src/9/safari/trap.c 38c int int1mask = 0xff; /* interrupts enabled for second 8259 */ . ## diffname pc/trap.c 1991/0806 ## diff -e /n/bootesdump/1991/0803/sys/src/9/safari/trap.c /n/bootesdump/1991/0806/sys/src/9/safari/trap.c 194a } /* * print 8259 status */ void dump8259(void) { int c; outb(Int0ctl, 0x0a); /* read ir */ print("ir0 %lux\n", inb(Int0ctl)); outb(Int0ctl, 0x0b); /* read is */ print("is0 %lux\n", inb(Int0ctl)); print("im0 %lux\n", inb(Int0aux)); outb(Int1ctl, 0x0a); /* read ir */ print("ir1 %lux\n", inb(Int1ctl)); outb(Int1ctl, 0x0b); /* read is */ print("is1 %lux\n", inb(Int1ctl)); print("im1 %lux\n", inb(Int1aux)); . 188a outb(Int0ctl, EOI); . 186d 178a if(v==19 || v==20) print("trap = %d\n", v); . ## diffname pc/trap.c 1991/0807 ## diff -e /n/bootesdump/1991/0806/sys/src/9/safari/trap.c /n/bootesdump/1991/0807/sys/src/9/safari/trap.c 176,177c if(v>=256 || ivec[v] == 0){ print("bad trap type %d %lux %lux %lux\n", v, ur->pc, int0mask, int1mask); return; } . ## diffname pc/trap.c 1991/0808 ## diff -e /n/bootesdump/1991/0807/sys/src/9/safari/trap.c /n/bootesdump/1991/0808/sys/src/9/safari/trap.c 289a if(ax == EXITS) print("%d returned from sysexits!\n", u->p->pid); . 288a if(ax == EXITS) print("%d exiting\n", u->p->pid); . 234c ur->ecode, ur->cs&0xff, ur->pc, ur->ss&0xff, ur->usp); . 37,38c int int0mask = 0x00; /* interrupts enabled for first 8259 */ int int1mask = 0x00; /* interrupts enabled for second 8259 */ . ## diffname pc/trap.c 1991/0809 ## diff -e /n/bootesdump/1991/0808/sys/src/9/safari/trap.c /n/bootesdump/1991/0809/sys/src/9/safari/trap.c 292,293d 289,290d ## diffname pc/trap.c 1991/0810 ## diff -e /n/bootesdump/1991/0809/sys/src/9/safari/trap.c /n/bootesdump/1991/0810/sys/src/9/safari/trap.c 181,183d ## diffname pc/trap.c 1991/0814 ## diff -e /n/bootesdump/1991/0810/sys/src/9/safari/trap.c /n/bootesdump/1991/0814/sys/src/9/safari/trap.c 387a if(waserror()){ pprint("suicide: trap in noted\n"); unlock(&u->p->debug); goto Die; } validaddr(nur->pc, 1, 0); validaddr(nur->usp, BY2WD, 0); poperror(); . 379a pprint("call to noted() when not notified\n"); . 375a Die: . ## diffname pc/trap.c 1991/0822 ## diff -e /n/bootesdump/1991/0814/sys/src/9/safari/trap.c /n/bootesdump/1991/0822/sys/src/9/safari/trap.c 277d 267c spllo(); . 193a * check for a waiting character, the uart is at too low * a priority level to work correctly at 9600 baud. */ uartintr0(ur); /* . ## diffname pc/trap.c 1991/0823 ## diff -e /n/bootesdump/1991/0822/sys/src/9/safari/trap.c /n/bootesdump/1991/0823/sys/src/9/safari/trap.c 273d 194,199d 190a if(v != Uart0vec) uartintr0(ur); . 87,102c sethvec(0, intr0, SEGTG, 0); sethvec(1, intr1, SEGTG, 0); sethvec(2, intr2, SEGTG, 0); sethvec(3, intr3, SEGTG, 0); sethvec(4, intr4, SEGTG, 0); sethvec(5, intr5, SEGTG, 0); sethvec(6, intr6, SEGTG, 0); sethvec(7, intr7, SEGTG, 0); sethvec(8, intr8, SEGTG, 0); sethvec(9, intr9, SEGTG, 0); sethvec(10, intr10, SEGTG, 0); sethvec(11, intr11, SEGTG, 0); sethvec(12, intr12, SEGTG, 0); sethvec(13, intr13, SEGTG, 0); sethvec(14, intr14, SEGTG, 0); sethvec(15, intr15, SEGTG, 0); . 82c sethvec(i, intrbad, SEGTG, 0); . ## diffname pc/trap.c 1991/0827 ## diff -e /n/bootesdump/1991/0823/sys/src/9/safari/trap.c /n/bootesdump/1991/0827/sys/src/9/safari/trap.c 177c panic("bad trap type %d %lux %lux %lux\n", v, ur->pc, int0mask, int1mask); . ## diffname pc/trap.c 1991/0904 ## diff -e /n/bootesdump/1991/0827/sys/src/9/safari/trap.c /n/bootesdump/1991/0904/sys/src/9/safari/trap.c 107,122c sethvec(24, intr24, SEGIG, 0); sethvec(25, intr25, SEGIG, 0); sethvec(26, intr26, SEGIG, 0); sethvec(27, intr27, SEGIG, 0); sethvec(28, intr28, SEGIG, 0); sethvec(29, intr29, SEGIG, 0); sethvec(30, intr30, SEGIG, 0); sethvec(31, intr31, SEGIG, 0); sethvec(32, intr32, SEGIG, 0); sethvec(33, intr33, SEGIG, 0); sethvec(34, intr34, SEGIG, 0); sethvec(35, intr35, SEGIG, 0); sethvec(36, intr36, SEGIG, 0); sethvec(37, intr37, SEGIG, 0); sethvec(38, intr38, SEGIG, 0); sethvec(39, intr39, SEGIG, 0); . 105c * device interrupts . 102a sethvec(16, intr16, SEGTG, 0); . 85c * 80386 processor (and coprocessor) traps . 81c for(i = 0; i < 256; i++) . 20a void intr32(void), intr33(void), intr34(void), intr35(void); void intr36(void), intr37(void), intr38(void), intr39(void); . 17,18c void intr16(void); . ## diffname pc/trap.c 1991/0910 ## diff -e /n/bootesdump/1991/0904/sys/src/9/safari/trap.c /n/bootesdump/1991/0910/sys/src/9/safari/trap.c 200a if(((ur->cs)&0xffff)!=KESEL && u->nnote && v!=Syscallvec) notify(ur); . 197,199d 129,130c sethvec(Syscallvec, intr64, SEGTG, 3); setvec(Syscallvec, (void (*)(Ureg*))syscall); . ## diffname pc/trap.c 1991/0912 ## diff -e /n/bootesdump/1991/0910/sys/src/9/safari/trap.c /n/bootesdump/1991/0912/sys/src/9/safari/trap.c 196a if(v==16) print("vec thru 16\n"); . 122c sethvec(37, intr37, SEGTG, 0); . ## diffname pc/trap.c 1991/0913 ## diff -e /n/bootesdump/1991/0912/sys/src/9/safari/trap.c /n/bootesdump/1991/0913/sys/src/9/safari/trap.c 199a /* * syscall does it's own notifying */ . 197d 122c sethvec(37, intr37, SEGIG, 0); . ## diffname pc/trap.c 1991/0926 ## diff -e /n/bootesdump/1991/0913/sys/src/9/safari/trap.c /n/bootesdump/1991/0926/sys/src/9/safari/trap.c 300a u->p->psstate = 0; . 290a u->p->psstate = sysctab[ax]; . ## diffname pc/trap.c 1991/1001 ## diff -e /n/bootesdump/1991/0926/sys/src/9/safari/trap.c /n/bootesdump/1991/1001/sys/src/9/safari/trap.c 38,39c int int0mask = 0xff; /* interrupts enabled for first 8259 */ int int1mask = 0xff; /* interrupts enabled for second 8259 */ . ## diffname pc/trap.c 1991/1005 ## diff -e /n/bootesdump/1991/1001/sys/src/9/safari/trap.c /n/bootesdump/1991/1005/sys/src/9/safari/trap.c 179,180c if(v == 10 && spuriousfloppy == 0){ v = Floppyvec; spuriousfloppy = 1; }else panic("bad trap type %d %lux %lux %lux\n", v, ur->pc, int0mask, int1mask); . 175a static int spuriousfloppy; . ## diffname pc/trap.c 1991/1112 ## diff -e /n/bootesdump/1991/1005/sys/src/9/safari/trap.c /n/bootesdump/1991/1112/sys/src/9/safari/trap.c 422a } /* This routine must save the values of registers the user is not permitted to write * from devproc and the restore the saved values before returning */ void setregisters(Ureg *xp, char *pureg, char *uva, int n) { ulong flags; ulong cs; ulong ss; flags = xp->flags; cs = xp->cs; ss = xp->ss; memmove(pureg, uva, n); xp->flags = (xp->flags & 0xff) | (flags & 0xff00); xp->cs = cs; xp->ss = ss; . 329c lock(&u->p->debug); . 325,327c if(u->p->procctl) procctl(u->p); if(u->nnote==0) . 310c } else if(u->p->procctl || (u->nnote && ax!=FORK)){ . 275a u->dbgreg = ur; . 206c if(user) . 186a user = ((ur->cs)&0xffff)!=KESEL && v!=Syscallvec; if(user) u->dbgreg = ur; if(v>=256 || ivec[v] == 0) panic("bad trap type %d %lux %lux %lux\n", v, ur->pc, int0mask, int1mask); . 179,185d 174c int v, user; . 130a sethvec(Bptvec, intr3, SEGTG, 3); setvec(Bptvec, debugbpt); . 91d 70a void debugbpt(Ureg *ur) { char buf[ERRLEN]; if(u == 0) panic("kernel bpt"); /* restore pc to instruction that caused the trap */ ur->pc--; sprint(buf, "sys: breakpoint pc=0x%lux", ur->pc); postnote(u->p, 1, buf, NDebug); } . ## diffname pc/trap.c 1991/1113 ## diff -e /n/bootesdump/1991/1112/sys/src/9/safari/trap.c /n/bootesdump/1991/1113/sys/src/9/safari/trap.c 212a } if(v>=256 || ivec[v] == 0){ if(v <= 16){ if(user){ sprint(buf, "sys: %s pc=0x%lux", excname[v], ur->pc); postnote(u->p, 1, buf, NDebug); return; } else { dumpregs(ur); panic("%s pc=0x%lux", excname[v], ur->pc); } } panic("bad trap type %d pc=0x%lux\n", v, ur->pc); . 198,200d 190c char buf[ERRLEN]; . 181a char *excname[] = { [0] "divide error", [1] "debug exception", [4] "overflow", [5] "bounds check", [6] "invalid opcode", [8] "double fault", [10] "invalid TSS", [11] "segment not present", [12] "stack exception", [13] "general protection violation", }; . ## diffname pc/trap.c 1991/1114 ## diff -e /n/bootesdump/1991/1113/sys/src/9/safari/trap.c /n/bootesdump/1991/1114/sys/src/9/safari/trap.c 409a splx(s); . 368a s = spllo(); . 363c ulong s, sp; . 352d 350c splhi(); if(ax!=FORK && (u->p->procctl || u->nnote)) . 348c if(ax == NOTED) . 344a . ## diffname pc/trap.c 1991/1214 ## diff -e /n/bootesdump/1991/1114/sys/src/9/safari/trap.c /n/bootesdump/1991/1214/sys/src/9/safari/trap.c 315d 297a return USTKTOP-BY2WD; /* address of user-level clock */ . 296a ulong *sp; sp = (ulong*)(USTKTOP - ssize); *--sp = nargs; ((Ureg*)UREGADDR)->usp = (ulong)sp; . 294,295c long execregs(ulong entry, ulong ssize, ulong nargs) . 285,286c print(" SI %8.8lux DI %8.8lux BP %8.8lux\n", ur->si, ur->di, ur->bp); print(" DS %4.4ux ES %4.4ux FS %4.4ux GS %4.4ux\n", ur->ds&0xffff, ur->es&0xffff, ur->fs&0xffff, ur->gs&0xffff); . 280,282c print("FLAGS=%lux ECODE=%lux CS=%lux PC=%lux", ur->flags, ur->ecode, ur->cs&0xff, ur->pc); if(ur == (Ureg*)UREGADDR) print(" SS=%lux USP=%lux\n", ur->ss&0xff, ur->usp); else print("\n"); . 250,270d 226a if(v == 13) return; . 139c * system calls and break points . ## diffname pc/trap.c 1991/1216 ## diff -e /n/bootesdump/1991/1214/sys/src/9/safari/trap.c /n/bootesdump/1991/1216/sys/src/9/safari/trap.c 456c qunlock(&u->p->debug); . 445c qunlock(&u->p->debug); . 439c qunlock(&u->p->debug); . 429c qunlock(&u->p->debug); . 426c qlock(&u->p->debug); . 404c qunlock(&u->p->debug); . 383c qunlock(&u->p->debug); . 370c qunlock(&u->p->debug); . 364c qlock(&u->p->debug); . ## diffname pc/trap.c 1991/1218 ## diff -e /n/bootesdump/1991/1216/sys/src/9/safari/trap.c /n/bootesdump/1991/1218/sys/src/9/safari/trap.c 371c pexit(n->msg, n->flag!=NDebug); . 368c pprint("suicide: %s\n", n->msg); . 366c n = &u->note[0]; if(strncmp(n->msg, "sys:", 4) == 0){ l = strlen(n->msg); if(l > ERRLEN-15) /* " pc=0x12345678\0" */ l = ERRLEN-15; sprint(n->msg+l, " pc=0x%.8lux", ur->pc); } if(n->flag!=NUser && (u->notified || u->notify==0)){ . 356a Note *n; . 355a int l; . 231c sprint(buf, "sys: trap: %s", excname[v]); . 80c sprint(buf, "sys: breakpoint"); . ## diffname pc/trap.c 1992/0103 ## diff -e /n/bootesdump/1991/1218/sys/src/9/safari/trap.c /n/bootesdump/1992/0103/sys/src/9/safari/trap.c 343c splhi(); /* avoid interrupts during the iret */ . 313d 296a /* * syscall is called spllo() */ . ## diffname pc/trap.c 1992/0104 ## diff -e /n/bootesdump/1992/0103/sys/src/9/safari/trap.c /n/bootesdump/1992/0104/sys/src/9/safari/trap.c 247c if(user && (u->p->procctl || u->nnote)) . 245c * check user since syscall does it's own notifying . ## diffname pc/trap.c 1992/0108 ## diff -e /n/bootesdump/1992/0104/sys/src/9/safari/trap.c /n/bootesdump/1992/0108/sys/src/9/safari/trap.c 416a return 1; . 364,365c if(u->nnote == 0) return 0; . 355c int . 245c * check user since syscall does its own notifying . 11d ## diffname pc/trap.c 1992/0111 ## diff -e /n/bootesdump/1992/0108/sys/src/9/safari/trap.c /n/bootesdump/1992/0111/sys/src/9/safari/trap.c 8c #include "../port/error.h" . ## diffname pc/trap.c 1992/0120 ## diff -e /n/bootesdump/1992/0111/sys/src/9/safari/trap.c /n/bootesdump/1992/0120/sys/src/9/safari/trap.c 290a ulong userpc(void) { return ((Ureg*)UREGADDR)->pc; } . ## diffname pc/trap.c 1992/0124 ## diff -e /n/bootesdump/1992/0120/sys/src/9/safari/trap.c /n/bootesdump/1992/0124/sys/src/9/safari/trap.c 422c return sent; . 391a sent = 1; . 388a sent = 0; . 363c int l, sent; . ## diffname pc/trap.c 1992/0321 ## diff -e /n/bootesdump/1992/0124/sys/src/9/safari/trap.c /n/bootesdump/1992/0321/sys/src/9/safari/trap.c 2c #include "../port/lib.h" . ## diffname pc/trap.c 1992/0408 ## diff -e /n/bootesdump/1992/0321/sys/src/9/safari/trap.c /n/bootesdump/1992/0408/sys/src/9/safari/trap.c 255a splhi(); . ## diffname pc/trap.c 1992/0409 ## diff -e /n/bootesdump/1992/0408/sys/src/9/safari/trap.c /n/bootesdump/1992/0409/sys/src/9/safari/trap.c 256d ## diffname pc/trap.c 1992/0430 ## diff -e /n/bootesdump/1992/0409/sys/src/9/safari/trap.c /n/bootesdump/1992/0430/sys/src/9/safari/trap.c 351c if(ax!=RFORK && (u->p->procctl || u->nnote)) . ## diffname pc/trap.c 1992/0609 ## diff -e /n/bootesdump/1992/0430/sys/src/9/safari/trap.c /n/bootesdump/1992/0609/sys/src/9/safari/trap.c 461c validaddr(nur->pc, 1, 0); /* check for valid pc & usp */ . 452,453c nur->flags = (u->svflags&0xffffff00) | (nur->flags&0xff); memmove(ur, nur, sizeof(Ureg)); . 435,437c nur = u->ureg; /* pointer to user returned Ureg struct */ . 346a . 345a /* * Put return value in frame. On the safari the syscall is * just another trap and the return value from syscall is * ignored. On other machines the return value is put into * the results register by caller of syscall. */ . ## diffname pc/trap.c 1992/0616 ## diff -e /n/bootesdump/1992/0609/sys/src/9/safari/trap.c /n/bootesdump/1992/0616/sys/src/9/safari/trap.c 467,469d 462c if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){ . 412,414d 407,408c if(!okaddr((ulong)u->notify, 1, 0) || !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0)){ pprint("suicide: bad address in notify\n"); . ## diffname pc/trap.c 1992/0625 ## diff -e /n/bootesdump/1992/0616/sys/src/9/safari/trap.c /n/bootesdump/1992/0625/sys/src/9/safari/trap.c 334c ret = (*systab[ax])(u->s.args); . 332a u->s = *((Sargs*)(sp+1*BY2WD)); . 330a . ## diffname pc/trap.c 1992/06271 ## diff -e /n/bootesdump/1992/0625/sys/src/9/safari/trap.c /n/bootesdump/1992/06271/sys/src/9/safari/trap.c 363c if(u->scallnr!=RFORK && (u->p->procctl || u->nnote)) . 359c if(u->scallnr == NOTED) . 342c print("bad errstack [%d]: %d extra\n", u->scallnr, u->nerrlab); . 338c ret = (*systab[u->scallnr])(u->s.args); . 336c u->p->psstate = sysctab[u->scallnr]; . 326,327c if(u->scallnr >= sizeof systab/BY2WD){ pprint("bad sys call number %d pc %lux\n", u->scallnr, ur->pc); . 321c u->scallnr = ur->ax; . 308d ## diffname pc/trap.c 1992/0714 ## diff -e /n/bootesdump/1992/06271/sys/src/9/safari/trap.c /n/bootesdump/1992/0714/sys/src/9/safari/trap.c 394c if(n->flag == NDebug) . ## diffname pc/trap.c 1992/0804 ## diff -e /n/bootesdump/1992/0714/sys/src/9/safari/trap.c /n/bootesdump/1992/0804/sys/src/9/safari/trap.c 363a . 338a if(u->p->fgrp->ref <= 0) print("after syscall %s\n", u->p->psstate); . 336a if(u->p->fgrp->ref <= 0) print("before syscall %s\n", u->p->psstate); . 276a ulong l, v, i; extern ulong etext; if(u == 0) return; i = 0; for(l=(ulong)&l; lscallnr == RFORK && u->p->fpstate == FPactive){ /* * so that the child starts out with the * same registers as the parent */ splhi(); if(u->p->fpstate == FPactive){ fpsave(&u->fpsave); u->p->fpstate = FPinactive; } spllo(); } . 336,338d 113c sethvec(14, intr14, SEGIG, 0); . ## diffname pc/trap.c 1992/0806 ## diff -e /n/bootesdump/1992/0805/sys/src/9/safari/trap.c /n/bootesdump/1992/0806/sys/src/9/safari/trap.c 115c sethvec(16, intr16, SEGIG, 0); /* math coprocessor, interrupts off */ . 113c sethvec(14, intr14, SEGIG, 0); /* page fault, interrupts off */ . ## diffname pc/trap.c 1992/0918 ## diff -e /n/bootesdump/1992/0808/sys/src/9/safari/trap.c /n/bootesdump/1992/0918/sys/src/9/pc/trap.c 238c print("bad trap type %d pc=0x%lux\n", v, ur->pc); return; . ## diffname pc/trap.c 1992/1203 ## diff -e /n/bootesdump/1992/0918/sys/src/9/pc/trap.c /n/bootesdump/1992/1203/sys/src/9/pc/trap.c 432,433c if(!u->notify){ qunlock(&u->p->debug); pexit(n->msg, n->flag!=NDebug); } . 426d ## diffname pc/trap.c 1993/0216 ## diff -e /n/bootesdump/1992/1203/sys/src/9/pc/trap.c /n/bootesdump/1993/0216/sys/src/9/pc/trap.c 220d 217a outb(Int0ctl, EOI); . ## diffname pc/trap.c 1993/0217 ## diff -e /n/bootesdump/1993/0216/sys/src/9/pc/trap.c /n/bootesdump/1993/0217/sys/src/9/pc/trap.c 242c do { (*h->r)(ur); h = h->next; } while(h); . 225c if(v>=256 || (h = halloc.ivec[v]) == 0){ . 203a Handler *h; . 57a lock(&halloc); if(halloc.free >= Maxhandler) panic("out of interrupt handlers"); h = &halloc.h[halloc.free++]; h->next = halloc.ivec[v]; h->r = r; halloc.ivec[v] = h; unlock(&halloc); . 56c Handler *h; . 45a typedef struct Handler Handler; struct Handler { void (*r)(void*); Handler *next; }; struct { Lock; Handler *ivec[256]; Handler h[Maxhandler]; int free; } halloc; . 44d 34a Maxhandler= 128, /* max number of interrupt handlers */ . ## diffname pc/trap.c 1993/0219 ## diff -e /n/bootesdump/1993/0217/sys/src/9/pc/trap.c /n/bootesdump/1993/0219/sys/src/9/pc/trap.c 246a outb(Int0ctl, EOI); . 244d ## diffname pc/trap.c 1993/0220 ## diff -e /n/bootesdump/1993/0219/sys/src/9/pc/trap.c /n/bootesdump/1993/0220/sys/src/9/pc/trap.c 264c if(badtrap[v]++ < 10 || (badtrap[v]%1000) == 0) print("bad trap type %d pc=0x%lux: total %d\n", v, ur->pc, badtrap[v]); . 45a int badtrap[256]; . ## diffname pc/trap.c 1993/0224 ## diff -e /n/bootesdump/1993/0220/sys/src/9/pc/trap.c /n/bootesdump/1993/0224/sys/src/9/pc/trap.c 276,278c /* check user since syscall does its own notifying */ . 270a /* there may be multiple handlers on one interrupt level */ . 265,267c if(v >= Int0vec || v < Int0vec+16){ /* an unknown interrupts */ v -= Int0vec; if(badintr[v]++ == 0 || (badintr[v]%1000) == 0) print("unknown interrupt %d pc=0x%lux: total %d\n", v, ur->pc, badintr[v]); } else { /* unimplemented traps */ print("illegal trap %d pc=0x%lux\n", v, ur->pc); } . 254a /* a processor or coprocessor error */ . 252a /* an old 386 generates these fairly often, no idea why */ . 248,249d 46c int badintr[16]; . ## diffname pc/trap.c 1993/0225 ## diff -e /n/bootesdump/1993/0224/sys/src/9/pc/trap.c /n/bootesdump/1993/0225/sys/src/9/pc/trap.c 247d 244a outb(Int0ctl, EOI); . ## diffname pc/trap.c 1993/0915 ## diff -e /n/bootesdump/1993/0225/sys/src/9/pc/trap.c /n/fornaxdump/1993/0915/sys/src/brazil/pc/trap.c 548,551c if(up->lastnote.flag == NDebug) pprint("suicide: %s\n", up->lastnote.msg); qunlock(&up->debug); pexit(up->lastnote.msg, up->lastnote.flag!=NDebug); . 544c up->lastnote.flag = NDebug; . 539c qunlock(&up->debug); . 536c qunlock(&up->debug); . 529,530c up->notified = 0; nur->flags = (up->svflags&0xffffff00) | (nur->flags&0xff); . 526c qunlock(&up->debug); . 523,524c qlock(&up->debug); if(!up->notified){ . 515,517c nur = up->ureg; /* pointer to user returned Ureg struct */ if(nur->cs!=up->svcs || nur->ss!=up->svss || (nur->flags&0xff00)!=(up->svflags&0xff00)){ . 502c qunlock(&up->debug); . 496,500c ur->pc = (ulong)up->notify; up->notified = 1; up->nnote--; memmove(&up->lastnote, &up->note[0], sizeof(Note)); memmove(&up->note[0], &up->note[1], up->nnote*sizeof(Note)); . 493c *(ulong*)(sp+1*BY2WD) = (ulong)up->ureg; /* arg 1 is ureg* */ . 490c memmove((char*)sp, up->note[0].msg, ERRLEN); . 487c up->ureg = (void*)sp; . 484d 482a qunlock(&up->debug); . 481c if(!okaddr((ulong)up->notify, 1, 0) . 476,478c up->svcs = ur->cs; up->svss = ur->ss; up->svflags = ur->flags; . 470,472c if(!up->notified){ if(!up->notify){ qunlock(&up->debug); . 466d 463c if(n->flag!=NUser && (up->notified || up->notify==0)){ qunlock(&up->debug); . 454,456c qlock(&up->debug); up->notepending = 0; n = &up->note[0]; . 448,450c if(up->procctl) procctl(up->p); if(up->nnote == 0) . 431c if(up->scallnr!=RFORK && (up->procctl || up->nnote)) . 427c if(up->scallnr == NOTED) . 416,417c up->insyscall = 0; up->psstate = 0; . 412c print("sp=%lux pc=%lux\n", up->errlab[i].sp, up->errlab[i].pc); . 409,410c if(up->nerrlab){ print("bad errstack [%d]: %d extra\n", up->scallnr, up->nerrlab); . 406c ret = (*systab[up->scallnr])(up->s.args); . 403,404c up->s = *((Sargs*)(sp+1*BY2WD)); up->psstate = sysctab[up->scallnr]; . 394,396c if(up->scallnr >= sizeof systab/BY2WD){ pprint("bad sys call number %d pc %lux\n", up->scallnr, ur->pc); postnote(up->p, 1, "sys: bad sys call", NDebug); . 391c up->nerrlab = 0; . 384,386c if(up->fpstate == FPactive){ fpsave(&up->fpsave); up->fpstate = FPinactive; . 377,378c up->scallnr = ur->ax; if(up->scallnr == RFORK && up->fpstate == FPactive){ . 372,373c up->insyscall = 1; up->pc = ur->pc; . 325c for(l=(ulong)&l; lkstack+BY2PG; l+=4){ . 321c if(up == 0) . 315a dumpregs(Ureg *ur) { dumpregs2(ur); print(" ur %lux\n", ur); dumpregs2(&lasttrap); print(" lastur %lux\n", lastur); } void . 312a . 301c print("FLAGS=%lux TRAP=%lux ECODE=%lux CS=%lux PC=%lux", ur->flags, ur->trap, . 297,298c if(up) print("registers for %s %d\n", up->text, up->pid); . 295c dumpregs2(Ureg *ur) . 288a lasttrap = *ur; lastur = ur; . 287c splhi(); if(user && (up->procctl || up->nnote)) . 270c if(badintr[v]++ == 0 || (badintr[v]%100000) == 0) . 259c postnote(up->p, 1, buf, NDebug); . 250a lasttrap = *ur; lastur = ur; . 236c up->dbgreg = ur; . 220a Ureg lasttrap, *lastur; . 106c postnote(up->p, 1, buf, NDebug); . 101c if(up == 0) . ## diffname pc/trap.c 1993/1013 ## diff -e /n/fornaxdump/1993/0915/sys/src/brazil/pc/trap.c /n/fornaxdump/1993/1013/sys/src/brazil/pc/trap.c 467c procctl(up); . 414c postnote(up, 1, "sys: bad sys call", NDebug); . 372c Ureg *ur; ur = (Ureg*)up->dbgreg; return ur->pc; . 364,365c ur = up->dbgreg; ur->usp = (ulong)sp; ur->pc = entry; . 360a Ureg *ur; . 343c for(l=(ulong)&l; l<(ulong)(up->kstack+BY2PG); l+=4){ . 311,314c print(" SS=%lux USP=%lux\n", ur->ss&0xff, ur->usp); . 264c postnote(up, 1, buf, NDebug); . 106c postnote(up, 1, buf, NDebug); . ## diffname pc/trap.c 1993/1022 ## diff -e /n/fornaxdump/1993/1013/sys/src/brazil/pc/trap.c /n/fornaxdump/1993/1022/sys/src/brazil/pc/trap.c 593a /* Give enough context in the ureg to produce a kernel stack for * a sleeping process */ void setkernur(Ureg *xp, Proc *p) { xp->pc = p->sched.pc; xp->sp = p->sched.sp; } . ## diffname pc/trap.c 1993/1113 ## diff -e /n/fornaxdump/1993/1022/sys/src/brazil/pc/trap.c /n/fornaxdump/1993/1113/sys/src/brazil/pc/trap.c 592a } static void linkproc(void) { spllo(); (*up->kpfun)(up->kparg); } void kprocchild(Proc *p, void (*func)(void*), void *arg) { p->sched.pc = (ulong)linkproc; p->sched.sp = (ulong)p->kstack+KSTACK; p->kpfun = func; p->kparg = arg; } void forkchild(Proc *p, Ureg *ur) { Ureg *cur; /* * We add 2*BY2Wd to the stack because we have to account for * - the return PC * - trap's argument (ur) */ p->sched.sp = (ulong)p->kstack+KSTACK-(sizeof(Ureg)+2*BY2WD); p->sched.pc = (ulong)forkret; cur = (Ureg*)(p->sched.sp+2*BY2WD); memmove(cur, ur, sizeof(Ureg)); cur->ax = 0; /* return value of syscall in child */ /* Things from bottom of syscall we never got to execute */ p->psstate = 0; p->insyscall = 0; . 575a long execregs(ulong entry, ulong ssize, ulong nargs) { ulong *sp; Ureg *ur; sp = (ulong*)(USTKTOP - ssize); *--sp = nargs; ur = up->dbgreg; ur->usp = (ulong)sp; ur->pc = entry; return USTKTOP-BY2WD; /* address of user-level clock */ } ulong userpc(void) { Ureg *ur; ur = (Ureg*)up->dbgreg; return ur->pc; } . 354,377d 348a lim--; . 346c if(i == 8){ . 340c lim = 3; for(l=(ulong)&l; l<(ulong)(up->kstack+BY2PG) && lim; l+=4){ . 334a int lim; . 327c print(" lastur %lux lastup %lux\n", lastur); splhi(); dumpstack(); for(;;); . 325c print(" magic %lux %lux %lux\n", x[0], x[1], x[2]); print(" ur %lux up %lux\n", ur, up); . 323a ulong *x; x = (ulong*)(ur+1); . 316,317c print(" DS %4.4lux ES %4.4lux FS %4.4lux GS %4.4lux\n", ur->ds, ur->es, ur->fs, ur->gs); . 310,311c ur->ecode, ur->cs, ur->pc); print(" SS=%lux USP=%lux\n", ur->ss, ur->usp); . 294a lastup = up; . 255a lastup = up; . 240a ur->cs &= 0xffff; ur->ds &= 0xffff; ur->es &= 0xffff; ur->fs &= 0xffff; ur->gs &= 0xffff; if(user) ur->ss &= 0xffff; . 237c user = (ur->cs&0xffff) == UESEL; . 221a Proc *lastup; . ## diffname pc/trap.c 1993/1114 ## diff -e /n/fornaxdump/1993/1113/sys/src/brazil/pc/trap.c /n/fornaxdump/1993/1114/sys/src/brazil/pc/trap.c 168c sethvec(Bptvec, intr3, SEGIG, 3); . 166c sethvec(Syscallvec, intr64, SEGIG, 3); . 140c sethvec(15, intr15, SEGIG, 0); . 126,138c sethvec(0, intr0, SEGIG, 0); sethvec(1, intr1, SEGIG, 0); sethvec(2, intr2, SEGIG, 0); sethvec(4, intr4, SEGIG, 0); sethvec(5, intr5, SEGIG, 0); sethvec(6, intr6, SEGIG, 0); sethvec(7, intr7, SEGIG, 0); sethvec(8, intr8, SEGIG, 0); sethvec(9, intr9, SEGIG, 0); sethvec(10, intr10, SEGIG, 0); sethvec(11, intr11, SEGIG, 0); sethvec(12, intr12, SEGIG, 0); sethvec(13, intr13, SEGIG, 0); . 121c sethvec(i, intrbad, SEGIG, 0); . ## diffname pc/trap.c 1993/1115 ## diff -e /n/fornaxdump/1993/1114/sys/src/brazil/pc/trap.c /n/fornaxdump/1993/1115/sys/src/brazil/pc/trap.c 329d 322c print(" SS=%4.4lux USP=%lux\n", ur->ss&0xffff, ur->usp); . 320c print("FLAGS=%lux TRAP=%lux ECODE=%lux CS=%4.4lux PC=%lux", ur->flags, ur->trap, . 315a ur->cs &= 0xffff; ur->ds &= 0xffff; ur->es &= 0xffff; ur->fs &= 0xffff; ur->gs &= 0xffff; . 242,248d 226c * All trapscome here. It is slower to have all traps call trap() rather than * directly vectoring the handler. However, this avoids a lot of code duplication * and possible bugs. . 141c sethvec(16, intr16, SEGIG, 0); /* math coprocessor */ . 139c sethvec(14, intr14, SEGIG, 0); /* page fault */ . ## diffname pc/trap.c 1993/1116 ## diff -e /n/fornaxdump/1993/1115/sys/src/brazil/pc/trap.c /n/fornaxdump/1993/1116/sys/src/brazil/pc/trap.c 242a else if(ur->pc <= (ulong)end && *(uchar*)ur->pc == 0xCF) { if(iret_traps++ > 10) panic("iret trap"); return; } iret_traps = 0; . 236a static int iret_traps; . ## diffname pc/trap.c 1993/1124 ## diff -e /n/fornaxdump/1993/1116/sys/src/brazil/pc/trap.c /n/fornaxdump/1993/1124/sys/src/brazil/pc/trap.c 458,459d 396a USED(arg); . 390,391c void syscall(Ureg *ur, void *arg) . 298c (*h->r)(ur, h->arg); . 226c * All traps come here. It is slower to have all traps call trap() rather than . 169c setvec(Bptvec, debugbpt, 0); . 167c setvec(Syscallvec, syscall, 0); . 100a USED(arg); . 97c debugbpt(Ureg *ur, void *arg) . 80a h->arg = arg; . 71c setvec(int v, void (*r)(Ureg*, void*), void *arg) . 51c void (*r)(Ureg*, void*); void *arg; . ## diffname pc/trap.c 1993/1225 ## diff -e /n/fornaxdump/1993/1124/sys/src/brazil/pc/trap.c /n/fornaxdump/1993/1225/sys/src/brazil/pc/trap.c 404a up->dbgreg = ur; . ## diffname pc/trap.c 1994/0219 ## diff -e /n/fornaxdump/1993/1225/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0219/sys/src/brazil/pc/trap.c 675c xp->sp = p->sched.sp+4; . ## diffname pc/trap.c 1994/0407 ## diff -e /n/fornaxdump/1994/0219/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0407/sys/src/brazil/pc/trap.c 431a up->syscall[up->scallnr]++; . 427c if(up->scallnr >= nsyscall){ . ## diffname pc/trap.c 1994/0512 ## diff -e /n/fornaxdump/1994/0407/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0512/sys/src/brazil/pc/trap.c 352,356d 310,313d 268,270d 228d 225,226d 198,199c outb(Int1ctl, (1<<4)|(1<<3)|(1<<0)); /* ICW1 - master, level triggered, ICW4 will be sent */ . 186,187c outb(Int0ctl, (1<<4)|(1<<3)|(1<<0)); /* ICW1 - master, level triggered, ICW4 will be sent */ . ## diffname pc/trap.c 1994/0513 ## diff -e /n/fornaxdump/1994/0512/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0513/sys/src/brazil/pc/trap.c 584c return USTKTOP-BY2WD; /* address of user-level clock */ . 554c pexit("Suicide", 0); . 546a nur = up->ureg; /* pointer to user returned Ureg struct */ if(nur->cs!=up->svcs || nur->ss!=up->svss || (nur->flags&0xff00)!=(up->svflags&0xff00)) { qunlock(&up->debug); pprint("bad noted ureg cs %ux ss %ux flags %ux\n", nur->cs, nur->ss, nur->flags); pexit("Suicide", 0); } . 543a pprint("call to noted() when not notified\n"); . 541,542c if(!up->notified) { . 532,539d 195c * Set the 8259 as master with level triggered . 186c outb(Int0ctl, (1<<4)|(0<<3)|(1<<0)); /* ICW1 - master, level triggered, . ## diffname pc/trap.c 1994/0603 ## diff -e /n/fornaxdump/1994/0513/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0603/sys/src/brazil/pc/trap.c 186c outb(Int0ctl, (1<<4)|(0<<3)|(1<<0)); /* ICW1 - master, edge triggered, . ## diffname pc/trap.c 1994/0612 ## diff -e /n/fornaxdump/1994/0603/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0612/sys/src/brazil/pc/trap.c 417d ## diffname pc/trap.c 1994/0623 ## diff -e /n/fornaxdump/1994/0612/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0623/sys/src/brazil/pc/trap.c 447a if(up->nerrlab != 0) panic("nerrlab = %d syscall = %d\n", up->nerrlab, up->scallnr); . ## diffname pc/trap.c 1994/0715 ## diff -e /n/fornaxdump/1994/0623/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0715/sys/src/brazil/pc/trap.c 448,451d 444a splhi(); . 407a spllo(); . 406d 401d 399c * same registers as the parent. * this must be atomic relative to this CPU, hence * the spl's. . 387a . 377c * syscall is called splhi() . 302c if(v != Syscallvec && user && (up->procctl || up->nnote)) . 300c /* * check user since syscall does its own notifying */ . 229c * and possible bugs. trap is called splhi(). . 225d ## diffname pc/trap.c 1994/0722 ## diff -e /n/fornaxdump/1994/0715/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0722/sys/src/brazil/pc/trap.c 281c /* an unknown interrupt */ . 211,222c char *excname[] = { [0] "divide error", [1] "debug exception", [2] " nonmaskable interrupt", [3] "breakpoint", [4] "overflow", [5] "bounds check", [6] "invalid opcode", [7] "coprocessor not available", [8] "double fault", [9] "9 (reserved)", [10] "invalid TSS", [11] "segment not present", [12] "stack exception", [13] "general protection violation", [14] "page fault", [15] "15 (reserved)", [16] "coprocessor error", . ## diffname pc/trap.c 1994/0812 ## diff -e /n/fornaxdump/1994/0722/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0812/sys/src/brazil/pc/trap.c 362c lim = 6; . ## diffname pc/trap.c 1994/0813 ## diff -e /n/fornaxdump/1994/0812/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0813/sys/src/brazil/pc/trap.c 375a /* save crash info */ print("crasharea 0x%lux\n", crasharea); cs = (Crashstate*)crasharea; memmove(cs->kstack, up->kstack, KSTACK); cs->kbot = up->kstack; memmove(cs->text, up->text, NAMELEN); cs->magic = 0xdeaddead; cs->ksp = &l; . 363c for(l=(ulong)&l; l<(ulong)(up->kstack+KSTACK) && lim; l+=4){ . 356a Crashstate *cs; . 348a /* save crash info */ print("crasharea 0x%lux\n", crasharea); cs = (Crashstate*)crasharea; memmove(&cs->ureg, ur, sizeof(Ureg)); . 344a . 342a Crashstate *cs; extern ulong etext; . 63a /* * somewhere to drop crash info */ typedef struct { ulong magic; void *kbot; void *ksp; char text[NAMELEN]; Ureg ureg; uchar kstack[KSTACK]; } Crashstate; . ## diffname pc/trap.c 1994/0814 ## diff -e /n/fornaxdump/1994/0813/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0814/sys/src/brazil/pc/trap.c 398a if(crasharea == 0) return; . 366a if(crasharea == 0) return; . ## diffname pc/trap.c 1994/0816 ## diff -e /n/fornaxdump/1994/0814/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0816/sys/src/brazil/pc/trap.c 396d 386,387c for(l=(ulong)&l; l<(ulong)(up->kstack+KSTACK); l+=4){ . 379d ## diffname pc/trap.c 1994/0817 ## diff -e /n/fornaxdump/1994/0816/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0817/sys/src/brazil/pc/trap.c 396,406d 379d 365,371d 356d 64,76d ## diffname pc/trap.c 1994/0824 ## diff -e /n/fornaxdump/1994/0817/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0824/sys/src/brazil/pc/trap.c 194c * Make 8259 interrupts start at CPU vector Int1vec. . ## diffname pc/trap.c 1994/0902 ## diff -e /n/fornaxdump/1994/0824/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/0902/sys/src/brazil/pc/trap.c 348a print(" CR0 %8.8lux CR2 %8.8lux\n", getcr0(), getcr2()); . ## diffname pc/trap.c 1994/1007 ## diff -e /n/fornaxdump/1994/0902/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/1007/sys/src/brazil/pc/trap.c 174a . ## diffname pc/trap.c 1994/1029 ## diff -e /n/fornaxdump/1994/1007/sys/src/brazil/pc/trap.c /n/fornaxdump/1994/1029/sys/src/brazil/pc/trap.c 348a dumpregs2(&scndlastur); dumpregs2(&lastur); . 311a out: scndlastur = lastur; lastur = *ur; . 297c goto out; . 282a print("%s pc=0x%lux", excname[v], ur->pc); for(;;); . 280c goto out; . 273c goto out; . 254c goto out; . 231a Ureg lastur; Ureg scndlastur; . 229a [17] "alignment check", [18] "something bad happened", . 145a sethvec(17, intr17, SEGIG, 0); sethvec(18, intr18, SEGIG, 0); . 16c void intr16(void), intr17(void), intr18(void); . ## diffname pc/trap.c 1995/0105 ## diff -e /n/fornaxdump/1994/1029/sys/src/brazil/pc/trap.c /n/fornaxdump/1995/0105/sys/src/brazil/pc/trap.c 592d 581,582c break; . 578d 573a qunlock(&up->debug); . 559c pexit("Suicide", 0); . 471a splhi(); . 469d ## diffname pc/trap.c 1995/0115 ## diff -e /n/fornaxdump/1995/0105/sys/src/brazil/pc/trap.c /n/fornaxdump/1995/0115/sys/src/brazil/pc/trap.c 474a . ## diffname pc/trap.c 1995/0202 ## diff -e /n/fornaxdump/1995/0115/sys/src/brazil/pc/trap.c /n/fornaxdump/1995/0202/sys/src/brazil/pc/trap.c 592a qunlock(&up->debug); . 584a case NSAVE: if(!okaddr(nur->pc, BY2WD, 0) || !okaddr(nur->usp, BY2WD, 0)){ pprint("suicide: trap in noted\n"); qunlock(&up->debug); pexit("Suicide", 0); } qunlock(&up->debug); sp = oureg-4*BY2WD-ERRLEN; splhi(); ur->sp = sp; ((ulong*)sp)[1] = oureg; /* arg 1 0(FP) is ureg* */ ((ulong*)sp)[0] = 0; /* arg 0 is pc */ break; . 582a up->ureg = (Ureg*)(*(ulong*)(oureg-BY2WD)); qunlock(&up->debug); . 580a qunlock(&up->debug); . 578a case NRSTR: . 575d 573c /* don't let user change text or stack segments */ nur->cs = ur->cs; nur->ss = ur->ss; /* don't let user change system flags */ nur->flags = (ur->flags & ~0xCD5) | (nur->flags & 0xCD5); . 568,570c pexit("Suicide", 0); . 565,566c /* sanity clause */ oureg = (ulong)nur; if(oureg>=USTKTOP || ouregnotified) { . 554a ulong oureg, sp; . 545c return 1; . 542a if(!up->notify){ qunlock(&up->debug); pexit(n->msg, n->flag!=NDebug); } sp = ur->usp; sp -= sizeof(Ureg); if(!okaddr((ulong)up->notify, 1, 0) || !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0)){ pprint("suicide: bad address in notify\n"); qunlock(&up->debug); pexit("Suicide", 0); } up->ureg = (void*)sp; memmove((Ureg*)sp, ur, sizeof(Ureg)); *(Ureg**)(sp-BY2WD) = up->ureg; /* word under Ureg is old up->ureg */ up->ureg = (void*)sp; sp -= BY2WD+ERRLEN; memmove((char*)sp, up->note[0].msg, ERRLEN); sp -= 3*BY2WD; *(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */ *(ulong*)(sp+1*BY2WD) = (ulong)up->ureg; /* arg 1 is ureg* */ *(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */ ur->usp = sp; ur->pc = (ulong)up->notify; up->notified = 1; up->nnote--; memmove(&up->lastnote, &up->note[0], sizeof(Note)); memmove(&up->note[0], &up->note[1], up->nnote*sizeof(Note)); . 510,541c if(up->notified) { qunlock(&up->debug); splhi(); return 0; . 503a . 485c int l; . ## diffname pc/trap.c 1995/02021 ## diff -e /n/fornaxdump/1995/0202/sys/src/brazil/pc/trap.c /n/fornaxdump/1995/02021/sys/src/brazil/pc/trap.c 575,576c if(!okaddr((ulong)oureg-BY2WD, BY2WD+sizeof(Ureg), 0)){ . 526c || !okaddr(sp-ERRLEN-4*BY2WD, sizeof(Ureg)+ERRLEN+4*BY2WD, 1)){ . ## diffname pc/trap.c 1995/0222 ## diff -e /n/fornaxdump/1995/02021/sys/src/brazil/pc/trap.c /n/fornaxdump/1995/0222/sys/src/brazil/pc/trap.c 301a print("isr0 = 0x%2.2ux, isr1 = 0x%2.2ux\n", isr0, isr1); } . 299c /* * Check for a default IRQ7. This can happen when * the IRQ input goes away before the acknowledge. * In this case, a 'default IRQ7' is generated, but * the corresponding bit in the ISR isn't set. */ if(v == 7 && (isr0 & 0x80) == 0) goto out; if(badintr[v]++ == 0 || (badintr[v]%100000) == 0){ . 274a } . 273c if(c == Int1vec){ isr1 = inb(Int1ctl); . 271a isr0 = inb(Int0ctl); . 270a isr0 = isr1 = 0x00; . 251a uchar isr0, isr1; . 211a /* * Set Ocw3 to return the ISR when ctl read. */ outb(Int0ctl, Ocw3|0x03); outb(Int1ctl, Ocw3|0x03); . 33a Icw1= 0x10, /* select bit in ctl register */ Ocw2= 0x00, Ocw3= 0x08, . ## diffname pc/trap.c 1995/0223 ## diff -e /n/fornaxdump/1995/0222/sys/src/brazil/pc/trap.c /n/fornaxdump/1995/0223/sys/src/brazil/pc/trap.c 325c print("isr = 0x%4.4ux\n", isr); . 320c if((isr & (1<= Int0vec && v < Int0vec+16){ . 287c isr |= inb(Int1ctl)<<8; . 284c isr = inb(Int0ctl); . 282c isr = 0; . 262c ushort isr; . ## diffname pc/trap.c 1995/0329 ## diff -e /n/fornaxdump/1995/0223/sys/src/brazil/pc/trap.c /n/fornaxdump/1995/0329/sys/src/brazil/pc/trap.c 202c * Set the 8259 as master with edge triggered . ## diffname pc/trap.c 1995/0331 ## diff -e /n/fornaxdump/1995/0329/sys/src/brazil/pc/trap.c /n/fornaxdump/1995/0331/sys/src/brazil/pc/trap.c 202c * Set the 8259 as master with level triggered . ## diffname pc/trap.c 1995/0502 ## diff -e /n/fornaxdump/1995/0331/sys/src/brazil/pc/trap.c /n/fornaxdump/1995/0502/sys/src/brazil/pc/trap.c 205c outb(Int1ctl, (1<<4)|(0<<3)|(1<<0)); /* ICW1 - master, level triggered, . ## diffname pc/trap.c 1995/1024 ## diff -e /n/fornaxdump/1995/0502/sys/src/brazil/pc/trap.c /n/fornaxdump/1995/1024/sys/src/brazil/pc/trap.c 745a ulong dbgpc(Proc *p) { Ureg *ur; ur = p->dbgreg; if(ur == 0) return 0; return ur->pc; } . ## diffname pc/trap.c 1996/0514 ## diff -e /n/fornaxdump/1995/1024/sys/src/brazil/pc/trap.c /n/fornaxdump/1996/0514/sys/src/brazil/pc/trap.c 293,295d ## diffname pc/trap.c 1996/0626 ## diff -e /n/fornaxdump/1996/0514/sys/src/brazil/pc/trap.c /n/fornaxdump/1996/0626/sys/src/brazil/pc/trap.c 531a qunlock(&up->debug); . 529d 344c saveout: . 340a out: . 329c goto saveout; . 319c goto saveout; . 302,303d 296a spllo(); . 272c goto saveout; . ## diffname pc/trap.c 1996/0802 ## diff -e /n/fornaxdump/1996/0626/sys/src/brazil/pc/trap.c /n/fornaxdump/1996/0802/sys/src/brazil/pc/trap.c 385a */ . 383a /* . ## diffname pc/trap.c 1997/0327 ## diff -e /n/fornaxdump/1996/0802/sys/src/brazil/pc/trap.c /n/emeliedump/1997/0327/sys/src/brazil/pc/trap.c 755c return ureg->pc; . 751,752c ureg = p->dbgreg; if(ureg == 0) . 749c Ureg *ureg; . 742,743c ureg->pc = p->sched.pc; ureg->sp = p->sched.sp+4; . 740c setkernur(Ureg* ureg, Proc* p) . 731c /* Things from bottom of syscall which were never executed */ . 727,729c cureg = (Ureg*)(p->sched.sp+2*BY2WD); memmove(cureg, ureg, sizeof(Ureg)); cureg->ax = 0; /* return value of syscall in child */ . 720c * Add 2*BY2WD to the stack to account for . 717c Ureg *cureg; . 715c forkchild(Proc *p, Ureg *ureg) . 705c kprocchild(Proc* p, void (*func)(void*), void* arg) . 701c up->kpfun(up->kparg); . 692,694c ureg->flags = (ureg->flags & 0x00FF) | (flags & 0xFF00); ureg->cs = cs; ureg->ss = ss; . 688,690c flags = ureg->flags; cs = ureg->cs; ss = ureg->ss; . 682c setregisters(Ureg* ureg, char* pureg, char* uva, int n) . 679c * from devproc and then restore the saved values before returning . 674,675c ureg = (Ureg*)up->dbgreg; return ureg->pc; . 672c Ureg *ureg; . 663,665c ureg = up->dbgreg; ureg->usp = (ulong)sp; ureg->pc = entry; . 658c Ureg *ureg; . 636c ureg->sp = sp; . 628c if(!okaddr(nureg->pc, BY2WD, 0) || !okaddr(nureg->usp, BY2WD, 0)){ . 618c if(!okaddr(nureg->pc, 1, 0) || !okaddr(nureg->usp, BY2WD, 0)){ . 613c memmove(ureg, nureg, sizeof(Ureg)); . 611c nureg->flags = (ureg->flags & ~0xCD5) | (nureg->flags & 0xCD5); . 607,608c nureg->cs = ureg->cs; nureg->ss = ureg->ss; . 599c oureg = (ulong)nureg; . 596c nureg = up->ureg; /* pointer to user returned Ureg struct */ . 585c Ureg *nureg; . 583c noted(Ureg* ureg, ulong arg0) . 567,568c ureg->usp = sp; ureg->pc = (ulong)up->notify; . 558c memmove((Ureg*)sp, ureg, sizeof(Ureg)); . 547c sp = ureg->usp; . 527c sprint(n->msg+l, " pc=0x%.8lux", ureg->pc); . 508c notify(Ureg* ureg) . 499c notify(ureg); . 495c noted(ureg, *(ulong*)(sp+BY2WD)); . 492c ureg->ax = ret; . 473c ret = systab[up->scallnr](up->s.args); . 462c pprint("bad sys call number %d pc %lux\n", up->scallnr, ureg->pc); . 457c sp = ureg->usp; . 442c up->scallnr = ureg->ax; . 439c if((ureg->cs)&0xffff == KESEL) . 436,437c up->pc = ureg->pc; up->dbgreg = ureg; . 432,434c m->syscall++; . 425,426c static void syscall(Ureg* ureg, void*) . 416a static void debugbpt(Ureg* ureg, void*) { char buf[ERRLEN]; if(up == 0) panic("kernel bpt"); /* restore pc to instruction that caused the trap */ ureg->pc--; sprint(buf, "sys: breakpoint"); postnote(up, 1, buf, NDebug); } static void fault386(Ureg* ureg, void*) { ulong addr; int read, user, n, insyscall; char buf[ERRLEN]; insyscall = up->insyscall; up->insyscall = 1; addr = getcr2(); read = !(ureg->ecode & 2); user = (ureg->cs&0xffff) == UESEL; spllo(); n = fault(addr, read); if(n < 0){ if(user){ sprint(buf, "sys: trap: fault %s addr=0x%lux", read? "read" : "write", addr); postnote(up, 1, buf, NDebug); return; } dumpregs(ureg); panic("fault: 0x%lux\n", addr); } up->insyscall = insyscall; } . 407,408c p = (uchar*)v; if(*(p-5) == 0xE8){ print("%lux ", p-5); i++; } . 397a uchar *p; . 383,391c /* * Processor control registers. * If machine check exception, time stamp counter, page size extensions or * enhanced virtual 8086 mode extensions are supported, there is a CR4. * If there is a CR4 and machine check extensions, read the machine check * address and machine check type registers if RDMSR supported. */ print(" CR0 %8.8lux CR2 %8.8lux CR3 %8.8lux", getcr0(), getcr2(), getcr3()); if(m->cpuiddx & 0x9A){ print(" CR4 %8.8luX", getcr4()); if((m->cpuiddx & 0xA0) == 0xA0){ rdmsr(0x00, &mca[1], &mca[0]); rdmsr(0x01, &mct[1], &mct[0]); print("\n MCA %8.8luX:%8.8luX MCT %8.8luX", mca[1], mca[0], mct[0]); } } print("\n ur %luX up %luX\n", ureg, up); . 381a dumpregs2(ureg); . 380c ulong mca[2], mct[2]; . 377c dumpregs(Ureg* ureg) . 364,373c print("cpu%d: registers for kernel\n", m->machno); print("FLAGS=%luX TRAP=%luX ECODE=%luX PC=%luX", ureg->flags, ureg->trap, ureg->ecode, ureg->pc); print(" SS=%4.4luX USP=%luX\n", ureg->ss & 0xFFFF, ureg->usp); print(" AX %8.8luX BX %8.8luX CX %8.8luX DX %8.8luX\n", ureg->ax, ureg->bx, ureg->cx, ureg->dx); print(" SI %8.8luX DI %8.8luX BP %8.8luX\n", ureg->si, ureg->di, ureg->bp); print(" CS %4.4uX DS %4.4uX ES %4.4uX FS %4.4uX GS %4.4uX\n", ureg->cs, ureg->ds, ureg->es, ureg->fs, ureg->gs); . 362c print("cpu%d: registers for %s %d\n", m->machno, up->text, up->pid); . 355,359c ureg->cs &= 0xFFFF; ureg->ds &= 0xFFFF; ureg->es &= 0xFFFF; ureg->fs &= 0xFFFF; ureg->gs &= 0xFFFF; . 353c dumpregs2(Ureg* ureg) . 342,346c if(v != VectorSYSCALL && user && (up->procctl || up->nnote)) notify(ureg); . 340d 331,336d 329a else if(v <= 16 && user){ spllo(); sprint(buf, "sys: trap: %s", excname[v]); postnote(up, 1, buf, NDebug); } else if(v >= VectorPIC && v <= MaxVectorPIC){ /* * An unknown interrupt. * Check for a default IRQ7. This can happen when * the IRQ input goes away before the acknowledge. * In this case, a 'default IRQ7' is generated, but * the corresponding bit in the ISR isn't set. * In fact, just ignore all such interrupts. */ if(nspuriousintr < 2) print("spurious interrupt %d\n", v-VectorPIC); nspuriousintr++; return; } else{ dumpregs(ureg); if(v < nelem(excname)) panic("%s", excname[v]); panic("unknown trap/intr: %d\n", v); } . 294,328c if(ctl->eoi) ctl->eoi(v); . 292c for(irq = ctl->irq; irq; irq = irq->next) irq->f(ureg, irq->a); . 276,290c v = ureg->trap; if(ctl = irqctl[v]){ if(ctl->isintr) m->intr++; if(ctl->isr) ctl->isr(v); . 268,274c up->dbgreg = ureg; . 264,266c user = (ureg->cs & 0xFFFF) == UESEL; . 260,262c Irqctl *ctl; Irq *irq; . 258d 255c trap(Ureg* ureg) . 246,247c static int nspuriousintr; . 243c [18] "machine check", . 234c [9] "coprocessor segment overrun", . 227c [2] "nonmaskable interrupt", . 131,221c intrenable(VectorBPT, debugbpt, 0, BUSUNKNOWN); intrenable(VectorPF, fault386, 0, BUSUNKNOWN); intrenable(VectorSYSCALL, syscall, 0, BUSUNKNOWN); . 125,129c idt = (Segdesc*)IDTADDR; vaddr = (ulong)vectortable; for(v = 0; v < 256; v++){ if(v == VectorBPT || v == VectorSYSCALL) pri = 3; else pri = 0; idt[v].d0 = (vaddr & 0xFFFF)|(KESEL<<16); idt[v].d1 = (vaddr & 0xFFFF0000)|SEGP|SEGPL(pri)|SEGIG; vaddr += 6; } . 123c int v, pri; ulong vaddr; Segdesc *idt; . 103,120d 99a ctl = irqctl[v]; irq = xalloc(sizeof(Irq)); irq->f = f; irq->a = a; irq->next = ctl->irq; ctl->irq = irq; unlock(&irqctllock); . 75,98c lock(&irqctllock); if(irqctl[v] == 0){ ctl = xalloc(sizeof(Irqctl)); if(arch->intrenable(v, tbdf, ctl) == -1){ unlock(&irqctllock); /* print("intrenable: didn't find v %d, tbdf 0x%uX\n", v, tbdf); */ xfree(ctl); return; } irqctl[v] = ctl; . 71,73c Irq * irq; Irqctl *ctl; . 69c intrenable(int v, void (*f)(Ureg*, void*), void* a, int tbdf) . 34,67d 24,32c static Lock irqctllock; static Irqctl *irqctl[256]; . 12,22c static void debugbpt(Ureg*, void*); static void fault386(Ureg*, void*); static void syscall(Ureg*, void*); . ## diffname pc/trap.c 1997/0405 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/pc/trap.c /n/emeliedump/1997/0405/sys/src/brazil/pc/trap.c 144a if(v == 2){ if(m->machno != 0) for(;;); nmienable(); } . 68a nmienable(); . 46a static void nmienable(void) { int x; /* * Hack: should be locked with NVRAM access. */ outb(0x70, 0x80); outb(0x70, 0); x = inb(0x61); outb(0x61, 0x08|x); outb(0x61, x & ~0x08); } . ## diffname pc/trap.c 1997/0520 ## diff -e /n/emeliedump/1997/0405/sys/src/brazil/pc/trap.c /n/emeliedump/1997/0520/sys/src/brazil/pc/trap.c 491,493c /* * Check the segment selectors are all valid, otherwise * a fault will be taken on attempting to return to the * user process. */ if(nureg->cs != UESEL || nureg->ss != UDSEL || nureg->ds != UDSEL || nureg->es != UDSEL || nureg->fs != UDSEL || nureg->gs != UDSEL){ pprint("bad segement selector in noted\n"); qunlock(&up->debug); pexit("Suicide", 0); } . 486c pprint("bad ureg in noted or call to noted when not notified\n"); . ## diffname pc/trap.c 1997/1003 ## diff -e /n/emeliedump/1997/0520/sys/src/brazil/pc/trap.c /n/emeliedump/1997/1003/sys/src/brazil/pc/trap.c 496,498c if((nureg->cs & 0xFFFF) != UESEL || (nureg->ss & 0xFFFF) != UDSEL || (nureg->ds & 0xFFFF) != UDSEL || (nureg->es & 0xFFFF) != UDSEL || (nureg->fs & 0xFFFF) != UDSEL || (nureg->gs & 0xFFFF) != UDSEL){ pprint("bad segment selector in noted\n"); . 494a * Take care with the comparisons as different processor * generations push segment descriptors in different ways. . ## diffname pc/trap.c 1997/1011 ## diff -e /n/emeliedump/1997/1003/sys/src/brazil/pc/trap.c /n/emeliedump/1997/1011/sys/src/brazil/pc/trap.c 298,299c if(mmukmapsync(addr) == 0){ dumpregs(ureg); panic("fault: 0x%lux\n", addr); } . ## diffname pc/trap.c 1997/1101 ## diff -e /n/emeliedump/1997/1011/sys/src/brazil/pc/trap.c /n/emeliedump/1997/1101/sys/src/brazil/pc/trap.c 387c } . 385c if(scallnr!=RFORK && (up->procctl || up->nnote)){ splhi(); . 383d 381c if(scallnr == NOTED) . 374c * Put return value in frame. On the x86 the syscall is . 364c print("bad errstack [%d]: %d extra\n", scallnr, up->nerrlab); . 360c ret = systab[scallnr](up->s.args); . 357,358c up->s = *((Sargs*)(sp+BY2WD)); up->psstate = sysctab[scallnr]; . 354,355c if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-sizeof(Sargs)-BY2WD)) validaddr(sp, sizeof(Sargs)+BY2WD, 0); . 348,349c if(scallnr >= nsyscall){ pprint("bad sys call number %d pc %lux\n", scallnr, ureg->pc); . 342d 326,340c scallnr = ureg->ax; up->scallnr = scallnr; if(scallnr == RFORK && up->fpstate == FPactive){ splhi(); fpsave(&up->fpsave); up->fpstate = FPinactive; spllo(); . 320a if((ureg->cs & 0xFFFF) != UESEL) panic("syscall: cs 0x%4.4uX\n", ureg->cs); . 319c int i, scallnr; . 314,315c void syscall(Ureg* ureg) . 312c * Syscall is called directly from assembler without going through trap(). . 252c if(*(p-5) == 0xE8 || (*(p-2) == 0xFF && *(p-1) == 0xD0)){ . 250a /* * Pick off general CALL (0xE8) and CALL indirect * through AX (0xFFD0). */ . 206c ureg->cs & 0xFFFF, ureg->ds & 0xFFFF, ureg->es & 0xFFFF, ureg->fs & 0xFFFF, ureg->gs & 0xFFFF); . 188,193d 179a } . 174,178c if(user && (up->procctl || up->nnote)){ splhi(); . 134,135c if(ctl->isr) ctl->isr(v); } . 132c if(ctl->isintr){ . 128a } . 126,127c user = 0; if((ureg->cs & 0xFFFF) == UESEL){ user = 1; . 116c * and possible bugs. The only exception is VectorSYSCALL. * Trap is called with interrupts disabled via interrupt-gates. . 84d 81a /* * Special traps. * Syscall() is called directly without going through trap(). */ . 78c idt[v].d1 = d1; . 73,76c d1 = (vaddr & 0xFFFF0000)|SEGP; switch(v){ case VectorBPT: d1 |= SEGPL(3)|SEGIG; break; case VectorSYSCALL: d1 |= SEGPL(3)|SEGTG; break; default: d1 |= SEGPL(0)|SEGIG; break; } . 66c int d1, v; . 14d ## diffname pc/trap.c 1998/0115 ## diff -e /n/emeliedump/1997/1101/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0115/sys/src/brazil/pc/trap.c 174,176c print("cpu%d: spurious interrupt %d, last %d", m->machno, v-VectorPIC, m->lastintr); for(i = 0; i < 32; i++){ if(!(active.machs & (1<machno == mach->machno) continue; print(": cpu%d: last %d", mach->machno, mach->lastintr); } print("\n"); m->spuriousintr++; . 151a if(v >= VectorPIC && v <= MaxVectorPIC) m->lastintr = v-VectorPIC; . 138a Mach *mach; . 135c int i, v, user; . 124,125d ## diffname pc/trap.c 1998/0320 ## diff -e /n/emeliedump/1998/0115/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0320/sys/src/brazil/pc/trap.c 193c //nmienable(); . 190c if(v == VectorNMI){ . 102c static char *excname[] = { . 59c outb(0x61, x); . 57c x = inb(0x61) & 0x07; /* Enable NMI */ . 54c outb(0x70, 0x80); /* NMI latch clear */ . 27c if(v >= VectorINTR && arch->intrenable(v, tbdf, ctl) == -1){ . ## diffname pc/trap.c 1998/0401 ## diff -e /n/emeliedump/1998/0320/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0401/sys/src/brazil/pc/trap.c 360a spllo(); . 359d 356d 248,251c rdmsr(0x00, &mca); rdmsr(0x01, &mct); print("\n MCA %8.8lluX MCT %8.8lluX", mca, mct); . 233c vlong mca, mct; . 193c } . 191c nmienable(); if(m->machno != 0){ print("cpu%d: PC %8.8uX\n", m->machno, ureg->pc); . 159a /* preemptive scheduling */ if(ctl->isintr && v != VectorTIMER && v != VectorCLOCK) if(up && up->state == Running && anyhigher()) sched(); . 80c d1 |= SEGPL(3)|SEGIG; . 29,31c //print("intrenable: didn't find v %d, tbdf 0x%uX\n", v, tbdf); . ## diffname pc/trap.c 1998/0512 ## diff -e /n/emeliedump/1998/0401/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0512/sys/src/brazil/pc/trap.c 161,162c if(up && up->state == Running) if(anyhigher()) if(!active.exiting) sched(); . 142a { ulong x, y; x = (ulong)&(m->stack[512]); y = (ulong)&mach; if(y < x) panic("trap: kstack %lux %lux", m->stack, y); } . ## diffname pc/trap.c 1998/0514 ## diff -e /n/emeliedump/1998/0512/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0514/sys/src/brazil/pc/trap.c 148c if(y < x+512) panic("cpu%d: trap: kstack %lux %lux", m->machno, x, y); . 146c if(up) x = (ulong)(up->kstack); else x = (ulong)(m->stack); . ## diffname pc/trap.c 1998/0516 ## diff -e /n/emeliedump/1998/0514/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0516/sys/src/brazil/pc/trap.c 175a splhi(); up->preempted = 0; } . 174c if(up->preempted == 0) if(!active.exiting){ up->preempted = 1; . 170c /* * preemptive scheduling. to limit stack depth, * make sure process has a chance to return from * the current interrupt before being preempted a * second time. */ . 143,153d ## diffname pc/trap.c 1998/0605 ## diff -e /n/emeliedump/1998/0516/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0605/sys/src/brazil/pc/trap.c 419a } if (up->nlocks != 0) { print("nlock = %d\n", up->nlocks); up->nlocks = 0; . 173a return; . ## diffname pc/trap.c 1998/0606 ## diff -e /n/emeliedump/1998/0605/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0606/sys/src/brazil/pc/trap.c 422,425d ## diffname pc/trap.c 1998/0731 ## diff -e /n/emeliedump/1998/0606/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0731/sys/src/brazil/pc/trap.c 339,342c dumpregs(ureg); panic("fault: 0x%lux\n", addr); . 329c insyscall = up->insyscall; up->insyscall = 1; . 327a user = (ureg->cs & 0xFFFF) == UESEL; if(!user && mmukmapsync(addr)) return; . 325,326d ## diffname pc/trap.c 1998/0806 ## diff -e /n/emeliedump/1998/0731/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0806/sys/src/brazil/pc/trap.c 35c . 33c unlock(&irqctllock); print("intrenable: didn't find v %d, tbdf 0x%uX\n", v, tbdf); return; . 31d 25,29c if(irqctl[v] == 0) irqctl[v] = xalloc(sizeof(Irqctl)); ctl = irqctl[v]; if(v >= VectorINTR && arch->intrenable(v, tbdf, ctl) == -1){ if(ctl->irq == nil){ irqctl[v] = nil; . 21c Irq *irq; . ## diffname pc/trap.c 1998/0811 ## diff -e /n/emeliedump/1998/0806/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0811/sys/src/brazil/pc/trap.c 274c print("\n ur %lux up %lux\n", ureg, up); . 271c print("\n MCA %8.8llux MCT %8.8llux", mca, mct); . 267c print(" CR4 %8.8lux", getcr4()); . 243c print(" SI %8.8lux DI %8.8lux BP %8.8lux\n", . 240,241c print(" SS=%4.4lux USP=%lux\n", ureg->ss & 0xFFFF, ureg->usp); print(" AX %8.8lux BX %8.8lux CX %8.8lux DX %8.8lux\n", . 238c print("FLAGS=%lux TRAP=%lux ECODE=%lux PC=%lux", ureg->flags, ureg->trap, . ## diffname pc/trap.c 1998/0825 ## diff -e /n/emeliedump/1998/0811/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0825/sys/src/brazil/pc/trap.c 245c print(" CS %4.4luX DS %4.4luX ES %4.4luX FS %4.4luX GS %4.4luX\n", . 243c print(" SI %8.8luX DI %8.8luX BP %8.8luX\n", . 240,241c print(" SS=%4.4luX USP=%luX\n", ureg->ss & 0xFFFF, ureg->usp); print(" AX %8.8luX BX %8.8luX CX %8.8luX DX %8.8luX\n", . 238c print("FLAGS=%luX TRAP=%luX ECODE=%luX PC=%luX", ureg->flags, ureg->trap, . 235c print("cpu%d: registers for %s %lud\n", m->machno, up->text, up->pid); . 212c print("cpu%d: PC %8.8luX\n", m->machno, ureg->pc); . ## diffname pc/trap.c 1998/0910 ## diff -e /n/emeliedump/1998/0825/sys/src/brazil/pc/trap.c /n/emeliedump/1998/0910/sys/src/brazil/pc/trap.c 344,345c sprint(buf, "sys: trap: fault %s addr=0x%lux", read? "read" : "write", addr); postnote(up, 1, buf, NDebug); . 338,342c if(!user){ dumpregs(ureg); panic("fault: 0x%lux\n", addr); . 217,219c if(vno < nelem(excname)) panic("%s", excname[vno]); panic("unknown trap/intr: %d\n", vno); . 209c if(vno == VectorNMI){ . 195c m->machno, vno, m->lastintr); . 185c else if(vno >= VectorPIC && vno != VectorSYSCALL){ . 182c sprint(buf, "sys: trap: %s", excname[vno]); . 180c else if(vno <= nelem(excname) && user){ . 168c if(ctl->isintr && ctl->irq != IrqTIMER && ctl->irq != IrqCLOCK) . 160c ctl->eoi(vno); . 156,158c if(ctl->isr) ctl->isr(vno); for(v = ctl; v != nil; v = v->next){ if(v->f) v->f(ureg, v->a); } . 150,153c if(vno >= VectorPIC && vno != VectorSYSCALL) m->lastintr = ctl->irq; . 146,147c vno = ureg->trap; if(ctl = vctl[vno]){ . 136,137c Vctl *ctl, *v; . 134c int i, vno, user; . 103,122c static char* excname[32] = { "divide error", "debug exception", "nonmaskable interrupt", "breakpoint", "overflow", "bounds check", "invalid opcode", "coprocessor not available", "double fault", "coprocessor segment overrun", "invalid TSS", "segment not present", "stack exception", "general protection violation", "page fault", "15 (reserved)", "coprocessor error", "alignment check", "machine check", "19 (reserved)", "20 (reserved)", "21 (reserved)", "22 (reserved)", "23 (reserved)", "24 (reserved)", "25 (reserved)", "26 (reserved)", "27 (reserved)", "28 (reserved)", "29 (reserved)", "30 (reserved)", "31 (reserved)", . 97,98c trapenable(VectorBPT, debugbpt, 0); trapenable(VectorPF, fault386, 0); . 39,44c void trapenable(int vno, void (*f)(Ureg*, void*), void* a) { Vctl *v; if(vno < 0 || vno >= VectorPIC) panic("trapenable: vno %d\n", vno); v = xalloc(sizeof(Vctl)); v->tbdf = BUSUNKNOWN; v->f = f; v->a = a; lock(&vctllock); if(vctl[vno]) v->next = vctl[vno]->next; vctl[vno] = v; unlock(&vctllock); . 37a if(vctl[vno]){ if(vctl[vno]->isr != v->isr || vctl[vno]->eoi != v->eoi) panic("intrenable: irq handler botch: %luX %luX %luX %luX\n", vctl[vno]->isr, v->isr, vctl[vno]->eoi, v->eoi); v->next = vctl[vno]->next; } vctl[vno] = v; iunlock(&vctllock); } . 29,35c ilock(&vctllock); vno = arch->intrenable(v); //print("irq%d, vno %d\n", irq, vno); if(vno == -1){ iunlock(&vctllock); print("intrenable: couldn't enable irq %d, tbdf 0x%uX\n", irq, tbdf); xfree(v); . 24,27c v = xalloc(sizeof(Vctl)); v->isintr = 1; v->irq = irq; v->tbdf = tbdf; v->f = f; v->a = a; . 21,22c int vno; Vctl *v; . 19c intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf) . 15,16c static Lock vctllock; static Vctl *vctl[256]; . ## diffname pc/trap.c 1998/1218 ## diff -e /n/emeliedump/1998/0910/sys/src/brazil/pc/trap.c /n/emeliedump/1998/1218/sys/src/brazil/pc/trap.c 44c v->next = vctl[vno]; . ## diffname pc/trap.c 1999/0301 ## diff -e /n/emeliedump/1998/1218/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0301/sys/src/brazil/pc/trap.c 698c /* return value of syscall in child */ cureg->ax = 0; . 647,648c /* This routine must save the values of registers the user is not permitted * to write from devproc and then restore the saved values before returning. . 597c if(!okaddr(nureg->pc, BY2WD, 0) || !okaddr(nureg->usp, BY2WD, 0)){ . 554c nureg = up->ureg; /* pointer to user returned Ureg struct */ . 437c print("sp=%lux pc=%lux\n", up->errlab[i].sp, up->errlab[i].pc); . 420c pprint("bad sys call number %d pc %lux\n", scallnr, ureg->pc); . 331c if(*(p-5) == 0xE8 || (*(p-2) == 0xFF && *(p-1) == 0xD0)){ . 300c print(" CR0 %8.8lux CR2 %8.8lux CR3 %8.8lux", getcr0(), getcr2(), getcr3()); . 295,298c * If machine check exception, time stamp counter, page size extensions * or enhanced virtual 8086 mode extensions are supported, there is a * CR4. If there is a CR4 and machine check extensions, read the machine * check address and machine check type registers if RDMSR supported. . 273,274c print("FLAGS=%luX TRAP=%luX ECODE=%luX PC=%luX", ureg->flags, ureg->trap, ureg->ecode, ureg->pc); . 270c print("cpu%d: registers for %s %lud\n", m->machno, up->text, up->pid); . 247c print("cpu%d: PC %8.8luX\n", m->machno, ureg->pc); . 161,163c * All traps come here. It is slower to have all traps call trap() * rather than directly vectoring the handler. However, this avoids a * lot of code duplication and possible bugs. The only exception is * VectorSYSCALL. . 42c panic("intrenable: handler: %luX %luX %luX %luX\n", . 36c print("intrenable: couldn't enable irq %d, tbdf 0x%uX\n", irq, tbdf); . 33d ## diffname pc/trap.c 1999/0319 ## diff -e /n/emeliedump/1999/0301/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0319/sys/src/brazil/pc/trap.c 378a print("fault pc %luX addr %luX\n", ureg->pc, addr); . ## diffname pc/trap.c 1999/0514 ## diff -e /n/emeliedump/1999/0319/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0514/sys/src/brazil/pc/trap.c 379d ## diffname pc/trap.c 1999/0517 ## diff -e /n/emeliedump/1999/0514/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0517/sys/src/brazil/pc/trap.c 685c p->sched.sp = (ulong)p->kstack+KSTACK-BY2WD; . 683a /* * gotolabel() needs a word on the stack in * which to place the return PC used to jump * to linkproc(). */ . ## diffname pc/trap.c 1999/0528 ## diff -e /n/emeliedump/1999/0517/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0528/sys/src/brazil/pc/trap.c 17a uvlong intrts; . ## diffname pc/trap.c 1999/0529 ## diff -e /n/emeliedump/1999/0528/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0529/sys/src/brazil/pc/trap.c 740a } /* called with interrupts off */ static void savets(void) { lock(&tsalloc); if(tsalloc.n < nelem(tsalloc.ts)) tsalloc.ts[tsalloc.n++] = intrts; unlock(&tsalloc); } /* read interrupt timestamps */ long readintrts(void *buf, int n) { n /= sizeof(uvlong); if(n <= 0) return 0; ilock(&tsalloc); if(n > tsalloc.n) n = tsalloc.n; memmove(buf, tsalloc.ts, n*sizeof(uvlong)); tsalloc.n = 0; iunlock(&tsalloc); return n*sizeof(uvlong); . 183a if(vno == tsalloc.vno) savets(); . 34a if(irq == IrqUART0) tsalloc.vno = vno; . 19a static void savets(void); . 18c /* interrupt timestamps, l.s knows fills intrts each interupt */ uvlong intrts; static struct { Lock; int vno; /* vector to save timestamps for */ int n; /* number of valid timestamps in ts[] */ uvlong ts[128]; /* time stamps */ } tsalloc; . ## diffname pc/trap.c 1999/0601 ## diff -e /n/emeliedump/1999/0529/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0601/sys/src/brazil/pc/trap.c 754,779d 195,196d 44,45d 27,28d 18,25c /* interrupt timestamps, l.s fills intrts each interupt */ uvlong intrts; . ## diffname pc/trap.c 1999/0604 ## diff -e /n/emeliedump/1999/0601/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0604/sys/src/brazil/pc/trap.c 629c } else qunlock(&up->debug); . 627c if(up->lastnote.flag == NDebug){ qunlock(&up->debug); . 610a pprint("suicide: trap in noted\n"); . 609d 599a pprint("suicide: trap in noted\n"); . 598d ## diffname pc/trap.c 1999/0701 ## diff -e /n/emeliedump/1999/0604/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0701/sys/src/brazil/pc/trap.c 378d 177a m->intrts = fastticks(nil); . 18,20d ## diffname pc/trap.c 1999/0717 ## diff -e /n/emeliedump/1999/0701/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0717/sys/src/brazil/pc/trap.c 338c print("%p ", p-5); . ## diffname pc/trap.c 1999/0720 ## diff -e /n/emeliedump/1999/0717/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0720/sys/src/brazil/pc/trap.c 346a if(i) print("\n"); . 342c if(i == 4){ . 338c print("%.8lux=%.8lux ", l, v); . 326a getpcsp(&pc, &sp); print("ktrace /kernel/path %.8lux %.8lux\n", pc, sp); . 320a ulong sp, pc; . 317a getpcsp(ulong *pc, ulong *sp) { *pc = getcallerpc(&pc); *sp = (ulong)&pc; } void . ## diffname pc/trap.c 1999/0721 ## diff -e /n/emeliedump/1999/0720/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0721/sys/src/brazil/pc/trap.c 358a } void dumpstack(void) { callwithureg(_dumpstack); . 335,336c print("ktrace /kernel/path %.8lux %.8lux\n", ureg->pc, ureg->sp); . 328d 324,325c static void _dumpstack(Ureg *ureg) . 320,321c Ureg ureg; ureg.pc = getcallerpc(&fn); ureg.sp = (ulong)&fn; fn(&ureg); . 318c callwithureg(void (*fn)(Ureg*)) . 316a /* * Fill in enough of Ureg to get a stack trace, and call a function. * Used by debugging interface rdb. */ . ## diffname pc/trap.c 1999/0819 ## diff -e /n/emeliedump/1999/0721/sys/src/brazil/pc/trap.c /n/emeliedump/1999/0819/sys/src/brazil/pc/trap.c 119,120c trapenable(VectorBPT, debugbpt, 0, "debugpt"); trapenable(VectorPF, fault386, 0, "fault386"); . 60a strncpy(v->name, name, NAMELEN); v->name[NAMELEN-1] = 0; . 51c trapenable(int vno, void (*f)(Ureg*, void*), void* a, char *name) . 49a int irqallocread(char *buf, long n, vlong offset) { int vno; Vctl *v; long oldn; char str[11+1+NAMELEN+1], *p; int m; if(n < 0 || offset < 0) error(Ebadarg); oldn = n; for(vno=0; vnonext){ m = snprint(str, sizeof str, "%11d %11d %.*s\n", vno, v->irq, NAMELEN, v->name); if(m <= offset) /* if do not want this, skip entry */ offset -= m; else{ /* skip offset bytes */ m -= offset; p = str+offset; offset = 0; /* write at most max(n,m) bytes */ if(m > n) m = n; memmove(buf, p, m); n -= m; buf += m; if(n == 0) return oldn; } } } return oldn - n; } . 42c panic("intrenable: handler: %s %s %luX %luX %luX %luX\n", vctl[vno]->name, v->name, . 35,36c print("intrenable: couldn't enable irq %d, tbdf 0x%uX for %s\n", irq, tbdf, v->name); if(p=vctl[vno]){ print("intrenable: irq %d is already used by", irq); for(; p; p=p->next) print(" %s", p->name); print("\n"); } . 29a strncpy(v->name, name, NAMELEN-1); v->name[NAMELEN-1] = 0; . 22c Vctl *v, *p; . 19c intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name) . ## diffname pc/trap.c 2000/0626 ## diff -e /n/emeliedump/1999/0819/sys/src/brazil/pc/trap.c /n/emeliedump/2000/0626/sys/src/9/pc/trap.c 39,44d 22c Vctl *v; . ## diffname pc/trap.c 2000/0902 ## diff -e /n/emeliedump/2000/0626/sys/src/9/pc/trap.c /n/emeliedump/2000/0902/sys/src/9/pc/trap.c 714a /* * return the userpc the last exception happened at */ . ## diffname pc/trap.c 2000/1018 ## diff -e /n/emeliedump/2000/0902/sys/src/9/pc/trap.c /n/emeliedump/2000/1018/sys/src/9/pc/trap.c 166a addarchfile("irqalloc", 0444, irqallocread, nil); . 65a buf = vbuf; . 59,60c Vctl *v; . 56,57c char *buf, *p, str[11+1+NAMELEN+1]; int m, vno; . 53,54c static long irqallocread(Chan*, void *vbuf, long n, vlong offset) . ## diffname pc/trap.c 2001/0217 ## diff -e /n/emeliedump/2000/1018/sys/src/9/pc/trap.c /n/emeliedump/2001/0217/sys/src/9/pc/trap.c 279c for(i = 0; i < 0; i++){ . ## diffname pc/trap.c 2001/0219 ## diff -e /n/emeliedump/2001/0217/sys/src/9/pc/trap.c /n/emeliedump/2001/0219/sys/src/9/pc/trap.c 279c for(i = 0; i < conf.nmach; i++){ . ## diffname pc/trap.c 2001/0405 ## diff -e /n/emeliedump/2001/0219/sys/src/9/pc/trap.c /n/emeliedump/2001/0405/sys/src/9/pc/trap.c 396,401c print("%.8lux=%.8lux ", l, v); i++; . 393,394c * we could Pick off general CALL (((uchar*)v)[-5] == 0xE8) * and CALL indirect through AX (((uchar*)v)[-2] == 0xFF && ((uchar*)v)[-2] == 0xD0), * but this is too clever and misses faulting address. . ## diffname pc/trap.c 2001/0411 ## diff -e /n/emeliedump/2001/0405/sys/src/9/pc/trap.c /n/emeliedump/2001/0411/sys/src/9/pc/trap.c 490c if(scallnr >= nsyscall || systab[scallnr] == 0){ . 381d ## diffname pc/trap.c 2001/0527 ## diff -e /n/emeliedump/2001/0411/sys/src/9/pc/trap.c /n/emeliedump/2001/0527/sys/src/9/pc/trap.c 676c sp = oureg-4*BY2WD-ERRMAX; . 591,592c sp -= BY2WD+ERRMAX; memmove((char*)sp, up->note[0].msg, ERRMAX); . 581c || !okaddr(sp-ERRMAX-4*BY2WD, sizeof(Ureg)+ERRMAX+4*BY2WD, 1)){ . 555,556c if(l > ERRMAX-15) /* " pc=0x12345678\0" */ l = ERRMAX-15; . 438a if(up == nil) {print("what? up is zero pc %8lux\n", ureg->pc); for(;;);} . 432c char buf[ERRMAX]; . 417c char buf[ERRMAX]; . 279c for(i = 0; i < 32; i++){ . 217c char buf[ERRMAX]; . 103,104c strncpy(v->name, name, KNAMELEN); v->name[KNAMELEN-1] = 0; . 68c m = snprint(str, sizeof str, "%11d %11d %.*s\n", vno, v->irq, KNAMELEN, v->name); . 56c char *buf, *p, str[11+1+KNAMELEN+1]; . 30,31c strncpy(v->name, name, KNAMELEN-1); v->name[KNAMELEN-1] = 0; . ## diffname pc/trap.c 2001/0822 ## diff -e /n/emeliedump/2001/0527/sys/src/9/pc/trap.c /n/emeliedump/2001/0822/sys/src/9/pc/trap.c 504a }else{ /* failure: save the error buffer for errstr */ kstrcpy(up->syserror, up->error, sizeof up->syserror); . ## diffname pc/trap.c 2001/0905 ## diff -e /n/emeliedump/2001/0822/sys/src/9/pc/trap.c /n/emeliedump/2001/0905/sys/src/9/pc/trap.c 52a void intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name) { Vctl **pv, *v; int vno; vno = arch->intrvecno(irq); ilock(&vctllock); pv = &vctl[vno]; while (*pv && ((*pv)->irq != irq || (*pv)->tbdf != tbdf || (*pv)->f != f || (*pv)->a != a || strcmp((*pv)->name, name))) pv = &((*pv)->next); assert(*pv); v = *pv; *pv = (*pv)->next; /* Link out the entry */ if (vctl[vno] == nil) arch->intrdisable(irq); iunlock(&vctllock); xfree(v); } . ## diffname pc/trap.c 2001/0914 ## diff -e /n/emeliedump/2001/0905/sys/src/9/pc/trap.c /n/emeliedump/2001/0914/sys/src/9/pc/trap.c 71c if (vctl[vno] == nil && arch->intrdisable != nil) . 58a /* * For now, none of this will work with the APIC code, * there is no mapping between irq and vector as the IRQ * is pretty meaningless. */ if(arch->intrvecno == nil) return; . ## diffname pc/trap.c 2001/0924 ## diff -e /n/emeliedump/2001/0914/sys/src/9/pc/trap.c /n/emeliedump/2001/0924/sys/src/9/pc/trap.c 538c e = up->syserrstr; up->syserrstr = up->errstr; up->errstr = e; . 496a char *e; . ## diffname pc/trap.c 2001/1130 ## diff -e /n/emeliedump/2001/0924/sys/src/9/pc/trap.c /n/emeliedump/2001/1130/sys/src/9/pc/trap.c 23a if(f == nil){ print("intrenable: nil handler for %d, tbdf 0x%uX for %s\n", irq, tbdf, name); return; } . ## diffname pc/trap.c 2002/0114 ## diff -e /n/emeliedump/2001/1130/sys/src/9/pc/trap.c /n/emeliedump/2002/0114/sys/src/9/pc/trap.c 509c panic("syscall: cs 0x%4.4luX\n", ureg->cs); . ## diffname pc/trap.c 2002/0220 ## diff -e /n/emeliedump/2002/0114/sys/src/9/pc/trap.c /n/emeliedump/2002/0220/sys/src/9/pc/trap.c 476c if(up == nil) panic("what? up is zero pc 0x%8.8lux\n", ureg->pc); . ## diffname pc/trap.c 2002/0327 ## diff -e /n/emeliedump/2002/0220/sys/src/9/pc/trap.c /n/emeliedump/2002/0327/sys/src/9/pc/trap.c 305a /* call all interrupt routines, just in case */ for(i = VectorPIC; i <= MaxIrqLAPIC; i++){ ctl = vctl[i]; if(ctl == nil) continue; if(!ctl->isintr) continue; for(v = ctl; v != nil; v = v->next){ if(v->f) v->f(ureg, v->a); } /* should we do this? */ if(ctl->eoi) ctl->eoi(i); } . ## diffname pc/trap.c 2002/0329 ## diff -e /n/emeliedump/2002/0327/sys/src/9/pc/trap.c /n/emeliedump/2002/0329/sys/src/9/pc/trap.c 306,320c i8259isr(vno); . ## diffname pc/trap.c 2002/0402 ## diff -e /n/emeliedump/2002/0329/sys/src/9/pc/trap.c /n/emeliedump/2002/0402/sys/src/9/pc/trap.c 315a /* call all interrupt routines, just in case */ for(i = VectorPIC; i <= MaxIrqLAPIC; i++){ ctl = vctl[i]; if(ctl == nil) continue; if(!ctl->isintr) continue; for(v = ctl; v != nil; v = v->next){ if(v->f) v->f(ureg, v->a); } /* should we do this? */ if(ctl->eoi) ctl->eoi(i); } /* clear the interrupt */ i8259isr(vno); . 306,307d ## diffname pc/trap.c 2002/0404 ## diff -e /n/emeliedump/2002/0402/sys/src/9/pc/trap.c /n/emeliedump/2002/0404/sys/src/9/pc/trap.c 445c if(up) estack = (ulong)up->kstack+KSTACK; else estack = (ulong)m+MACHSIZE; for(l=(ulong)&l; l= (ulong)m->stack && (ulong)&l <= (ulong)m+BY2PG) . 442c if(up && (ulong)&l >= (ulong)up->kstack && (ulong)&l <= (ulong)up->kstack+KSTACK) . ## diffname pc/trap.c 2002/0417 ## diff -e /n/emeliedump/2002/0412/sys/src/9/pc/trap.c /n/emeliedump/2002/0417/sys/src/9/pc/trap.c 534c int i; ulong scallnr; . ## diffname pc/trap.c 2002/0419 ## diff -e /n/emeliedump/2002/0417/sys/src/9/pc/trap.c /n/emeliedump/2002/0419/sys/src/9/pc/trap.c 579c print("bad errstack [%uld]: %d extra\n", scallnr, up->nerrlab); . 334c if(0)print("cpu%d: spurious interrupt %d, last %d", . ## diffname pc/trap.c 2002/0420 ## diff -e /n/emeliedump/2002/0419/sys/src/9/pc/trap.c /n/emeliedump/2002/0420/sys/src/9/pc/trap.c 289a if(up->nlocks == 0) . ## diffname pc/trap.c 2002/0423 ## diff -e /n/emeliedump/2002/0420/sys/src/9/pc/trap.c /n/emeliedump/2002/0423/sys/src/9/pc/trap.c 290d ## diffname pc/trap.c 2002/0425 ## diff -e /n/emeliedump/2002/0423/sys/src/9/pc/trap.c /n/emeliedump/2002/0425/sys/src/9/pc/trap.c 539a /* check syscall has an empty kernel stack */ if(up->kstack + KSTACK - (char*)ureg > 512) panic("syscall: stack %ld\n", up->kstack + KSTACK - (char*)ureg); . ## diffname pc/trap.c 2002/0426 ## diff -e /n/emeliedump/2002/0425/sys/src/9/pc/trap.c /n/emeliedump/2002/0426/sys/src/9/pc/trap.c 540,543d ## diffname pc/trap.c 2002/0524 ## diff -e /n/emeliedump/2002/0426/sys/src/9/pc/trap.c /n/emeliedump/2002/0524/sys/src/9/pc/trap.c 93c char *buf, *p, str[2*(11+1)+KNAMELEN+1+1]; . ## diffname pc/trap.c 2002/0615 ## diff -e /n/emeliedump/2002/0524/sys/src/9/pc/trap.c /n/emeliedump/2002/0615/sys/src/9/pc/trap.c 821a pexit("kproc dying", 0); . ## diffname pc/trap.c 2002/0820 ## diff -e /n/emeliedump/2002/0615/sys/src/9/pc/trap.c /n/emeliedump/2002/0820/sys/src/9/pc/trap.c 280a if(ctl->isintr && m->havetsc) intrtime(m, vno); . 258c if(m->havetsc) rdtsc(&m->intrts); . 243a * keep histogram of interrupt service times (tops off at 1/100 second) */ void intrtime(Mach *m, int vno) { uvlong now; ulong diff; rdtsc(&now); diff = now - m->intrts; diff /= m->cpumhz; if(diff >= 1000) diff = 999; if(intrtimes[vno] == nil) intrtimes[vno] = xalloc(Ntimevec*sizeof(ulong)); intrtimes[vno][diff]++; } /* . 17a enum { Ntimevec = 1000 /* number of time buckets for each intr */ }; . 16a ulong *intrtimes[256]; . ## diffname pc/trap.c 2002/0821 ## diff -e /n/emeliedump/2002/0820/sys/src/9/pc/trap.c /n/emeliedump/2002/0821/sys/src/9/pc/trap.c 263,264d 60a if(intrtimes[vno] == nil) intrtimes[vno] = xalloc(Ntimevec*sizeof(ulong)); . ## diffname pc/trap.c 2002/0822 ## diff -e /n/emeliedump/2002/0821/sys/src/9/pc/trap.c /n/emeliedump/2002/0822/sys/src/9/pc/trap.c 326a if(ctl->isintr) intrtime(m, vno); . 321a intrtime(m, vno); . 307,308d 283,284c m->perf.intrts = perfticks(); . 263,264c if(diff >= Ntimevec) diff = Ntimevec-1; . 260,261c diff = x - m->perf.intrts; m->perf.intrts = x; m->perf.inintr += diff; if(up == nil && m->perf.inidle > diff) m->perf.inidle -= diff; . 258a ulong x = perfticks(); . 257d 255c intrtime(Mach*, int vno) . 252c * keep histogram of interrupt service times . ## diffname pc/trap.c 2002/0824 ## diff -e /n/emeliedump/2002/0822/sys/src/9/pc/trap.c /n/emeliedump/2002/0824/sys/src/9/pc/trap.c 808a up->fpstate = FPinit; fpoff(); . 733a up->fpstate &= ~FPillegal; . 702c *(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */ . 700c *(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */ . 654a if(user && up->fpstate == FPactive){ fpsave(&up->fpsave); up->fpstate = FPinactive; } up->fpstate |= FPillegal; . ## diffname pc/trap.c 2002/0829 ## diff -e /n/emeliedump/2002/0824/sys/src/9/pc/trap.c /n/emeliedump/2002/0829/sys/src/9/pc/trap.c 655c if(up->fpstate == FPactive){ . ## diffname pc/trap.c 2002/0924 ## diff -e /n/emeliedump/2002/0829/sys/src/9/pc/trap.c /n/emeliedump/2002/0924/sys/src/9/pc/trap.c 537c panic("fault but up is zero; pc 0x%8.8lux addr 0x%8.8lux\n", ureg->pc, addr); . ## diffname pc/trap.c 2002/1216 ## diff -e /n/emeliedump/2002/0924/sys/src/9/pc/trap.c /n/emeliedump/2002/1216/sys/src/9/pc/trap.c 609a if(0 && up->pid == 1) print("syscall %lud error %s\n", scallnr, up->syserrstr); . ## diffname pc/trap.c 2002/1218 ## diff -e /n/emeliedump/2002/1216/sys/src/9/pc/trap.c /n/emeliedump/2002/1218/sys/src/9/pc/trap.c 269a } . 268c if(diff >= Ntimevec){ if (vno == 32) print("timer took %d µs\n", diff); . ## diffname pc/trap.c 2002/1219 ## diff -e /n/emeliedump/2002/1218/sys/src/9/pc/trap.c /n/emeliedump/2002/1219/sys/src/9/pc/trap.c 269d ## diffname pc/trap.c 2003/0228 ## diff -e /n/emeliedump/2002/1219/sys/src/9/pc/trap.c /n/emeliedump/2003/0228/sys/src/9/pc/trap.c 331,332d 326,329c if(up && ctl->irq != IrqTIMER && ctl->irq != IrqCLOCK) preempted(); . 313,324c if(ctl->isintr){ .