| plan 9 kernel history: overview | file list | diff list |
1993/0915/pc/trap.c (diff list | history)
| 1993/0225/sys/src/9/pc/trap.c:98,109 – 1993/0915/sys/src/9/pc/trap.c:98,109 (short | long | prev | next) | ||
| 1991/1112 | { char buf[ERRLEN]; | |
| 1993/0915 | if(up == 0) | |
| 1991/1112 | panic("kernel bpt"); /* restore pc to instruction that caused the trap */ ur->pc--; | |
| 1991/1218 | sprint(buf, "sys: breakpoint"); | |
| 1991/1112 |
| |
| 1993/0915 | postnote(up->p, 1, buf, NDebug); | |
| 1991/1112 | } | |
| 1991/0614 | /* | |
| 1993/0225/sys/src/9/pc/trap.c:218,223 – 1993/0915/sys/src/9/pc/trap.c:218,226 | ||
| 1991/1113 | [13] "general protection violation", }; | |
| 1993/0915 | Ureg lasttrap, *lastur; | |
| 1991/0614 | /* | |
| 1991/0703 | * All traps | |
| 1991/0614 | */ | |
| 1993/0225/sys/src/9/pc/trap.c:233,239 – 1993/0915/sys/src/9/pc/trap.c:236,242 | ||
| 1991/0731 | ||
| 1991/1112 | user = ((ur->cs)&0xffff)!=KESEL && v!=Syscallvec; if(user) | |
| 1993/0915 | up->dbgreg = ur; | |
| 1991/1112 | ||
| 1991/0709 | /* * tell the 8259 that we're done with the | |
| 1993/0225/sys/src/9/pc/trap.c:248,253 – 1993/0915/sys/src/9/pc/trap.c:251,258 | ||
| 1991/1113 | } | |
| 1993/0217 | if(v>=256 || (h = halloc.ivec[v]) == 0){ | |
| 1993/0915 | lasttrap = *ur; lastur = ur; | |
| 1993/0224 | /* an old 386 generates these fairly often, no idea why */ | |
| 1991/1214 | if(v == 13) return; | |
| 1993/0225/sys/src/9/pc/trap.c:256,262 – 1993/0915/sys/src/9/pc/trap.c:261,267 | ||
| 1991/1113 | if(v <= 16){ if(user){ | |
| 1991/1218 | sprint(buf, "sys: trap: %s", excname[v]); | |
| 1991/1113 |
| |
| 1993/0915 | postnote(up->p, 1, buf, NDebug); | |
| 1991/1113 | return; } else { dumpregs(ur); | |
| 1993/0225/sys/src/9/pc/trap.c:267,273 – 1993/0915/sys/src/9/pc/trap.c:272,278 | ||
| 1993/0224 | if(v >= Int0vec || v < Int0vec+16){ /* an unknown interrupts */ v -= Int0vec; | |
| 1993/0915 | if(badintr[v]++ == 0 || (badintr[v]%100000) == 0) | |
| 1993/0224 | print("unknown interrupt %d pc=0x%lux: total %d\n", v, ur->pc, badintr[v]); } else { | |
| 1993/0225/sys/src/9/pc/trap.c:284,291 – 1993/0915/sys/src/9/pc/trap.c:289,299 | ||
| 1993/0217 | } while(h); | |
| 1991/0910 | ||
| 1993/0224 | /* check user since syscall does its own notifying */ | |
| 1992/0104 |
| |
| 1993/0915 | splhi(); if(user && (up->procctl || up->nnote)) | |
| 1991/0910 | notify(ur); | |
| 1993/0915 | lasttrap = *ur; lastur = ur; | |
| 1991/0806 | } /* | |
| 1993/0225/sys/src/9/pc/trap.c:292,304 – 1993/0915/sys/src/9/pc/trap.c:300,312 | ||
| 1991/0718 | * dump registers */ void | |
| 1993/0915 | dumpregs2(Ureg *ur) | |
| 1991/0718 | { | |
| 1993/0915 | if(up) print("registers for %s %d\n", up->text, up->pid); | |
| 1991/0718 | else print("registers for kernel\n"); | |
| 1991/1214 |
| |
| 1993/0915 | print("FLAGS=%lux TRAP=%lux ECODE=%lux CS=%lux PC=%lux", ur->flags, ur->trap, | |
| 1991/1214 | ur->ecode, ur->cs&0xff, ur->pc); if(ur == (Ureg*)UREGADDR) print(" SS=%lux USP=%lux\n", ur->ss&0xff, ur->usp); | |
| 1993/0225/sys/src/9/pc/trap.c:310,328 – 1993/0915/sys/src/9/pc/trap.c:318,346 | ||
| 1991/1214 | 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); | |
| 1993/0915 | ||
| 1991/0718 | } | |
| 1991/0720 | void | |
| 1993/0915 | dumpregs(Ureg *ur) { dumpregs2(ur); print(" ur %lux\n", ur); dumpregs2(&lasttrap); print(" lastur %lux\n", lastur); } void | |
| 1991/0720 | dumpstack(void) { | |
| 1992/0804 | ulong l, v, i; extern ulong etext; | |
| 1993/0915 | if(up == 0) | |
| 1992/0804 | return; i = 0; | |
| 1993/0915 | for(l=(ulong)&l; l<up->kstack+BY2PG; l+=4){ | |
| 1992/0804 | v = *(ulong*)l; if(KTZERO < v && v < (ulong)&etext){ print("%lux ", v); | |
| 1993/0225/sys/src/9/pc/trap.c:369,399 – 1993/0915/sys/src/9/pc/trap.c:387,417 | ||
| 1991/0720 | long ret; int i; | |
| 1991/0718 |
| |
| 1993/0915 | up->insyscall = 1; up->pc = ur->pc; | |
| 1991/0720 | if((ur->cs)&0xffff == KESEL) panic("recursive system call"); | |
| 1991/0718 | ||
| 1992/06271 |
| |
| 1992/0805 |
| |
| 1993/0915 | up->scallnr = ur->ax; if(up->scallnr == RFORK && up->fpstate == FPactive){ | |
| 1992/0805 | /* * so that the child starts out with the * same registers as the parent */ splhi(); | |
| 1993/0915 | if(up->fpstate == FPactive){ fpsave(&up->fpsave); up->fpstate = FPinactive; | |
| 1992/0805 | } spllo(); } | |
| 1991/0720 | sp = ur->usp; | |
| 1993/0915 | up->nerrlab = 0; | |
| 1991/0720 | ret = -1; if(!waserror()){ | |
| 1992/06271 |
| |
| 1991/0720 |
| |
| 1993/0915 | 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); | |
| 1991/0720 | error(Ebadarg); } | |
| 1992/0625 | ||
| 1993/0225/sys/src/9/pc/trap.c:400,420 – 1993/0915/sys/src/9/pc/trap.c:418,438 | ||
| 1991/0720 | if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-(1+MAXSYSARG)*BY2WD)) validaddr(sp, (1+MAXSYSARG)*BY2WD, 0); | |
| 1992/0625 |
| |
| 1992/06271 |
| |
| 1993/0915 | up->s = *((Sargs*)(sp+1*BY2WD)); up->psstate = sysctab[up->scallnr]; | |
| 1992/0625 | ||
| 1992/06271 |
| |
| 1993/0915 | ret = (*systab[up->scallnr])(up->s.args); | |
| 1991/0720 | poperror(); } | |
| 1992/06271 |
| |
| 1993/0915 | if(up->nerrlab){ print("bad errstack [%d]: %d extra\n", up->scallnr, up->nerrlab); | |
| 1991/0720 | for(i = 0; i < NERR; i++) | |
| 1993/0915 | print("sp=%lux pc=%lux\n", up->errlab[i].sp, up->errlab[i].pc); | |
| 1991/0720 | panic("error stack"); } | |
| 1991/1114 | ||
| 1991/0720 |
| |
| 1991/0926 |
| |
| 1993/0915 | up->insyscall = 0; up->psstate = 0; | |
| 1992/0609 | /* * Put return value in frame. On the safari the syscall is | |
| 1993/0225/sys/src/9/pc/trap.c:424,434 – 1993/0915/sys/src/9/pc/trap.c:442,452 | ||
| 1992/0609 | */ | |
| 1991/0801 | ur->ax = ret; | |
| 1992/0609 | ||
| 1992/06271 |
| |
| 1993/0915 | if(up->scallnr == NOTED) | |
| 1991/0720 | noted(ur, *(ulong*)(sp+BY2WD)); | |
| 1991/1114 | ||
| 1992/0103 | splhi(); /* avoid interrupts during the iret */ | |
| 1992/06271 |
| |
| 1993/0915 | if(up->scallnr!=RFORK && (up->procctl || up->nnote)) | |
| 1991/0720 | notify(ur); | |
| 1992/0804 | ||
| 1991/0720 | return ret; | |
| 1993/0225/sys/src/9/pc/trap.c:445,459 – 1993/0915/sys/src/9/pc/trap.c:463,477 | ||
| 1991/1114 | ulong s, sp; | |
| 1991/1218 | Note *n; | |
| 1991/0720 | ||
| 1991/1112 |
| |
| 1992/0108 |
| |
| 1993/0915 | if(up->procctl) procctl(up->p); if(up->nnote == 0) | |
| 1992/0108 | return 0; | |
| 1991/1114 | s = spllo(); | |
| 1991/1216 |
| |
| 1991/0727 |
| |
| 1991/1218 |
| |
| 1993/0915 | qlock(&up->debug); up->notepending = 0; n = &up->note[0]; | |
| 1991/1218 | if(strncmp(n->msg, "sys:", 4) == 0){ l = strlen(n->msg); if(l > ERRLEN-15) /* " pc=0x12345678\0" */ | |
| 1993/0225/sys/src/9/pc/trap.c:460,505 – 1993/0915/sys/src/9/pc/trap.c:478,523 | ||
| 1991/1218 | l = ERRLEN-15; sprint(n->msg+l, " pc=0x%.8lux", ur->pc); } | |
| 1993/0915 | if(n->flag!=NUser && (up->notified || up->notify==0)){ qunlock(&up->debug); | |
| 1992/0714 | if(n->flag == NDebug) | |
| 1991/1218 | pprint("suicide: %s\n", n->msg); | |
| 1991/1216 |
| |
| 1991/1218 | pexit(n->msg, n->flag!=NDebug); | |
| 1991/0720 | } | |
| 1992/0124 | sent = 0; | |
| 1991/0720 |
| |
| 1992/1203 |
| |
| 1993/0915 | if(!up->notified){ if(!up->notify){ qunlock(&up->debug); | |
| 1992/1203 | pexit(n->msg, n->flag!=NDebug); } | |
| 1992/0124 | sent = 1; | |
| 1991/0720 |
| |
| 1993/0915 | up->svcs = ur->cs; up->svss = ur->ss; up->svflags = ur->flags; | |
| 1991/0720 | sp = ur->usp; sp -= sizeof(Ureg); | |
| 1992/0616 |
| |
| 1993/0915 | if(!okaddr((ulong)up->notify, 1, 0) | |
| 1992/0616 | || !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0)){ | |
| 1993/0915 | qunlock(&up->debug); | |
| 1992/0616 | pprint("suicide: bad address in notify\n"); | |
| 1991/1216 |
| |
| 1991/0722 | pexit("Suicide", 0); } | |
| 1991/0720 |
| |
| 1993/0915 | up->ureg = (void*)sp; | |
| 1991/0720 | memmove((Ureg*)sp, ur, sizeof(Ureg)); sp -= ERRLEN; | |
| 1993/0915 | memmove((char*)sp, up->note[0].msg, ERRLEN); | |
| 1991/0720 | sp -= 3*BY2WD; *(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */ | |
| 1993/0915 | *(ulong*)(sp+1*BY2WD) = (ulong)up->ureg; /* arg 1 is ureg* */ | |
| 1991/0720 | *(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */ ur->usp = sp; | |
| 1993/0915 | 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)); | |
| 1991/0720 | } | |
| 1991/1216 |
| |
| 1993/0915 | qunlock(&up->debug); | |
| 1991/1114 | splx(s); | |
| 1992/0124 | return sent; | |
| 1991/0710 | } | |
| 1993/0225/sys/src/9/pc/trap.c:512,554 – 1993/0915/sys/src/9/pc/trap.c:530,572 | ||
| 1991/0710 | { | |
| 1991/0720 | Ureg *nur; | |
| 1992/0609 |
| |
| 1991/0720 |
| |
| 1991/0802 |
| |
| 1993/0915 | nur = up->ureg; /* pointer to user returned Ureg struct */ if(nur->cs!=up->svcs || nur->ss!=up->svss || (nur->flags&0xff00)!=(up->svflags&0xff00)){ | |
| 1991/0720 | pprint("bad noted ureg cs %ux ss %ux flags %ux\n", nur->cs, nur->ss, nur->flags); | |
| 1991/0814 | Die: | |
| 1991/0720 | pexit("Suicide", 0); } | |
| 1991/1216 |
| |
| 1991/0720 |
| |
| 1993/0915 | qlock(&up->debug); if(!up->notified){ | |
| 1991/0814 | pprint("call to noted() when not notified\n"); | |
| 1991/1216 |
| |
| 1993/0915 | qunlock(&up->debug); | |
| 1991/0720 | return; } | |
| 1992/0609 |
| |
| 1993/0915 | up->notified = 0; nur->flags = (up->svflags&0xffffff00) | (nur->flags&0xff); | |
| 1992/0609 | memmove(ur, nur, sizeof(Ureg)); | |
| 1991/0720 | switch(arg0){ case NCONT: | |
| 1992/0616 | if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){ | |
| 1991/0814 | pprint("suicide: trap in noted\n"); | |
| 1991/1216 |
| |
| 1993/0915 | qunlock(&up->debug); | |
| 1991/0814 | goto Die; } | |
| 1991/1216 |
| |
| 1993/0915 | qunlock(&up->debug); | |
| 1991/0722 | return; | |
| 1991/0720 | default: pprint("unknown noted arg 0x%lux\n", arg0); | |
| 1993/0915 | up->lastnote.flag = NDebug; | |
| 1991/0720 | /* fall through */ case NDFLT: | |
| 1991/1216 |
| |
| 1991/0720 |
| |
| 1993/0915 | if(up->lastnote.flag == NDebug) pprint("suicide: %s\n", up->lastnote.msg); qunlock(&up->debug); pexit(up->lastnote.msg, up->lastnote.flag!=NDebug); | |
| 1991/0720 | } | |
| 1991/1112 | } | |