return -1;
}
- if (map->nsegs == 1 && map->seg[0].fd < 0) {
+ if (map->nsegs == 1 && map->seg[0].fd < 0 && map->seg[0].read == nil) {
*x = addr;
return 1;
}
return -1;
}
- if (map->nsegs == 1 && map->seg[0].fd < 0) {
+ if (map->nsegs == 1 && map->seg[0].fd < 0 && map->seg[0].read == nil) {
*x = addr;
return 1;
}
return -1;
}
- if (map->nsegs == 1 && map->seg[0].fd < 0) {
+ if (map->nsegs == 1 && map->seg[0].fd < 0 && map->seg[0].read == nil) {
*x = addr;
return 1;
}
return -1;
}
- if (map->nsegs == 1 && map->seg[0].fd < 0) {
+ if (map->nsegs == 1 && map->seg[0].fd < 0 && map->seg[0].read == nil) {
cp = (uchar*)&addr;
while (cp < (uchar*)(&addr+1) && size-- > 0)
*x++ = *cp++;
char a[8192];
uvlong off;
} cache;
+
+ if(s->read != nil)
+ return s->read(s->fd, buf, n, off);
if(s->cache){
base = off&~(sizeof cache.a-1);
s = reloc(map, addr, (vlong*)&off);
if (!s)
return -1;
- if (s->fd < 0) {
+ if (s->fd < 0 && s->read == nil) {
werrstr("unreadable map");
return -1;
}
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];
}
}