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