| plan 9 kernel history: overview | file list | diff list |
1990/1211/port/sysproc.c (diff list | history)
| 1990/1124/sys/src/9/port/sysproc.c:41,46 – 1990/1211/sys/src/9/port/sysproc.c:41,47 (short | long | prev | next) | ||
|
Created.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | /* * Save time: only copy u-> data and useful stack */ | |
| 1990/1211 | clearmmucache(); | |
| 1990/0227 | memcpy((void*)upa, u, sizeof(User)); n = USERADDR+BY2PG - (ulong)&lastvar; n = (n+32) & ~(BY2WD-1); /* be safe & word align */ | |
| 1990/1124/sys/src/9/port/sysproc.c:114,119 – 1990/1211/sys/src/9/port/sysproc.c:115,121 | ||
| 1990/0227 | * Sched */ if(setlabel(&p->sched)){ | |
| 1990/1211 | clearmmucache(); | |
| 1990/0227 | u->p = p; p->state = Running; p->mach = m; | |
| 1990/1124/sys/src/9/port/sysproc.c:132,137 – 1990/1211/sys/src/9/port/sysproc.c:134,140 | ||
| 1990/0227 | memcpy(p->text, u->p->text, NAMELEN); ready(p); flushmmu(); | |
| 1990/1211 | clearmmucache(); | |
| 1990/0227 | return pid; } | |
| 1990/1124/sys/src/9/port/sysproc.c:147,153 – 1990/1211/sys/src/9/port/sysproc.c:150,156 | ||
| 1990/0227 | char **argv, **argp; char *a, *charp, *file; char *progarg[sizeof(Exec)/2+1], elem[NAMELEN]; | |
| 1990/1211 | ulong ssize, spage, nargs, nbytes, n, bssend; | |
| 1990/0227 | ulong *sp; int indir; Exec exec; | |
| 1990/1124/sys/src/9/port/sysproc.c:169,175 – 1990/1211/sys/src/9/port/sysproc.c:172,178 | ||
| 1990/0227 | if(n < 2) Err: | |
| 1990/11211 | error(Ebadexec); | |
| 1990/0227 |
| |
| 1990/1211 | if(n==sizeof(Exec) && exec.magic==AOUT_MAGIC){ | |
| 1990/0227 | if((exec.text&KZERO) || (ulong)exec.entry < UTZERO+sizeof(Exec) || (ulong)exec.entry >= UTZERO+sizeof(Exec)+exec.text) | |
| 1990/1124/sys/src/9/port/sysproc.c:206,212 – 1990/1211/sys/src/9/port/sysproc.c:209,216 | ||
| 1990/0227 | * Last partial page of data goes into BSS. */ d = (t + exec.data) & ~(BY2PG-1); | |
| 1990/1211 | bssend = t + exec.data + exec.bss; b = (bssend + (BY2PG-1)) & ~(BY2PG-1); | |
| 1990/0227 | if((t|d|b) & KZERO) | |
| 1990/11211 | error(Ebadexec); | |
| 1990/0227 | ||
| 1990/1124/sys/src/9/port/sysproc.c:331,336 – 1990/1211/sys/src/9/port/sysproc.c:335,342 | ||
| 1990/0227 | close(tc); | |
| 1990/1211 | p->bssend = bssend; | |
| 1990/0227 | /* * Move the stack */ | |
| 1990/1124/sys/src/9/port/sysproc.c:347,353 – 1990/1211/sys/src/9/port/sysproc.c:353,360 | ||
| 1990/0227 | unlock(o); flushmmu(); | |
| 1990/1211 | clearmmucache(); ((Ureg*)UREGADDR)->pc = exec.entry + ENTRYOFFSET; | |
| 1990/0227 | sp = (ulong*)(USTKTOP - ssize); *--sp = nargs; | |
| 1990/0614 | ((Ureg*)UREGADDR)->usp = (ulong)sp; | |
| 1990/1124/sys/src/9/port/sysproc.c:355,360 – 1990/1211/sys/src/9/port/sysproc.c:362,368 | ||
| 1990/0227 | u->nnote = 0; u->notify = 0; u->notified = 0; | |
| 1990/1211 | setup(p); | |
| 1990/0227 | unlock(&p->debug); return 0; } | |
| 1990/1124/sys/src/9/port/sysproc.c:488,494 – 1990/1211/sys/src/9/port/sysproc.c:496,520 | ||
| 1990/0227 | long sysbrk_(ulong *arg) { | |
| 1990/1211 | ulong addr; Seg *s; addr = arg[0]; #ifdef WHYROB if(addr < u->p->bssend){ pprint("addr below bss\n"); pexit("Suicide", 0); | |
| 1990/11211 | error(Esegaddr); | |
| 1990/1211 | } #endif WHYROB if(addr <= ((u->p->bssend+(BY2PG-1))&~(BY2PG-1))) /* still in DSEG */ goto Return; if(segaddr(&u->p->seg[BSEG], u->p->seg[BSEG].minva, arg[0]) == 0){ pprint("bad segaddr in brk\n"); pexit("Suicide", 0); error(Esegaddr); } Return: u->p->bssend = addr; | |
| 1990/0227 | return 0; } | |