| plan 9 kernel history: overview | file list | diff list |
1990/06021/gnot/fault.c (diff list | history)
| 1990/0315/sys/src/9/gnot/fault.c:51,61 – 1990/06021/sys/src/9/gnot/fault.c:51,62 (short | long | prev | next) | ||
| 1990/03091 | Orig *o; char *l; Page *pg; | |
| 1990/06021 | KMap *k, *k1; | |
| 1990/03091 | int zeroed = 0, head = 1; int i, user, read, insyscall; if(u == 0) | |
| 1990/06021 | panic("fault u==0 pc=%lux", ur->pc); | |
| 1990/03091 | insyscall = u->p->insyscall; u->p->insyscall = 1; if(f->ssw & DF) | |
| 1990/0315/sys/src/9/gnot/fault.c:149,157 – 1990/06021/sys/src/9/gnot/fault.c:150,160 | ||
| 1990/03091 | if(n > BY2PG) n = BY2PG; pg = newpage(1, o, addr); | |
| 1990/06021 | k = kmap(pg); | |
| 1990/03091 | qlock(o->chan); if(waserror()){ print("demand load i/o error %d\n", u->error.code); | |
| 1990/06021 | kunmap(k); | |
| 1990/03091 | qunlock(o->chan); pg->o = 0; pg->ref--; | |
| 1990/0315/sys/src/9/gnot/fault.c:158,172 – 1990/06021/sys/src/9/gnot/fault.c:161,176 | ||
| 1990/03091 | goto cant; } o->chan->offset = (addr-o->va) + o->minca; | |
| 1990/06021 | l = (char*)k->va; | |
| 1990/03091 | if((*devtab[o->chan->type].read)(o->chan, l, n) != n) error(0, Eioload); qunlock(o->chan); | |
| 1990/06021 | kunmap(k); poperror(); | |
| 1990/03091 | opte = &o->pte[(addr-s->minva)>>PGSHIFT]; /* could move */ pte = opte; if(pte->page == 0){ | |
| 1990/0315/sys/src/9/gnot/fault.c:231,237 – 1990/06021/sys/src/9/gnot/fault.c:235,245 | ||
| 1990/03091 | opte->page = 0; }else{ /* copy page */ pte->page = newpage(1, o, addr); | |
| 1990/06021 | k = kmap(pte->page); k1 = kmap(pg); memcpy((void*)k->va, (void*)k1->va, BY2PG); kunmap(k); kunmap(k1); | |
| 1990/03091 | if(pg->ref <= 1) panic("pg->ref <= 1"); pg->ref--; | |