xref: /csrg-svn/old/dbx/coredump.c (revision 9839)
19661Slinton /* Copyright (c) 1982 Regents of the University of California */
29661Slinton 
3*9839Slinton static char sccsid[] = "@(#)coredump.c 1.3 12/18/82";
49661Slinton 
59661Slinton /*
69661Slinton  * Deal with the core dump anachronism.
79661Slinton  *
89661Slinton  * If I understood this code, I'd try to make it readable.
99661Slinton  */
109661Slinton 
119661Slinton #include "defs.h"
129661Slinton #include "coredump.h"
139661Slinton #include "machine.h"
149661Slinton #include "object.h"
159661Slinton #include "main.h"
169661Slinton #include <sys/param.h>
179661Slinton #include <sys/dir.h>
18*9839Slinton #include <machine/psl.h>
19*9839Slinton #include <machine/pte.h>
209661Slinton #include <sys/user.h>
219661Slinton #include <sys/vm.h>
22*9839Slinton #include <machine/reg.h>
239661Slinton #include <a.out.h>
249661Slinton 
259661Slinton #ifndef public
269661Slinton #define coredump_readin(m, r, s) coredump_xreadin(&(m), r, &(s))
279661Slinton 
289661Slinton #include "machine.h"
299661Slinton #endif
309661Slinton 
319661Slinton #define MAXSTKADDR (0x80000000 - ctob(UPAGES))	/* highest stack address */
329661Slinton 
339661Slinton typedef struct {
349661Slinton     Address begin;
359661Slinton     Address end;
369661Slinton     Address seekaddr;
379661Slinton } Map;
389661Slinton 
399661Slinton private Map datamap, stkmap;
409661Slinton private File objfile;
419661Slinton private struct exec hdr;
429661Slinton 
439661Slinton /*
449661Slinton  * Read the user area information from the core dump.
459661Slinton  */
469661Slinton 
479661Slinton public coredump_xreadin(mask, reg, signo)
489661Slinton int *mask;
499661Slinton Word reg[];
509661Slinton int *signo;
519661Slinton {
529661Slinton     register struct user *up;
539661Slinton     register Word *savreg;
549661Slinton     union {
559661Slinton 	struct user u;
569661Slinton 	char dummy[ctob(UPAGES)];
579661Slinton     } ustruct;
589661Slinton 
599661Slinton     objfile = fopen(objname, "r");
609661Slinton     if (objfile == nil) {
619661Slinton 	fatal("can't read \"%s\"", objname);
629661Slinton     }
639661Slinton     get(objfile, hdr);
649661Slinton     up = &(ustruct.u);
659661Slinton     fread(up, ctob(UPAGES), 1, corefile);
669661Slinton     savreg = (Word *) &(ustruct.dummy[ctob(UPAGES)]);
679661Slinton     *mask = savreg[PS];
689661Slinton     reg[0] = savreg[R0];
699661Slinton     reg[1] = savreg[R1];
709661Slinton     reg[2] = savreg[R2];
719661Slinton     reg[3] = savreg[R3];
729661Slinton     reg[4] = savreg[R4];
739661Slinton     reg[5] = savreg[R5];
749661Slinton     reg[6] = savreg[R6];
759661Slinton     reg[7] = savreg[R7];
769661Slinton     reg[8] = savreg[R8];
779661Slinton     reg[9] = savreg[R9];
789661Slinton     reg[10] = savreg[R10];
799661Slinton     reg[11] = savreg[R11];
809661Slinton     reg[ARGP] = savreg[AP];
819661Slinton     reg[FRP] = savreg[FP];
829661Slinton     reg[STKP] = savreg[SP];
839661Slinton     reg[PROGCTR] = savreg[PC];
849661Slinton     *signo = up->u_arg[0];
859661Slinton     datamap.seekaddr = ctob(UPAGES);
869661Slinton     stkmap.begin = MAXSTKADDR - ctob(up->u_ssize);
879661Slinton     stkmap.end = MAXSTKADDR;
889661Slinton     stkmap.seekaddr = datamap.seekaddr + ctob(up->u_dsize);
899661Slinton     switch (hdr.a_magic) {
909661Slinton 	case OMAGIC:
919661Slinton 	    datamap.begin = 0;
929661Slinton 	    datamap.end = ctob(up->u_tsize) + ctob(up->u_dsize);
939661Slinton 	    break;
949661Slinton 
959661Slinton 	case NMAGIC:
969661Slinton 	case ZMAGIC:
979661Slinton 	    datamap.begin = (Address) ptob(btop(ctob(up->u_tsize) - 1) + 1);
989661Slinton 	    datamap.end = datamap.begin + ctob(up->u_dsize);
999661Slinton 	    break;
1009661Slinton 
1019661Slinton 	default:
1029661Slinton 	    fatal("bad magic number 0x%x", hdr.a_magic);
1039661Slinton     }
1049661Slinton     /*
1059661Slinton      * Core dump not from this object file?
1069661Slinton      */
1079661Slinton     if (hdr.a_magic != 0 and up->u_exdata.ux_mag  != 0 and
1089661Slinton       hdr.a_magic != up->u_exdata.ux_mag) {
1099661Slinton 	warning("core dump ignored");
1109661Slinton 	coredump = false;
1119661Slinton 	fclose(coredump);
1129661Slinton 	fclose(objfile);
1139661Slinton 	start(nil, nil, nil);
1149661Slinton     }
1159661Slinton }
1169661Slinton 
1179661Slinton public coredump_close()
1189661Slinton {
1199661Slinton     fclose(objfile);
1209661Slinton }
1219661Slinton 
1229661Slinton public coredump_readtext(buff, addr, nbytes)
1239661Slinton char *buff;
1249661Slinton Address addr;
1259661Slinton int nbytes;
1269661Slinton {
1279661Slinton     if (hdr.a_magic == OMAGIC) {
1289661Slinton 	coredump_readdata(buff, addr, nbytes);
1299661Slinton     } else {
1309661Slinton 	fseek(objfile, N_TXTOFF(hdr) + addr, 0);
1319661Slinton 	fread(buff, nbytes, sizeof(Byte), objfile);
1329661Slinton     }
1339661Slinton }
1349661Slinton 
1359661Slinton public coredump_readdata(buff, addr, nbytes)
1369661Slinton char *buff;
1379661Slinton Address addr;
1389661Slinton int nbytes;
1399661Slinton {
1409661Slinton     if (addr < datamap.begin) {
1419661Slinton 	error("data address 0x%x too low (lb = 0x%x)", addr, datamap.begin);
1429661Slinton     } else if (addr > stkmap.end) {
1439661Slinton 	error("data address 0x%x too high (ub = 0x%x)", addr, stkmap.end);
1449661Slinton     } else if (addr < stkmap.begin) {
1459661Slinton 	fseek(corefile, datamap.seekaddr + addr - datamap.begin, 0);
1469661Slinton 	fread(buff, nbytes, sizeof(Byte), corefile);
1479661Slinton     } else {
1489661Slinton 	fseek(corefile, stkmap.seekaddr + addr - stkmap.begin, 0);
1499661Slinton 	fread(buff, nbytes, sizeof(Byte), corefile);
1509661Slinton     }
1519661Slinton }
152