1*9661Slinton /* Copyright (c) 1982 Regents of the University of California */ 2*9661Slinton 3*9661Slinton static char sccsid[] = "@(#)@(#)coredump.c 1.1 12/15/82"; 4*9661Slinton 5*9661Slinton /* 6*9661Slinton * Deal with the core dump anachronism. 7*9661Slinton * 8*9661Slinton * If I understood this code, I'd try to make it readable. 9*9661Slinton */ 10*9661Slinton 11*9661Slinton #include "defs.h" 12*9661Slinton #include "coredump.h" 13*9661Slinton #include "machine.h" 14*9661Slinton #include "object.h" 15*9661Slinton #include "main.h" 16*9661Slinton #include <sys/param.h> 17*9661Slinton #include <sys/dir.h> 18*9661Slinton #include <sys/psl.h> 19*9661Slinton #include <sys/pte.h> 20*9661Slinton #include <sys/user.h> 21*9661Slinton #include <sys/vm.h> 22*9661Slinton #include <sys/reg.h> 23*9661Slinton #include <a.out.h> 24*9661Slinton 25*9661Slinton #ifndef public 26*9661Slinton #define coredump_readin(m, r, s) coredump_xreadin(&(m), r, &(s)) 27*9661Slinton 28*9661Slinton #include "machine.h" 29*9661Slinton #endif 30*9661Slinton 31*9661Slinton #define MAXSTKADDR (0x80000000 - ctob(UPAGES)) /* highest stack address */ 32*9661Slinton 33*9661Slinton typedef struct { 34*9661Slinton Address begin; 35*9661Slinton Address end; 36*9661Slinton Address seekaddr; 37*9661Slinton } Map; 38*9661Slinton 39*9661Slinton private Map datamap, stkmap; 40*9661Slinton private File objfile; 41*9661Slinton private struct exec hdr; 42*9661Slinton 43*9661Slinton /* 44*9661Slinton * Read the user area information from the core dump. 45*9661Slinton */ 46*9661Slinton 47*9661Slinton public coredump_xreadin(mask, reg, signo) 48*9661Slinton int *mask; 49*9661Slinton Word reg[]; 50*9661Slinton int *signo; 51*9661Slinton { 52*9661Slinton register struct user *up; 53*9661Slinton register Word *savreg; 54*9661Slinton union { 55*9661Slinton struct user u; 56*9661Slinton char dummy[ctob(UPAGES)]; 57*9661Slinton } ustruct; 58*9661Slinton 59*9661Slinton objfile = fopen(objname, "r"); 60*9661Slinton if (objfile == nil) { 61*9661Slinton fatal("can't read \"%s\"", objname); 62*9661Slinton } 63*9661Slinton get(objfile, hdr); 64*9661Slinton up = &(ustruct.u); 65*9661Slinton fread(up, ctob(UPAGES), 1, corefile); 66*9661Slinton savreg = (Word *) &(ustruct.dummy[ctob(UPAGES)]); 67*9661Slinton *mask = savreg[PS]; 68*9661Slinton reg[0] = savreg[R0]; 69*9661Slinton reg[1] = savreg[R1]; 70*9661Slinton reg[2] = savreg[R2]; 71*9661Slinton reg[3] = savreg[R3]; 72*9661Slinton reg[4] = savreg[R4]; 73*9661Slinton reg[5] = savreg[R5]; 74*9661Slinton reg[6] = savreg[R6]; 75*9661Slinton reg[7] = savreg[R7]; 76*9661Slinton reg[8] = savreg[R8]; 77*9661Slinton reg[9] = savreg[R9]; 78*9661Slinton reg[10] = savreg[R10]; 79*9661Slinton reg[11] = savreg[R11]; 80*9661Slinton reg[ARGP] = savreg[AP]; 81*9661Slinton reg[FRP] = savreg[FP]; 82*9661Slinton reg[STKP] = savreg[SP]; 83*9661Slinton reg[PROGCTR] = savreg[PC]; 84*9661Slinton *signo = up->u_arg[0]; 85*9661Slinton datamap.seekaddr = ctob(UPAGES); 86*9661Slinton stkmap.begin = MAXSTKADDR - ctob(up->u_ssize); 87*9661Slinton stkmap.end = MAXSTKADDR; 88*9661Slinton stkmap.seekaddr = datamap.seekaddr + ctob(up->u_dsize); 89*9661Slinton switch (hdr.a_magic) { 90*9661Slinton case OMAGIC: 91*9661Slinton datamap.begin = 0; 92*9661Slinton datamap.end = ctob(up->u_tsize) + ctob(up->u_dsize); 93*9661Slinton break; 94*9661Slinton 95*9661Slinton case NMAGIC: 96*9661Slinton case ZMAGIC: 97*9661Slinton datamap.begin = (Address) ptob(btop(ctob(up->u_tsize) - 1) + 1); 98*9661Slinton datamap.end = datamap.begin + ctob(up->u_dsize); 99*9661Slinton break; 100*9661Slinton 101*9661Slinton default: 102*9661Slinton fatal("bad magic number 0x%x", hdr.a_magic); 103*9661Slinton } 104*9661Slinton /* 105*9661Slinton * Core dump not from this object file? 106*9661Slinton */ 107*9661Slinton if (hdr.a_magic != 0 and up->u_exdata.ux_mag != 0 and 108*9661Slinton hdr.a_magic != up->u_exdata.ux_mag) { 109*9661Slinton warning("core dump ignored"); 110*9661Slinton coredump = false; 111*9661Slinton fclose(coredump); 112*9661Slinton fclose(objfile); 113*9661Slinton start(nil, nil, nil); 114*9661Slinton } 115*9661Slinton } 116*9661Slinton 117*9661Slinton public coredump_close() 118*9661Slinton { 119*9661Slinton fclose(objfile); 120*9661Slinton } 121*9661Slinton 122*9661Slinton public coredump_readtext(buff, addr, nbytes) 123*9661Slinton char *buff; 124*9661Slinton Address addr; 125*9661Slinton int nbytes; 126*9661Slinton { 127*9661Slinton if (hdr.a_magic == OMAGIC) { 128*9661Slinton coredump_readdata(buff, addr, nbytes); 129*9661Slinton } else { 130*9661Slinton fseek(objfile, N_TXTOFF(hdr) + addr, 0); 131*9661Slinton fread(buff, nbytes, sizeof(Byte), objfile); 132*9661Slinton } 133*9661Slinton } 134*9661Slinton 135*9661Slinton public coredump_readdata(buff, addr, nbytes) 136*9661Slinton char *buff; 137*9661Slinton Address addr; 138*9661Slinton int nbytes; 139*9661Slinton { 140*9661Slinton if (addr < datamap.begin) { 141*9661Slinton error("data address 0x%x too low (lb = 0x%x)", addr, datamap.begin); 142*9661Slinton } else if (addr > stkmap.end) { 143*9661Slinton error("data address 0x%x too high (ub = 0x%x)", addr, stkmap.end); 144*9661Slinton } else if (addr < stkmap.begin) { 145*9661Slinton fseek(corefile, datamap.seekaddr + addr - datamap.begin, 0); 146*9661Slinton fread(buff, nbytes, sizeof(Byte), corefile); 147*9661Slinton } else { 148*9661Slinton fseek(corefile, stkmap.seekaddr + addr - stkmap.begin, 0); 149*9661Slinton fread(buff, nbytes, sizeof(Byte), corefile); 150*9661Slinton } 151*9661Slinton } 152