- } else if (addr > stkmap.end) {
- error("data address 0x%x too high (ub = 0x%x)", addr, stkmap.end);
- } else if (addr < stkmap.begin) {
- fseek(corefile, datamap.seekaddr + addr - datamap.begin, 0);
- fread(buff, nbytes, sizeof(Byte), corefile);
+ } else if (a > stkmap.end) {
+ error("data address 0x%x too high (ub = 0x%x)", a, stkmap.end);
+ } else {
+ if (vaddrs) {
+ vreadfromfile(corefile, a, buff, nbytes);
+ } else {
+ readfromfile(corefile, a, buff, nbytes);
+ }
+ }
+}
+
+/*
+ * Read a block of data from a memory image, mapping virtual addresses.
+ * Have to watch out for page boundaries.
+ */
+
+private vreadfromfile (corefile, v, buff, nbytes)
+File corefile;
+Address v;
+char *buff;
+integer nbytes;
+{
+ Address a;
+ integer i, remainder, pagesize;
+ char *bufp;
+
+ a = v;
+ pagesize = (integer) ptob(1);
+ remainder = pagesize - (a mod pagesize);
+ if (remainder >= nbytes) {
+ readfromfile(corefile, vmap(a), buff, nbytes);
+ } else {
+ readfromfile(corefile, vmap(a), buff, remainder);
+ a += remainder;
+ i = nbytes - remainder;
+ bufp = buff + remainder;
+ while (i > pagesize) {
+ readfromfile(corefile, vmap(a), bufp, pagesize);
+ a += pagesize;
+ bufp += pagesize;
+ i -= pagesize;
+ }
+ readfromfile(corefile, vmap(a), bufp, i);
+ }
+}
+
+private readfromfile (f, a, buff, nbytes)
+File f;
+Address a;
+char *buff;
+integer nbytes;
+{
+ integer fileaddr;
+
+ if (a < stkmap.begin) {
+ fileaddr = datamap.seekaddr + a - datamap.begin;