diff options
author | aiju <aiju@phicode.de> | 2011-06-24 15:10:22 +0200 |
---|---|---|
committer | aiju <aiju@phicode.de> | 2011-06-24 15:10:22 +0200 |
commit | 81d393942d8834b6e071ab0957b655a99e737486 (patch) | |
tree | a4b6c1cc206c87d46f390139502e03dafddd9c2a /sys/src/cmd/5e/seg.c | |
parent | a3e9415aa8cdba6059c972c582e3645c4c112139 (diff) |
updated 5e
Diffstat (limited to 'sys/src/cmd/5e/seg.c')
-rw-r--r-- | sys/src/cmd/5e/seg.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/sys/src/cmd/5e/seg.c b/sys/src/cmd/5e/seg.c index caa4002ac..1cde88241 100644 --- a/sys/src/cmd/5e/seg.c +++ b/sys/src/cmd/5e/seg.c @@ -13,10 +13,10 @@ newseg(u32int start, u32int size, int idx) incref(s); s->start = start; s->size = size; - s->ref = emalloc(size + sizeof(Ref)); - memset(s->ref, 0, sizeof(Ref)); - incref(s->ref); - s->data = s->ref + 1; + s->dref = emalloc(size + sizeof(Ref)); + memset(s->dref, 0, sizeof(Ref)); + incref(s->dref); + s->data = s->dref + 1; if(idx == SEGBSS) s->flags = SEGFLLOCK; P->S[idx] = s; @@ -31,8 +31,8 @@ freesegs(void) for(s = P->S; s < P->S + SEGNUM; s++) { if(*s == nil) continue; - if(decref((*s)->ref) == 0) - free((*s)->ref); + if(decref((*s)->dref) == 0) + free((*s)->dref); if(decref(*s) == 0) free(*s); *s = nil; @@ -40,7 +40,7 @@ freesegs(void) } void * -vaddr(u32int addr, Segment **seg) +vaddr(u32int addr, u32int len, Segment **seg) { Segment **ss, *s; @@ -49,23 +49,25 @@ vaddr(u32int addr, Segment **seg) continue; s = *ss; if(addr >= s->start && addr < s->start + s->size) { + if(addr + len > s->start + s->size) + break; if(s->flags & SEGFLLOCK) rlock(&s->rw); *seg = s; return (char *)s->data + (addr - s->start); } } - sysfatal("fault %.8ux @ %.8ux", addr, P->R[15]); + suicide("fault %.8ux (%d) @ %.8ux", addr, len, P->R[15]); return nil; } void * -vaddrnol(u32int addr) +vaddrnol(u32int addr, u32int len) { Segment *seg; void *ret; - ret = vaddr(addr, &seg); + ret = vaddr(addr, len, &seg); segunlock(seg); return ret; } @@ -84,7 +86,7 @@ copyifnec(u32int addr, int len, int *copied) void *targ, *ret; Segment *seg; - targ = vaddr(addr, &seg); + targ = vaddr(addr, len > 0 ? len : 0, &seg); if((seg->flags & SEGFLLOCK) == 0) { *copied = 0; return targ; @@ -104,7 +106,7 @@ bufifnec(u32int addr, int len, int *buffered) void *targ; Segment *seg; - targ = vaddr(addr, &seg); + targ = vaddr(addr, len, &seg); if((seg->flags & SEGFLLOCK) == 0) { *buffered = 0; return targ; @@ -122,7 +124,7 @@ copyback(u32int addr, int len, void *data) if(len <= 0) return; - targ = vaddr(addr, &seg); + targ = vaddr(addr, len, &seg); memmove(targ, data, len); segunlock(seg); free(data); |