8 newseg(u32int start, u32int size, int idx)
12 s = emallocz(sizeof *s);
16 s->ref = emalloc(size + sizeof(Ref));
17 memset(s->ref, 0, sizeof(Ref));
31 for(s = P->S; s < P->S + SEGNUM; s++) {
34 if(decref((*s)->ref) == 0)
43 vaddr(u32int addr, Segment **seg)
47 for(ss = P->S; ss < P->S + SEGNUM; ss++) {
51 if(addr >= s->start && addr < s->start + s->size) {
52 if(s->flags & SEGFLLOCK)
55 return (char *)s->data + (addr - s->start);
58 sysfatal("fault %.8ux @ %.8ux", addr, P->R[15]);
68 ret = vaddr(addr, &seg);
73 /* might be made a macro for hurr durr performance */
77 if(s->flags & SEGFLLOCK)
82 copyifnec(u32int addr, int len, int *copied)
87 targ = vaddr(addr, &seg);
88 if((seg->flags & SEGFLLOCK) == 0) {
93 len = strlen(targ) + 1;
95 memcpy(ret, targ, len);
102 bufifnec(u32int addr, int len, int *buffered)
107 targ = vaddr(addr, &seg);
108 if((seg->flags & SEGFLLOCK) == 0) {
118 copyback(u32int addr, int len, void *data)
125 targ = vaddr(addr, &seg);
126 memmove(targ, data, len);