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