| plan 9 kernel history: overview | file list | diff list |
1993/1113/pc/trap.c (diff list | history)
| 1993/1022/sys/src/9/pc/trap.c:219,224 – 1993/1113/sys/src/9/pc/trap.c:219,225 (short | long | prev | next) | ||
| 1991/1113 | }; | |
| 1993/0915 | Ureg lasttrap, *lastur; | |
| 1993/1113 | Proc *lastup; | |
| 1993/0915 | ||
| 1991/0614 | /* | |
| 1993/1022/sys/src/9/pc/trap.c:234,243 – 1993/1113/sys/src/9/pc/trap.c:235,251 | ||
| 1991/0703 | ||
| 1991/0731 | v = ur->trap; | |
| 1991/1112 |
| |
| 1993/1113 | user = (ur->cs&0xffff) == UESEL; | |
| 1991/1112 | if(user) | |
| 1993/0915 | up->dbgreg = ur; | |
| 1991/1112 | ||
| 1993/1113 | ur->cs &= 0xffff; ur->ds &= 0xffff; ur->es &= 0xffff; ur->fs &= 0xffff; ur->gs &= 0xffff; if(user) ur->ss &= 0xffff; | |
| 1991/0709 | /* * tell the 8259 that we're done with the | |
| 1991/0801 | * highest level interrupt (interrupts are still | |
| 1993/1022/sys/src/9/pc/trap.c:253,258 – 1993/1113/sys/src/9/pc/trap.c:261,267 | ||
| 1993/0217 | if(v>=256 || (h = halloc.ivec[v]) == 0){ | |
| 1993/0915 | lasttrap = *ur; lastur = ur; | |
| 1993/1113 | lastup = up; | |
| 1993/0224 | /* an old 386 generates these fairly often, no idea why */ | |
| 1991/1214 | if(v == 13) return; | |
| 1993/1022/sys/src/9/pc/trap.c:292,297 – 1993/1113/sys/src/9/pc/trap.c:301,308 | ||
| 1993/0915 | splhi(); if(user && (up->procctl || up->nnote)) | |
| 1991/0910 | notify(ur); | |
| 1993/1113 | lastup = up; | |
| 1993/0915 | lasttrap = *ur; lastur = ur; | |
| 1991/0806 | } | |
| 1993/1022/sys/src/9/pc/trap.c:307,320 – 1993/1113/sys/src/9/pc/trap.c:318,331 | ||
| 1991/0718 | else print("registers for kernel\n"); | |
| 1993/0915 | print("FLAGS=%lux TRAP=%lux ECODE=%lux CS=%lux PC=%lux", ur->flags, ur->trap, | |
| 1991/1214 |
| |
| 1993/1013 |
| |
| 1993/1113 | ur->ecode, ur->cs, ur->pc); print(" SS=%lux USP=%lux\n", ur->ss, ur->usp); | |
| 1991/0718 | print(" AX %8.8lux BX %8.8lux CX %8.8lux DX %8.8lux\n", ur->ax, ur->bx, ur->cx, ur->dx); | |
| 1991/1214 | print(" SI %8.8lux DI %8.8lux BP %8.8lux\n", ur->si, ur->di, ur->bp); | |
| 1993/1113 | print(" DS %4.4lux ES %4.4lux FS %4.4lux GS %4.4lux\n", ur->ds, ur->es, ur->fs, ur->gs); | |
| 1993/0915 | ||
| 1991/0718 | } | |
| 1993/1022/sys/src/9/pc/trap.c:321,330 – 1993/1113/sys/src/9/pc/trap.c:332,348 | ||
| 1991/0720 | void | |
| 1993/0915 | dumpregs(Ureg *ur) { | |
| 1993/1113 | ulong *x; x = (ulong*)(ur+1); | |
| 1993/0915 | dumpregs2(ur); | |
| 1993/1113 | print(" magic %lux %lux %lux\n", x[0], x[1], x[2]); print(" ur %lux up %lux\n", ur, up); | |
| 1993/0915 | dumpregs2(&lasttrap); | |
| 1993/1113 | print(" lastur %lux lastup %lux\n", lastur); splhi(); dumpstack(); for(;;); | |
| 1993/0915 | } void | |
| 1993/1022/sys/src/9/pc/trap.c:332,380 – 1993/1113/sys/src/9/pc/trap.c:350,377 | ||
| 1991/0720 | { | |
| 1992/0804 | ulong l, v, i; extern ulong etext; | |
| 1993/1113 | int lim; | |
| 1992/0804 | ||
| 1993/0915 | if(up == 0) | |
| 1992/0804 | return; i = 0; | |
| 1993/1013 |
| |
| 1993/1113 | lim = 3; for(l=(ulong)&l; l<(ulong)(up->kstack+BY2PG) && lim; l+=4){ | |
| 1992/0804 | v = *(ulong*)l; if(KTZERO < v && v < (ulong)&etext){ print("%lux ", v); i++; } | |
| 1993/1113 | if(i == 8){ | |
| 1992/0804 | i = 0; print("\n"); | |
| 1993/1113 | lim--; | |
| 1992/0804 | } } | |
| 1991/0720 | } | |
| 1991/1214 |
| |
| 1991/0720 |
| |
| 1991/1214 |
| |
| 1993/1013 |
| |
| 1991/1214 |
| |
| 1993/1013 |
| |
| 1991/1214 |
| |
| 1991/0720 |
| |
| 1992/0120 |
| |
| 1993/1013 |
| |
| 1992/0120 |
| |
| 1991/0718 | /* | |
| 1991/0710 | * system calls */ | |
| 1993/1022/sys/src/9/pc/trap.c:573,578 – 1993/1113/sys/src/9/pc/trap.c:570,599 | ||
| 1991/0720 | } | |
| 1991/1112 | } | |
| 1993/1113 | 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; } | |
| 1991/1112 | /* 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 */ | |
| 1993/1022/sys/src/9/pc/trap.c:590,595 – 1993/1113/sys/src/9/pc/trap.c:611,655 | ||
| 1991/1112 | xp->flags = (xp->flags & 0xff) | (flags & 0xff00); xp->cs = cs; xp->ss = ss; | |
| 1993/1113 | } 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; | |
| 1991/0614 | } | |
| 1993/1022 | /* Give enough context in the ureg to produce a kernel stack for | |