file reorg, pathnames.h, paths.h
[unix-history] / usr / src / old / dbx / coredump.c
index 276b015..48d0e04 100644 (file)
@@ -1,11 +1,17 @@
-/* Copyright (c) 1982 Regents of the University of California */
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
 
 
-static char sccsid[] = "@(#)coredump.c 1.2 %G%";
+#ifndef lint
+static char sccsid[] = "@(#)coredump.c 5.3 (Berkeley) %G%";
+#endif not lint
+
+static char rcsid[] = "$Header: coredump.c,v 1.4 87/04/15 03:25:22 donn Exp $";
 
 /*
  * Deal with the core dump anachronism.
 
 /*
  * Deal with the core dump anachronism.
- *
- * If I understood this code, I'd try to make it readable.
  */
 
 #include "defs.h"
  */
 
 #include "defs.h"
@@ -13,13 +19,6 @@ static char sccsid[] = "@(#)coredump.c 1.2 %G%";
 #include "machine.h"
 #include "object.h"
 #include "main.h"
 #include "machine.h"
 #include "object.h"
 #include "main.h"
-#include <sys/param.h>
-#include <sys/dir.h>
-#include <sys/psl.h>
-#include <sys/pte.h>
-#include <sys/user.h>
-#include <sys/vm.h>
-#include <sys/reg.h>
 #include <a.out.h>
 
 #ifndef public
 #include <a.out.h>
 
 #ifndef public
@@ -28,8 +27,6 @@ static char sccsid[] = "@(#)coredump.c 1.2 %G%";
 #include "machine.h"
 #endif
 
 #include "machine.h"
 #endif
 
-#define MAXSTKADDR (0x80000000 - ctob(UPAGES)) /* highest stack address */
-
 typedef struct {
     Address begin;
     Address end;
 typedef struct {
     Address begin;
     Address end;
@@ -40,6 +37,35 @@ private Map datamap, stkmap;
 private File objfile;
 private struct exec hdr;
 
 private File objfile;
 private struct exec hdr;
 
+public coredump_getkerinfo ()
+{
+    Symbol s;
+
+    s = lookup(identname("Sysmap", true));
+    if (s == nil) {
+       panic("can't find 'Sysmap'");
+    }
+    sbr = (struct pte *) (s->symvalue.offset);
+    s = lookup(identname("Syssize", true));
+    if (s == nil) {
+       panic("can't find 'Syssize'");
+    }
+    slr = (integer) (s->symvalue.offset);
+    printf("sbr %lx slr %lx\n", sbr, slr);
+    s = lookup(identname("masterpaddr", true));
+    if (s == nil) {
+       panic("can't find 'masterpaddr'");
+    }
+    fseek(
+       corefile,
+       datamap.seekaddr + s->symvalue.offset&0x7fffffff - datamap.begin,
+       0
+    );
+    get(corefile, masterpcbb);
+    masterpcbb = (masterpcbb&PG_PFNUM)*NBPG;
+    getpcb();
+}
+
 /*
  * Read the user area information from the core dump.
  */
 /*
  * Read the user area information from the core dump.
  */
@@ -47,7 +73,7 @@ private struct exec hdr;
 public coredump_xreadin(mask, reg, signo)
 int *mask;
 Word reg[];
 public coredump_xreadin(mask, reg, signo)
 int *mask;
 Word reg[];
-int *signo;
+short *signo;
 {
     register struct user *up;
     register Word *savreg;
 {
     register struct user *up;
     register Word *savreg;
@@ -55,62 +81,68 @@ int *signo;
        struct user u;
        char dummy[ctob(UPAGES)];
     } ustruct;
        struct user u;
        char dummy[ctob(UPAGES)];
     } ustruct;
+    Symbol s;
 
     objfile = fopen(objname, "r");
     if (objfile == nil) {
        fatal("can't read \"%s\"", objname);
     }
     get(objfile, hdr);
 
     objfile = fopen(objname, "r");
     if (objfile == nil) {
        fatal("can't read \"%s\"", objname);
     }
     get(objfile, hdr);
-    up = &(ustruct.u);
-    fread(up, ctob(UPAGES), 1, corefile);
-    savreg = (Word *) &(ustruct.dummy[ctob(UPAGES)]);
-    *mask = savreg[PS];
-    reg[0] = savreg[R0];
-    reg[1] = savreg[R1];
-    reg[2] = savreg[R2];
-    reg[3] = savreg[R3];
-    reg[4] = savreg[R4];
-    reg[5] = savreg[R5];
-    reg[6] = savreg[R6];
-    reg[7] = savreg[R7];
-    reg[8] = savreg[R8];
-    reg[9] = savreg[R9];
-    reg[10] = savreg[R10];
-    reg[11] = savreg[R11];
-    reg[ARGP] = savreg[AP];
-    reg[FRP] = savreg[FP];
-    reg[STKP] = savreg[SP];
-    reg[PROGCTR] = savreg[PC];
-    *signo = up->u_arg[0];
-    datamap.seekaddr = ctob(UPAGES);
-    stkmap.begin = MAXSTKADDR - ctob(up->u_ssize);
-    stkmap.end = MAXSTKADDR;
-    stkmap.seekaddr = datamap.seekaddr + ctob(up->u_dsize);
-    switch (hdr.a_magic) {
-       case OMAGIC:
-           datamap.begin = 0;
-           datamap.end = ctob(up->u_tsize) + ctob(up->u_dsize);
-           break;
-
-       case NMAGIC:
-       case ZMAGIC:
-           datamap.begin = (Address) ptob(btop(ctob(up->u_tsize) - 1) + 1);
-           datamap.end = datamap.begin + ctob(up->u_dsize);
-           break;
-
-       default:
-           fatal("bad magic number 0x%x", hdr.a_magic);
-    }
-    /*
-     * Core dump not from this object file?
-     */
-    if (hdr.a_magic != 0 and up->u_exdata.ux_mag  != 0 and
-      hdr.a_magic != up->u_exdata.ux_mag) {
-       warning("core dump ignored");
-       coredump = false;
-       fclose(coredump);
-       fclose(objfile);
-       start(nil, nil, nil);
+    if (vaddrs) {
+       datamap.begin = 0;
+       datamap.end = 0xffffffff;
+       stkmap.begin = 0xffffffff;
+       stkmap.end = 0xffffffff;
+    } else {
+       up = &(ustruct.u);
+       fread(up, ctob(UPAGES), 1, corefile);
+#      if vax || tahoe
+           savreg = (Word *) &(ustruct.dummy[ctob(UPAGES)]);
+#      else ifdef mc68000
+           savreg = (Word *) (
+               &ustruct.dummy[ctob(UPAGES) - 10] - (NREG * sizeof(Word))
+           );
+#      endif
+#       ifdef IRIS
+           *mask = savreg[RPS];
+#       else
+           *mask = savreg[PS];
+#       endif
+       copyregs(savreg, reg);
+       *signo = up->u_arg[0];
+       datamap.seekaddr = ctob(UPAGES);
+       stkmap.begin = USRSTACK - ctob(up->u_ssize);
+       stkmap.end = USRSTACK;
+       stkmap.seekaddr = datamap.seekaddr + ctob(up->u_dsize);
+       switch (hdr.a_magic) {
+           case OMAGIC:
+               datamap.begin = CODESTART;
+               datamap.end = CODESTART + ctob(up->u_tsize) + ctob(up->u_dsize);
+               break;
+
+           case NMAGIC:
+           case ZMAGIC:
+               datamap.begin = (Address)
+                   ptob(btop(ctob(up->u_tsize) - 1) + 1) + CODESTART;
+               datamap.end = datamap.begin + ctob(up->u_dsize);
+               break;
+
+           default:
+               fatal("bad magic number 0x%x", hdr.a_magic);
+       }
+#ifdef UXMAG
+       /*
+        * Core dump not from this object file?
+        */
+       if (hdr.a_magic != 0 and up->u_exdata.ux_mag  != 0 and
+         hdr.a_magic != up->u_exdata.ux_mag) {
+           warning("core dump ignored");
+           coredump = false;
+           fclose(corefile);
+           fclose(objfile);
+           start(nil, nil, nil);
+       }
+#endif
     }
 }
 
     }
 }
 
@@ -124,10 +156,10 @@ char *buff;
 Address addr;
 int nbytes;
 {
 Address addr;
 int nbytes;
 {
-    if (hdr.a_magic == OMAGIC) {
+    if (hdr.a_magic == OMAGIC or vaddrs) {
        coredump_readdata(buff, addr, nbytes);
     } else {
        coredump_readdata(buff, addr, nbytes);
     } else {
-       fseek(objfile, N_TXTOFF(hdr) + addr, 0);
+       fseek(objfile, N_TXTOFF(hdr) + addr - CODESTART, 0);
        fread(buff, nbytes, sizeof(Byte), objfile);
     }
 }
        fread(buff, nbytes, sizeof(Byte), objfile);
     }
 }
@@ -137,15 +169,74 @@ char *buff;
 Address addr;
 int nbytes;
 {
 Address addr;
 int nbytes;
 {
-    if (addr < datamap.begin) {
-       error("data address 0x%x too low (lb = 0x%x)", addr, datamap.begin);
-    } 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);
+    Address a;
+
+    a = addr;
+    if (a < datamap.begin) {
+       if (hdr.a_magic == OMAGIC) {
+           error("[data address 0x%x too low (lb = 0x%x)]", a, datamap.begin);
+       } else {
+           coredump_readtext(buff, a, nbytes);
+       }
+    } 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;
     } else {
     } else {
-       fseek(corefile, stkmap.seekaddr + addr - stkmap.begin, 0);
-       fread(buff, nbytes, sizeof(Byte), corefile);
+       fileaddr = stkmap.seekaddr + a - stkmap.begin;
     }
     }
+    fseek(f, fileaddr, 0);
+    fread(buff, nbytes, sizeof(Byte), f);
 }
 }