summaryrefslogtreecommitdiff
path: root/sys/src/cmd/5e/seg.c
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2011-06-24 15:10:22 +0200
committeraiju <aiju@phicode.de>2011-06-24 15:10:22 +0200
commit81d393942d8834b6e071ab0957b655a99e737486 (patch)
treea4b6c1cc206c87d46f390139502e03dafddd9c2a /sys/src/cmd/5e/seg.c
parenta3e9415aa8cdba6059c972c582e3645c4c112139 (diff)
updated 5e
Diffstat (limited to 'sys/src/cmd/5e/seg.c')
-rw-r--r--sys/src/cmd/5e/seg.c28
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);