| plan 9 kernel history: overview | file list | diff list |
1990/0614/port/sysproc.c (diff list | history)
| 1990/0330/sys/src/9/port/sysproc.c:26,31 – 1990/0614/sys/src/9/port/sysproc.c:26,32 (short | long | prev | next) | ||
| 1990/0227 | ulong usp, upa, pid; Chan *c; Orig *o; | |
| 1990/0614 | KMap *k; | |
| 1990/0227 | int n, on, i; int lastvar; /* used to compute stack address */ | |
| 1990/0330/sys/src/9/port/sysproc.c:34,40 – 1990/0614/sys/src/9/port/sysproc.c:35,43 | ||
| 1990/0227 | */ p = newproc(); p->upage = newpage(1, 0, USERADDR|(p->pid&0xFFFF)); | |
| 1990/0614 | k = kmap(p->upage); upa = VA(k); | |
| 1990/0227 | /* * Save time: only copy u-> data and useful stack */ | |
| 1990/0330/sys/src/9/port/sysproc.c:41,48 – 1990/0614/sys/src/9/port/sysproc.c:44,52 | ||
| 1990/0227 | memcpy((void*)upa, u, sizeof(User)); n = USERADDR+BY2PG - (ulong)&lastvar; n = (n+32) & ~(BY2WD-1); /* be safe & word align */ | |
| 1990/0614 | memcpy((void*)(upa+BY2PG-n), (void*)(USERADDR+BY2PG-n), n); | |
| 1990/0227 | ((User *)upa)->p = p; | |
| 1990/0614 | kunmap(k); | |
| 1990/0227 | /* * User stack | |
| 1990/0330/sys/src/9/port/sysproc.c:51,57 – 1990/0614/sys/src/9/port/sysproc.c:55,61 | ||
| 1990/0227 | s = &p->seg[SSEG]; s->proc = p; on = (s->maxva-s->minva)>>PGSHIFT; | |
| 1990/0614 | usp = ((Ureg*)UREGADDR)->usp; | |
| 1990/0227 | if(usp >= USTKTOP) panic("fork bad usp %lux", usp); if(usp < u->p->seg[SSEG].minva) | |
| 1990/0330/sys/src/9/port/sysproc.c:70,82 – 1990/0614/sys/src/9/port/sysproc.c:74,88 | ||
| 1990/0227 | op = u->p->seg[SSEG].o->pte[i+(on-n)].page; if(op){ np = newpage(1, s->o, op->va); | |
| 1990/0614 | k = kmap(np); | |
| 1990/0227 | p->seg[SSEG].o->pte[i].page = np; if(i == 0){ /* only part of last stack page */ | |
| 1990/0614 | memset((void*)VA(k), 0, usp); memcpy((void*)(VA(k)+usp), (void*)(op->va+usp), BY2PG-usp); | |
| 1990/0227 | }else /* all of higher pages */ | |
| 1990/0614 | memcpy((void*)VA(k), (void*)op->va, BY2PG); kunmap(k); | |
| 1990/0227 | } } unlock(s->o); | |
| 1990/0330/sys/src/9/port/sysproc.c:350,356 – 1990/0614/sys/src/9/port/sysproc.c:356,362 | ||
| 1990/0227 | ((Ureg*)UREGADDR)->pc = exec.entry - 4; sp = (ulong*)(USTKTOP - ssize); *--sp = nargs; | |
| 1990/0614 | ((Ureg*)UREGADDR)->usp = (ulong)sp; | |
| 1990/0227 | lock(&p->debug); u->nnote = 0; u->notify = 0; | |