| plan 9 kernel history: overview | file list | diff list |
1990/1226/ss/trap.c (diff list | history)
| 1990/1223/sys/src/9/ss/trap.c:11,82 – 1990/1226/sys/src/9/ss/trap.c:11,54 (short | long | prev | next) | ||
| 1990/1223 | void noted(Ureg**); void rfnote(Ureg**); | |
| 1990/1226 | extern void traplink(void); extern void syslink(void); | |
| 1990/1223 | long ticks; char *trapname[]={ | |
| 1990/1226 | "reset", "instruction access exception", | |
| 1990/1223 | "illegal instruction", | |
| 1990/1226 | "privileged instruction", "fp disabled", "window overflow", "window underflow", "unaligned address", "fp exception", "data access exception", "tag overflow", | |
| 1990/1223 | }; char* | |
| 1990/1226 | excname(ulong tbr) | |
| 1990/1223 | { static char buf[32]; /* BUG: not reentrant! */ | |
| 1990/1226 | tbr &= 0xFFF; tbr >>= 4; if(tbr < sizeof trapname/sizeof(char*)) return trapname[tbr]; if(tbr == 36) return "cp disabled"; if(tbr == 40) return "cp exception"; if(tbr >= 128) sprint(buf, "trap instruction %d", tbr-128); else if(17<=tbr && tbr<=31) sprint(buf, "interrupt level %d", tbr-16); else sprint(buf, "unknown trap %d", tbr); | |
| 1990/1223 | return buf; } | |
| 1990/1223/sys/src/9/ss/trap.c:86,101 – 1990/1226/sys/src/9/ss/trap.c:58,77 | ||
| 1990/1223 | int user; char buf[64]; | |
| 1990/1226 | user = !(ur->psr&PSRPSUPER); /* if(u) | |
| 1990/1223 | u->p->pc = ur->pc; /* BUG */ if(user){ | |
| 1990/1226 | print("user trap: %s pc=0x%lux\n", excname(ur->tbr), ur->pc); dumpregs(ur); for(;;); sprint(buf, "sys: trap: pc=0x%lux %s", ur->pc, excname(ur->tbr)); | |
| 1990/1223 | postnote(u->p, 1, buf, NDebug); }else{ | |
| 1990/1226 | print("kernel trap: %s pc=0x%lux\n", excname(ur->tbr), ur->pc); | |
| 1990/1223 | dumpregs(ur); | |
| 1990/1226 | for(;;); | |
| 1990/1223 | exit(); } if(user && u->nnote) | |
| 1990/1223/sys/src/9/ss/trap.c:103,108 – 1990/1226/sys/src/9/ss/trap.c:79,110 | ||
| 1990/1223 | } void | |
| 1990/1226 | trapinit(void) { int i; long t, a; a = ((ulong)traplink-TRAPS)>>2; a += 0x40000000; /* CALL traplink(SB) */ t = TRAPS; for(i=0; i<256; i++){ *(ulong*)t = a; /* CALL traplink(SB) */ *(ulong*)(t+4) = 0xa7480000; /* MOVW PSR, R19 */ a -= 16/4; t += 16; } /* * Vector 128 goes directly to syslink */ t = TRAPS+128*16; a = ((ulong)syslink-t)>>2; a += 0x40000000; *(ulong*)t = a; /* CALL syscall(SB) */ *(ulong*)(t+4) = 0xa7480000; /* MOVW PSR, R19 */ puttbr(TRAPS); } void | |
| 1990/1223 | dumpstack(void) { ulong l, v; | |
| 1990/1223/sys/src/9/ss/trap.c:126,135 – 1990/1226/sys/src/9/ss/trap.c:128,137 | ||
| 1990/1223 | print("registers for %s %d\n", u->p->text, u->p->pid); else print("registers for kernel\n"); | |
| 1990/1226 | print("PSR=%ux PC=%lux TBR=%lux\n", ur->psr, ur->pc, ur->tbr); | |
| 1990/1223 | l = &ur->r0; | |
| 1990/1226 | for(i=0; i<32; i+=2, l+=2) print("R%d\t%.8lux\tR%d\t%.8lux\n", i, l[0], i+1, l[1]); | |
| 1990/1223 | dumpstack(); } | |
| 1990/1223/sys/src/9/ss/trap.c:194,200 – 1990/1226/sys/src/9/ss/trap.c:196,202 | ||
| 1990/1223 | } #undef CHDIR /* BUG */ | |
| 1990/1226 | #include "/sys/src/libc/sparc9sys/sys.h" | |
| 1990/1223 | typedef long Syscall(ulong*); Syscall sysr1, sysfork, sysexec, sysgetpid, syssleep, sysexits, sysdeath, syswait; | |
| 1990/1223/sys/src/9/ss/trap.c:241,247 – 1990/1226/sys/src/9/ss/trap.c:243,249 | ||
| 1990/1223 | { long ret; ulong sp; | |
| 1990/1226 | ulong r7; | |
| 1990/1223 | Ureg *ur; char *msg; | |
| 1990/1223/sys/src/9/ss/trap.c:248,261 – 1990/1226/sys/src/9/ss/trap.c:250,263 | ||
| 1990/1223 | u->p->insyscall = 1; ur = aur; u->p->pc = ur->pc; | |
| 1990/1226 | if(ur->psr & PSRPSUPER) | |
| 1990/1223 | panic("recursive system call"); | |
| 1990/1226 | #ifdef asdf | |
| 1990/1223 | /* * since the system call interface does not * guarantee anything about registers, but the fpcr is more than * just a register... BUG */ | |
| 1990/1223/sys/src/9/ss/trap.c:262,276 – 1990/1226/sys/src/9/ss/trap.c:264,279 | ||
| 1990/1223 | u->p->fpstate = FPinit; m->fpstate = FPinit; } | |
| 1990/1226 | #endif | |
| 1990/1223 | spllo(); | |
| 1990/1226 | r7 = ur->r7; | |
| 1990/1223 | sp = ur->usp; u->nerrlab = 0; ret = -1; if(!waserror()){ | |
| 1990/1226 | if(r7 >= sizeof systab/BY2WD){ pprint("bad sys call number %d pc %lux\n", r7, ((Ureg*)UREGADDR)->pc); | |
| 1990/1223 | msg = "sys: bad sys call"; Bad: postnote(u->p, 1, msg, NDebug); | |
| 1990/1223/sys/src/9/ss/trap.c:283,299 – 1990/1226/sys/src/9/ss/trap.c:286,311 | ||
| 1990/1223 | } if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-5*BY2WD)) validaddr(sp, 5*BY2WD, 0); | |
| 1990/1226 | ret = (*systab[r7])((ulong*)(sp+2*BY2WD)); | |
| 1990/1223 | } | |
| 1990/1226 | ur->pc += 4; ur->npc = ur->pc+4; | |
| 1990/1223 | u->nerrlab = 0; u->p->insyscall = 0; | |
| 1990/1226 | if(r7 == NOTED) /* ugly hack */ | |
| 1990/1223 | noted(&aur); /* doesn't return */ if(u->nnote){ | |
| 1990/1226 | ur->r7 = ret; | |
| 1990/1223 | notify(ur); } return ret; | |
| 1990/1226 | } void execpc(ulong entry) { ((Ureg*)UREGADDR)->pc = entry - 4; /* syscall advances it */ ((Ureg*)UREGADDR)->npc = entry; | |
| 1990/1223 | } #include "errstr.h" | |