| plan 9 kernel history: overview | file list | diff list |
1999/0128/mpc/trap.c (diff list | history)
| 1999/0127/sys/src/9/mpc/trap.c:33,38 – 1999/0128/sys/src/9/mpc/trap.c:33,39 (short | long | prev | next) | ||
| 1999/0123 | ||
| 1999/0127 | void faultpower(Ureg *ur, ulong addr, int read); | |
| 1999/0123 | void kernfault(Ureg*, int); | |
| 1999/0128 | void syscall(Ureg* ureg); | |
| 1999/0123 | char *excname[] = { | |
| 1999/0127/sys/src/9/mpc/trap.c:179,189 – 1999/0128/sys/src/9/mpc/trap.c:180,186 | ||
| 1999/0123 | break; | |
| 1999/0127 | case CSYSCALL: | |
| 1999/0128 | syscall(ur); | |
| 1999/0127 | break; | |
| 1999/0123 | case CPROG: | |
| 1999/0127/sys/src/9/mpc/trap.c:214,220 – 1999/0128/sys/src/9/mpc/trap.c:211,217 | ||
| 1999/0127 | char buf[ERRLEN]; user = (ureg->srr1 & MSR_PR) != 0; | |
| 1999/0128 | //print("fault: pc = %ux, addr = %ux read = %d user = %d stack=%ux\n", ureg->pc, addr, read, user, &ureg); | |
| 1999/0127 | insyscall = up->insyscall; up->insyscall = 1; spllo(); | |
| 1999/0127/sys/src/9/mpc/trap.c:229,235 – 1999/0128/sys/src/9/mpc/trap.c:226,231 | ||
| 1999/0127 | postnote(up, 1, buf, NDebug); } up->insyscall = insyscall; | |
| 1999/0127/sys/src/9/mpc/trap.c:540,548 – 1999/0128/sys/src/9/mpc/trap.c:536,543 | ||
| 1999/0123 | cur = (Ureg*)(p->sched.sp+2*BY2WD); memmove(cur, ur, sizeof(Ureg)); | |
| 1999/0128 | cur->r3 = 0; | |
| 1999/0123 | /* Things from bottom of syscall we never got to execute */ p->psstate = 0; p->insyscall = 0; | |
| 1999/0127/sys/src/9/mpc/trap.c:558,569 – 1999/0128/sys/src/9/mpc/trap.c:553,558 | ||
| 1999/0123 | } | |
| 1999/0127/sys/src/9/mpc/trap.c:598,601 – 1999/0128/sys/src/9/mpc/trap.c:587,664 | ||
| 1999/0123 | return 0; return ureg->pc; | |
| 1999/0128 | } /* * system calls */ #include "../port/systab.h" /* * Syscall should be called directly from assembler without going through trap(). */ void syscall(Ureg* ureg) { ulong sp; long ret; int i, scallnr; if((ureg->srr1 & MSR_PR) == 0) panic("syscall: srr1 0x%4.4uX\n", ureg->srr1); m->syscall++; up->insyscall = 1; up->pc = ureg->pc; up->dbgreg = ureg; scallnr = ureg->r3; //print("scall %s\n", sysctab[scallnr]); up->scallnr = scallnr; spllo(); sp = ureg->usp; up->nerrlab = 0; ret = -1; if(!waserror()){ if(scallnr >= nsyscall){ pprint("bad sys call number %d pc %lux\n", scallnr, ureg->pc); postnote(up, 1, "sys: bad sys call", NDebug); error(Ebadarg); } if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-sizeof(Sargs)-BY2WD)) validaddr(sp, sizeof(Sargs)+BY2WD, 0); up->s = *((Sargs*)(sp+BY2WD)); up->psstate = sysctab[scallnr]; ret = systab[scallnr](up->s.args); poperror(); } if(up->nerrlab){ print("bad errstack [%d]: %d extra\n", scallnr, up->nerrlab); for(i = 0; i < NERR; i++) print("sp=%lux pc=%lux\n", up->errlab[i].sp, up->errlab[i].pc); panic("error stack"); } up->insyscall = 0; up->psstate = 0; /* * Put return value in frame. On the x86 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. */ ureg->r3 = ret; //print("ret = %d\n", ret); // if(scallnr == NOTED) // noted(ureg, *(ulong*)(sp+BY2WD)); // if(scallnr!=RFORK && (up->procctl || up->nnote)){ // splhi(); // notify(ureg); // } | |
| 1999/0122 | } | |