8 newseg(u32int start, u32int size, int idx)
12 s = emallocz(sizeof *s);
16 s->dref = emalloc(size + sizeof(Ref));
17 memset(s->dref, 0, sizeof(Ref));
19 s->data = s->dref + 1;
31 for(s = P->S; s < P->S + SEGNUM; s++) {
34 if(decref((*s)->dref) == 0)
43 vaddr(u32int addr, u32int len, Segment **seg)
47 for(ss = P->S; ss < P->S + SEGNUM; ss++) {
51 if(addr >= s->start && addr < s->start + s->size) {
52 if(addr + len > s->start + s->size)
54 if(s->flags & SEGFLLOCK)
57 return (char *)s->data + (addr - s->start);
60 suicide("fault %.8ux (%d) @ %.8ux", addr, len, P->R[15]);
65 vaddrnol(u32int addr, u32int len)
70 ret = vaddr(addr, len, &seg);
75 /* might be made a macro for hurr durr performance */
79 if(s->flags & SEGFLLOCK)
84 copyifnec(u32int addr, int len, int *copied)
89 targ = vaddr(addr, len > 0 ? len : 0, &seg);
90 if((seg->flags & SEGFLLOCK) == 0) {
95 len = strlen(targ) + 1;
97 setmalloctag(ret, getcallerpc(&addr));
98 memcpy(ret, targ, len);
105 bufifnec(u32int addr, int len, int *buffered)
110 targ = vaddr(addr, len, &seg);
111 if((seg->flags & SEGFLLOCK) == 0) {
118 setmalloctag(v, getcallerpc(&addr));
123 copyback(u32int addr, int len, void *data)
132 targ = vaddr(addr, len, &seg);
133 memmove(targ, data, len);