summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/port/devproc.c4
-rw-r--r--sys/src/libmach/access.c12
2 files changed, 15 insertions, 1 deletions
diff --git a/sys/src/9/port/devproc.c b/sys/src/9/port/devproc.c
index 57ebebb1a..c49f5f677 100644
--- a/sys/src/9/port/devproc.c
+++ b/sys/src/9/port/devproc.c
@@ -708,6 +708,10 @@ procread(Chan *c, void *va, long n, vlong off)
Waitq *wq;
a = va;
+
+ /* sign extend 63 bit to 64 bit */
+ off <<= 1;
+ off >>= 1;
offset = off;
if(c->qid.type & QTDIR)
diff --git a/sys/src/libmach/access.c b/sys/src/libmach/access.c
index 784ee6158..6d8ed1f3e 100644
--- a/sys/src/libmach/access.c
+++ b/sys/src/libmach/access.c
@@ -263,7 +263,17 @@ reloc(Map *map, uvlong addr, vlong *offp)
for (i = 0; i < map->nsegs; i++) {
if (map->seg[i].inuse)
if (map->seg[i].b <= addr && addr < map->seg[i].e) {
- *offp = addr + map->seg[i].f - map->seg[i].b;
+ addr += map->seg[i].f - map->seg[i].b;
+
+ /*
+ * avoid negative file offsets for kernel
+ * addresses by clearing the sign bit.
+ * devproc sign extends back to 64 bit.
+ */
+ addr <<= 1;
+ addr >>= 1;
+
+ *offp = addr;
return &map->seg[i];
}
}