| plan 9 kernel history: overview | file list | diff list |
2002/0417/alphapc/trap.c (diff list | history)
| 2001/1121/sys/src/9/alphapc/trap.c:682,691 – 2002/0417/sys/src/9/alphapc/trap.c:682,693 (short | long | prev | next) | ||
| 1999/0415 | long syscall(Ureg *aur) { | |
| 2002/0417 | int i; | |
| 2001/0924 | char *e; | |
| 1999/0415 | long ret; ulong sp; Ureg *ur; | |
| 2002/0417 | ulong scallnr; | |
| 1999/0415 | m->syscall++; up = m->proc; | |
| 2001/1121/sys/src/9/alphapc/trap.c:695,703 – 2002/0417/sys/src/9/alphapc/trap.c:697,706 | ||
| 1999/0415 | up->dbgreg = aur; ur->type = 5; /* for debugging */ | |
| 2002/0417 | scallnr = ur->r0; | |
| 1999/0515 | up->scallnr = ur->r0; | |
| 2002/0417 | if(scallnr == RFORK && up->fpstate == FPactive){ | |
| 1999/0515 | savefpregs(&up->fpsave); up->fpstate = FPinactive; //print("SR=%lux+", up->fpsave.fpstatus); | |
| 2001/1121/sys/src/9/alphapc/trap.c:707,752 – 2002/0417/sys/src/9/alphapc/trap.c:710,757 | ||
| 1999/0415 | sp = ur->sp; | |
| 1999/0515 | up->nerrlab = 0; | |
| 1999/0415 | ret = -1; | |
| 2002/0417 | if(!waserror()) { if(scallnr >= nsyscall || systab[scallnr] == nil){ pprint("bad sys call %d pc %lux\n", up->scallnr, (ulong)ur->pc); postnote(up, 1, "sys: bad sys call", NDebug); error(Ebadarg); } | |
| 1999/0415 |
| |
| 1999/0515 |
| |
| 1999/0415 |
| |
| 2002/0417 | if(sp & (BY2WD-1)){ /* XXX too weak? */ pprint("odd sp in sys call pc %lux sp %lux\n", (ulong)ur->pc, (ulong)ur->sp); postnote(up, 1, "sys: odd stack", NDebug); error(Ebadarg); } | |
| 1999/0415 |
| |
| 1999/0515 |
| |
| 1999/0415 |
| |
| 2002/0417 | if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-sizeof(Sargs))) validaddr(sp, sizeof(Sargs), 0); up->s = *((Sargs*)(sp+2*BY2WD)); up->psstate = sysctab[scallnr]; ret = systab[scallnr](up->s.args); poperror(); }else{ /* failure: save the error buffer for errstr */ e = up->syserrstr; up->syserrstr = up->errstr; up->errstr = e; | |
| 1999/0415 | } | |
| 2002/0417 | if(up->nerrlab){ print("bad errstack [%uld]: %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"); } | |
| 1999/0415 |
| |
| 2001/0822 |
| |
| 2001/0924 |
| |
| 1999/0415 | up->nerrlab = 0; up->psstate = 0; up->insyscall = 0; | |
| 1999/0515 |
| |
| 2002/0417 | if(scallnr == NOTED) /* ugly hack */ | |
| 1999/0415 | noted(ur, &aur, *(ulong*)(sp+2*BY2WD)); /* doesn't return */ | |
| 2002/0417 | if(scallnr!=RFORK && (up->procctl || up->nnote)){ | |
| 1999/0415 | ur->r0 = ret; /* load up for noted() */ if(notify(ur)) return ur->r0; | |