| plan 9 kernel history: overview | file list | diff list |
1990/03091/gnot/fault.c (diff list | history)
| 1990/03091/sys/src/9/gnot/fault.c:83,88 – 1990/0312/sys/src/9/gnot/fault.c:83,89 (short | long) | ||
| 1990/03091 | read = (f->ssw&READ) && !(f->ssw&RM); else read = f->ssw&(FB|FC); | |
| 1990/0312 | /* print("fault pc=%lux addr=%lux read %d\n", ur->pc, badvaddr, read); /**/ | |
| 1990/03091 | s = seg(u->p, addr); if(s == 0){ | |
| 1990/03091/sys/src/9/gnot/fault.c:272,280 – 1990/0312/sys/src/9/gnot/fault.c:273,282 | ||
| 1990/03091 | Seg *s; if((long)len < 0) | |
| 1990/0312 | goto Err; | |
| 1990/03091 | s = seg(u->p, addr); if(s==0 || addr+len>s->maxva || (write && (s->o->flag&OWRPERM)==0)){ | |
| 1990/0312 | Err: | |
| 1990/03091 | pprint("invalid address in sys call pc %lux sp %lux\n", ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp); postnote(u->p, 1, "bad address", NDebug); error(0, Ebadarg); | |
| 1990/0312/sys/src/9/gnot/fault.c:89,100 – 1990/0315/sys/src/9/gnot/fault.c:89,100 (short | long) | ||
| 1990/03091 | if(s == 0){ if(addr>USTKTOP){ cant: | |
| 1990/0315 | u->p->state = MMUing; | |
| 1990/03091 | dumpregs(ur); panic("fault"); exit(); | |
| 1990/0315/sys/src/9/gnot/fault.c:51,61 – 1990/06021/sys/src/9/gnot/fault.c:51,62 (short | long) | ||
| 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--; | |
| 1990/06021/sys/src/9/gnot/fault.c:55,62 – 1990/0603/sys/src/9/gnot/fault.c:55,64 (short | long) | ||
| 1990/03091 | int zeroed = 0, head = 1; int i, user, read, insyscall; | |
| 1990/0603 | if(u == 0){ dumpregs(ur); | |
| 1990/06021 | panic("fault u==0 pc=%lux", ur->pc); | |
| 1990/0603 | } | |
| 1990/03091 | insyscall = u->p->insyscall; u->p->insyscall = 1; if(f->ssw & DF) | |
| 1990/0603/sys/src/9/gnot/fault.c:163,169 – 1990/0614/sys/src/9/gnot/fault.c:163,169 (short | long) | ||
| 1990/03091 | goto cant; } o->chan->offset = (addr-o->va) + o->minca; | |
| 1990/06021 |
| |
| 1990/0614 | l = (char*)VA(k); | |
| 1990/03091 | if((*devtab[o->chan->type].read)(o->chan, l, n) != n) error(0, Eioload); qunlock(o->chan); | |
| 1990/0603/sys/src/9/gnot/fault.c:239,245 – 1990/0614/sys/src/9/gnot/fault.c:239,245 | ||
| 1990/03091 | pte->page = newpage(1, o, addr); | |
| 1990/06021 | k = kmap(pte->page); k1 = kmap(pg); | |
| 1990/0614 | memcpy((void*)VA(k), (void*)VA(k1), BY2PG); | |
| 1990/06021 | kunmap(k); kunmap(k1); | |
| 1990/03091 | if(pg->ref <= 1) | |
| 1990/0614/sys/src/9/gnot/fault.c:280,298 – 1990/0617/sys/src/9/gnot/fault.c:280,305 (short | long) | ||
| 1990/03091 | void validaddr(ulong addr, ulong len, int write) { | |
| 1990/0617 | Seg *s, *ns; | |
| 1990/03091 |
| |
| 1990/0312 |
| |
| 1990/03091 |
| |
| 1990/0617 | if((long)len < 0){ | |
| 1990/0312 | Err: | |
| 1990/03091 | pprint("invalid address in sys call pc %lux sp %lux\n", ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp); postnote(u->p, 1, "bad address", NDebug); error(0, Ebadarg); } | |
| 1990/0617 | Again: s = seg(u->p, addr); if(s==0) goto Err; if(write && (s->o->flag&OWRPERM)==0) goto Err; if(addr+len > s->maxva){ len -= s->maxva - addr; addr = s->maxva; goto Again; } | |
| 1990/03091 | } | |
| 1990/0617/sys/src/9/gnot/fault.c:185,193 – 1990/0724/sys/src/9/gnot/fault.c:185,193 (short | long) | ||
| 1990/03091 | } } /* | |
| 1990/0724 | * Copy on write | |
| 1990/03091 | */ | |
| 1990/0724 | if((o->flag & OWRPERM) && !read | |
| 1990/03091 | && ((head && ((o->flag&OPURE) || o->nproc>1)) || (!head && pte->page->ref>1))){ | |
| 1990/0724/sys/src/9/gnot/fault.c:108,116 – 1990/0802/sys/src/9/gnot/fault.c:108,122 (short | long) | ||
| 1990/03091 | /* grow stack */ o = s->o; n = o->npte; | |
| 1990/0802 | lock(o); if(waserror()){ unlock(o); pprint("can't allocate stack page\n"); goto cant; } | |
| 1990/03091 | growpte(o, (s->maxva-addr)>>PGSHIFT); | |
| 1990/0802 | poperror(); | |
| 1990/03091 | /* stacks grown down, sigh */ | |
| 1990/0802/sys/src/9/gnot/fault.c:79,84 – 1990/08101/sys/src/9/gnot/fault.c:79,85 (short | long) | ||
| 1990/03091 | panic("prefetch pagefault"); }else panic("prefetch format"); | |
| 1990/08101 | addr &= VAMASK; | |
| 1990/03091 | badvaddr = addr; addr &= ~(BY2PG-1); user = !(ur->sr&SUPER); | |
| 1990/0802/sys/src/9/gnot/fault.c:99,105 – 1990/08101/sys/src/9/gnot/fault.c:100,106 | ||
| 1990/03091 | } | |
| 1990/0315 | u->p->state = MMUing; | |
| 1990/03091 | dumpregs(ur); | |
| 1990/08101 | panic("fault: 0x%lux", badvaddr); | |
| 1990/03091 | exit(); } s = &u->p->seg[SSEG]; | |
| 1990/08101/sys/src/9/gnot/fault.c:109,117 – 1990/0814/sys/src/9/gnot/fault.c:109,115 (short | long) | ||
| 1990/03091 | /* grow stack */ o = s->o; n = o->npte; | |
| 1990/0802 |
| |
| 1990/08101/sys/src/9/gnot/fault.c:118,123 – 1990/0814/sys/src/9/gnot/fault.c:116,122 | ||
| 1990/03091 | growpte(o, (s->maxva-addr)>>PGSHIFT); | |
| 1990/0802 | poperror(); | |
| 1990/03091 | /* stacks grown down, sigh */ | |
| 1990/0814 | lock(o); | |
| 1990/03091 | memcpy(o->pte+(o->npte-n), o->pte, n*sizeof(PTE)); memset(o->pte, 0, (o->npte-n)*sizeof(PTE)); unlock(o); | |
| 1990/0814/sys/src/9/gnot/fault.c:104,110 – 1990/0821/sys/src/9/gnot/fault.c:104,110 (short | long) | ||
| 1990/03091 | exit(); } s = &u->p->seg[SSEG]; | |
| 1990/0821 | if(s->o==0 || addr<s->maxva-USTACKSIZE || addr>=s->maxva) | |
| 1990/03091 | goto cant; /* grow stack */ o = s->o; | |
| 1990/0814/sys/src/9/gnot/fault.c:296,303 – 1990/0821/sys/src/9/gnot/fault.c:296,306 | ||
| 1990/03091 | } | |
| 1990/0617 | Again: s = seg(u->p, addr); | |
| 1990/0821 | if(s==0){ s = &u->p->seg[SSEG]; if(s->o==0 || addr<s->maxva-USTACKSIZE || addr>=s->maxva) goto Err; } | |
| 1990/0617 | if(write && (s->o->flag&OWRPERM)==0) goto Err; if(addr+len > s->maxva){ | |
| 1990/0821/sys/src/9/gnot/fault.c:173,179 – 1990/0918/sys/src/9/gnot/fault.c:173,178 (short | long) | ||
| 1990/03091 | if((*devtab[o->chan->type].read)(o->chan, l, n) != n) error(0, Eioload); qunlock(o->chan); | |
| 1990/0918/sys/src/9/gnot/fault.c:166,171 – 1990/1110/sys/src/9/gnot/fault.c:166,173 (short | long) | ||
| 1990/03091 | qunlock(o->chan); pg->o = 0; pg->ref--; | |
| 1990/1110 | if(user) pexit("Interrupt", 0); | |
| 1990/03091 | goto cant; } o->chan->offset = (addr-o->va) + o->minca; | |
| 1990/0918/sys/src/9/gnot/fault.c:290,296 – 1990/1110/sys/src/9/gnot/fault.c:292,298 | ||
| 1990/0617 | if((long)len < 0){ | |
| 1990/0312 | Err: | |
| 1990/03091 | pprint("invalid address in sys call pc %lux sp %lux\n", ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp); | |
| 1990/1110 | postnote(u->p, 1, "sys: bad address", NDebug); | |
| 1990/03091 | error(0, Ebadarg); } | |
| 1990/0617 | Again: | |
| 1990/1110/sys/src/9/gnot/fault.c:166,174 – 1990/1113/sys/src/9/gnot/fault.c:166,172 (short | long) | ||
| 1990/03091 | qunlock(o->chan); pg->o = 0; pg->ref--; | |
| 1990/1110 |
| |
| 1990/03091 |
| |
| 1990/1113 | pexit("load i/o error", 0); | |
| 1990/03091 | } o->chan->offset = (addr-o->va) + o->minca; | |
| 1990/0614 | l = (char*)VA(k); | |
| 1990/1113/sys/src/9/gnot/fault.c:161,167 – 1990/11211/sys/src/9/gnot/fault.c:161,167 (short | long) | ||
| 1990/06021 | k = kmap(pg); | |
| 1990/03091 | qlock(o->chan); if(waserror()){ | |
| 1990/11211 | print("demand load i/o error %s\n", u->error); | |
| 1990/06021 | kunmap(k); | |
| 1990/03091 | qunlock(o->chan); pg->o = 0; | |
| 1990/1113/sys/src/9/gnot/fault.c:171,177 – 1990/11211/sys/src/9/gnot/fault.c:171,177 | ||
| 1990/03091 | o->chan->offset = (addr-o->va) + o->minca; | |
| 1990/0614 | l = (char*)VA(k); | |
| 1990/03091 | if((*devtab[o->chan->type].read)(o->chan, l, n) != n) | |
| 1990/11211 | error(Eioload); | |
| 1990/03091 | qunlock(o->chan); if(n<BY2PG) memset(l+n, 0, BY2PG-n); | |
| 1990/1113/sys/src/9/gnot/fault.c:291,297 – 1990/11211/sys/src/9/gnot/fault.c:291,297 | ||
| 1990/0312 | Err: | |
| 1990/03091 | pprint("invalid address in sys call pc %lux sp %lux\n", ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp); | |
| 1990/1110 | postnote(u->p, 1, "sys: bad address", NDebug); | |
| 1990/03091 |
| |
| 1990/11211 | error(Ebadarg); | |
| 1990/03091 | } | |
| 1990/0617 | Again: s = seg(u->p, addr); | |
| 1990/11211/sys/src/9/gnot/fault.c:61,66 – 1990/1126/sys/src/9/gnot/fault.c:61,67 (short | long) | ||
| 1990/0603 | } | |
| 1990/03091 | insyscall = u->p->insyscall; u->p->insyscall = 1; | |
| 1990/1126 | addr = 0; /* set */ | |
| 1990/03091 | if(f->ssw & DF) addr = f->addr; else if(FORMAT(ur) == 0xA){ | |
| 1990/1126/sys/src/9/gnot/fault.c:162,168 – 1990/1202/sys/src/9/gnot/fault.c:162,167 (short | long) | ||
| 1990/06021 | k = kmap(pg); | |
| 1990/03091 | qlock(o->chan); if(waserror()){ | |
| 1990/11211 |
| |
| 1990/06021 | kunmap(k); | |
| 1990/03091 | qunlock(o->chan); pg->o = 0; | |
| 1990/1202/sys/src/9/gnot/fault.c:1,347 – 1990/1212/sys/src/9/gnot/fault.c:0 (short | long) | ||
|
Deleted.
rsc Mon Mar 7 10:21:44 2005 | ||
| 1990/03091 |
| |
| 1990/06021 |
| |
| 1990/03091 |
| |
| 1990/0603 |
| |
| 1990/06021 |
| |
| 1990/0603 |
| |
| 1990/03091 |
| |
| 1990/1126 |
| |
| 1990/03091 |
| |
| 1990/08101 |
| |
| 1990/03091 |
| |
| 1990/0312 |
| |
| 1990/03091 |
| |
| 1990/0315 |
| |
| 1990/03091 |
| |
| 1990/08101 |
| |
| 1990/03091 |
| |
| 1990/0821 |
| |
| 1990/03091 |
| |
| 1990/0802 |
| |
| 1990/03091 |
| |
| 1990/0802 |
| |
| 1990/03091 |
| |
| 1990/0814 |
| |
| 1990/03091 |
| |
| 1990/06021 |
| |
| 1990/03091 |
| |
| 1990/06021 |
| |
| 1990/03091 |
| |
| 1990/1113 |
| |
| 1990/03091 |
| |
| 1990/0614 |
| |
| 1990/03091 |
| |
| 1990/11211 |
| |
| 1990/03091 |
| |
| 1990/06021 |
| |
| 1990/03091 |
| |
| 1990/0724 |
| |
| 1990/03091 |
| |
| 1990/0724 |
| |
| 1990/03091 |
| |
| 1990/06021 |
| |
| 1990/0614 |
| |
| 1990/06021 |
| |
| 1990/03091 |
| |
| 1990/0617 |
| |
| 1990/03091 | ||
| 1990/0617 |
| |
| 1990/0312 |
| |
| 1990/03091 |
| |
| 1990/1110 |
| |
| 1990/11211 |
| |
| 1990/03091 |
| |
| 1990/0617 |
| |
| 1990/0821 |
| |
| 1990/0617 |
| |
| 1990/03091 |
| |