121627Sdist /* 238105Sbostic * Copyright (c) 1983 The Regents of the University of California. 338105Sbostic * All rights reserved. 438105Sbostic * 5*42683Sbostic * %sccs.include.redist.c% 621627Sdist */ 79661Slinton 821627Sdist #ifndef lint 9*42683Sbostic static char sccsid[] = "@(#)coredump.c 5.5 (Berkeley) 06/01/90"; 1038105Sbostic #endif /* not lint */ 119661Slinton 129661Slinton /* 139661Slinton * Deal with the core dump anachronism. 149661Slinton */ 159661Slinton 169661Slinton #include "defs.h" 179661Slinton #include "coredump.h" 189661Slinton #include "machine.h" 199661Slinton #include "object.h" 209661Slinton #include "main.h" 219661Slinton #include <a.out.h> 229661Slinton 239661Slinton #ifndef public 249661Slinton #define coredump_readin(m, r, s) coredump_xreadin(&(m), r, &(s)) 259661Slinton 269661Slinton #include "machine.h" 279661Slinton #endif 289661Slinton 299661Slinton typedef struct { 309661Slinton Address begin; 319661Slinton Address end; 329661Slinton Address seekaddr; 339661Slinton } Map; 349661Slinton 359661Slinton private Map datamap, stkmap; 369661Slinton private File objfile; 379661Slinton private struct exec hdr; 389661Slinton 3918215Slinton public coredump_getkerinfo () 4018215Slinton { 4118215Slinton Symbol s; 4218215Slinton 4318215Slinton s = lookup(identname("Sysmap", true)); 4418215Slinton if (s == nil) { 4518215Slinton panic("can't find 'Sysmap'"); 469661Slinton } 4718215Slinton sbr = (struct pte *) (s->symvalue.offset); 4818215Slinton s = lookup(identname("Syssize", true)); 4918215Slinton if (s == nil) { 5018215Slinton panic("can't find 'Syssize'"); 5118215Slinton } 5218215Slinton slr = (integer) (s->symvalue.offset); 5318215Slinton printf("sbr %lx slr %lx\n", sbr, slr); 5418215Slinton s = lookup(identname("masterpaddr", true)); 5518215Slinton if (s == nil) { 5618215Slinton panic("can't find 'masterpaddr'"); 5718215Slinton } 5833313Sdonn fseek( 5933313Sdonn corefile, 6033313Sdonn datamap.seekaddr + s->symvalue.offset&0x7fffffff - datamap.begin, 6133313Sdonn 0 6233313Sdonn ); 6318215Slinton get(corefile, masterpcbb); 6426334Ssam masterpcbb = (masterpcbb&PG_PFNUM)*NBPG; 6518215Slinton getpcb(); 6618215Slinton } 6718215Slinton 6818215Slinton /* 6918215Slinton * Read the user area information from the core dump. 7018215Slinton */ 719661Slinton 7218215Slinton public coredump_xreadin(mask, reg, signo) 7318215Slinton int *mask; 7418215Slinton Word reg[]; 7526334Ssam short *signo; 7618215Slinton { 7718215Slinton register struct user *up; 7818215Slinton register Word *savreg; 7918215Slinton union { 8018215Slinton struct user u; 8118215Slinton char dummy[ctob(UPAGES)]; 8218215Slinton } ustruct; 8318215Slinton Symbol s; 8418215Slinton 8518215Slinton objfile = fopen(objname, "r"); 8618215Slinton if (objfile == nil) { 8718215Slinton fatal("can't read \"%s\"", objname); 889661Slinton } 8918215Slinton get(objfile, hdr); 9018215Slinton if (vaddrs) { 9118215Slinton datamap.begin = 0; 9218215Slinton datamap.end = 0xffffffff; 9318215Slinton stkmap.begin = 0xffffffff; 9418215Slinton stkmap.end = 0xffffffff; 9518215Slinton } else { 9618215Slinton up = &(ustruct.u); 9718215Slinton fread(up, ctob(UPAGES), 1, corefile); 9833313Sdonn # if vax || tahoe 9933313Sdonn savreg = (Word *) &(ustruct.dummy[ctob(UPAGES)]); 10033313Sdonn # else ifdef mc68000 10133313Sdonn savreg = (Word *) ( 10233313Sdonn &ustruct.dummy[ctob(UPAGES) - 10] - (NREG * sizeof(Word)) 10333313Sdonn ); 10433313Sdonn # endif 10533313Sdonn # ifdef IRIS 10633313Sdonn *mask = savreg[RPS]; 10733313Sdonn # else 10833313Sdonn *mask = savreg[PS]; 10933313Sdonn # endif 11018215Slinton copyregs(savreg, reg); 11118215Slinton *signo = up->u_arg[0]; 11218215Slinton datamap.seekaddr = ctob(UPAGES); 11326334Ssam stkmap.begin = USRSTACK - ctob(up->u_ssize); 11426334Ssam stkmap.end = USRSTACK; 11518215Slinton stkmap.seekaddr = datamap.seekaddr + ctob(up->u_dsize); 11618215Slinton switch (hdr.a_magic) { 11718215Slinton case OMAGIC: 11833313Sdonn datamap.begin = CODESTART; 11933313Sdonn datamap.end = CODESTART + ctob(up->u_tsize) + ctob(up->u_dsize); 12018215Slinton break; 12118215Slinton 12218215Slinton case NMAGIC: 12318215Slinton case ZMAGIC: 12433313Sdonn datamap.begin = (Address) 12533313Sdonn ptob(btop(ctob(up->u_tsize) - 1) + 1) + CODESTART; 12618215Slinton datamap.end = datamap.begin + ctob(up->u_dsize); 12718215Slinton break; 12818215Slinton 12918215Slinton default: 13018215Slinton fatal("bad magic number 0x%x", hdr.a_magic); 13118215Slinton } 13218215Slinton #ifdef UXMAG 13318215Slinton /* 13418215Slinton * Core dump not from this object file? 13518215Slinton */ 13618215Slinton if (hdr.a_magic != 0 and up->u_exdata.ux_mag != 0 and 13718215Slinton hdr.a_magic != up->u_exdata.ux_mag) { 13818215Slinton warning("core dump ignored"); 13918215Slinton coredump = false; 14018215Slinton fclose(corefile); 14118215Slinton fclose(objfile); 14218215Slinton start(nil, nil, nil); 14318215Slinton } 14418215Slinton #endif 14518215Slinton } 1469661Slinton } 1479661Slinton 1489661Slinton public coredump_close() 1499661Slinton { 1509661Slinton fclose(objfile); 1519661Slinton } 1529661Slinton 1539661Slinton public coredump_readtext(buff, addr, nbytes) 1549661Slinton char *buff; 1559661Slinton Address addr; 1569661Slinton int nbytes; 1579661Slinton { 15818215Slinton if (hdr.a_magic == OMAGIC or vaddrs) { 1599661Slinton coredump_readdata(buff, addr, nbytes); 1609661Slinton } else { 16133313Sdonn fseek(objfile, N_TXTOFF(hdr) + addr - CODESTART, 0); 1629661Slinton fread(buff, nbytes, sizeof(Byte), objfile); 1639661Slinton } 1649661Slinton } 1659661Slinton 1669661Slinton public coredump_readdata(buff, addr, nbytes) 1679661Slinton char *buff; 1689661Slinton Address addr; 1699661Slinton int nbytes; 1709661Slinton { 17118215Slinton Address a; 17218215Slinton 17318215Slinton a = addr; 17418215Slinton if (a < datamap.begin) { 17516608Ssam if (hdr.a_magic == OMAGIC) { 17618215Slinton error("[data address 0x%x too low (lb = 0x%x)]", a, datamap.begin); 17716608Ssam } else { 17818215Slinton coredump_readtext(buff, a, nbytes); 17916608Ssam } 18018215Slinton } else if (a > stkmap.end) { 18118215Slinton error("data address 0x%x too high (ub = 0x%x)", a, stkmap.end); 1829661Slinton } else { 18318215Slinton if (vaddrs) { 18418215Slinton vreadfromfile(corefile, a, buff, nbytes); 18518215Slinton } else { 18618215Slinton readfromfile(corefile, a, buff, nbytes); 18718215Slinton } 1889661Slinton } 1899661Slinton } 19018215Slinton 19118215Slinton /* 19218215Slinton * Read a block of data from a memory image, mapping virtual addresses. 19318215Slinton * Have to watch out for page boundaries. 19418215Slinton */ 19518215Slinton 19618215Slinton private vreadfromfile (corefile, v, buff, nbytes) 19718215Slinton File corefile; 19818215Slinton Address v; 19918215Slinton char *buff; 20018215Slinton integer nbytes; 20118215Slinton { 20218215Slinton Address a; 20318215Slinton integer i, remainder, pagesize; 20418215Slinton char *bufp; 20518215Slinton 20618215Slinton a = v; 20718215Slinton pagesize = (integer) ptob(1); 20818215Slinton remainder = pagesize - (a mod pagesize); 20918215Slinton if (remainder >= nbytes) { 21018215Slinton readfromfile(corefile, vmap(a), buff, nbytes); 21118215Slinton } else { 21218215Slinton readfromfile(corefile, vmap(a), buff, remainder); 21318215Slinton a += remainder; 21418215Slinton i = nbytes - remainder; 21518215Slinton bufp = buff + remainder; 21618215Slinton while (i > pagesize) { 21718215Slinton readfromfile(corefile, vmap(a), bufp, pagesize); 21818215Slinton a += pagesize; 21918215Slinton bufp += pagesize; 22018215Slinton i -= pagesize; 22118215Slinton } 22218215Slinton readfromfile(corefile, vmap(a), bufp, i); 22318215Slinton } 22418215Slinton } 22518215Slinton 22618215Slinton private readfromfile (f, a, buff, nbytes) 22718215Slinton File f; 22818215Slinton Address a; 22918215Slinton char *buff; 23018215Slinton integer nbytes; 23118215Slinton { 23218215Slinton integer fileaddr; 23318215Slinton 23418215Slinton if (a < stkmap.begin) { 23518215Slinton fileaddr = datamap.seekaddr + a - datamap.begin; 23618215Slinton } else { 23718215Slinton fileaddr = stkmap.seekaddr + a - stkmap.begin; 23818215Slinton } 23918215Slinton fseek(f, fileaddr, 0); 24018215Slinton fread(buff, nbytes, sizeof(Byte), f); 24118215Slinton } 242