|
|
1.1 ! root 1: /* Copyright (c) 1982 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)coredump.c 1.4 1/25/83"; ! 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(corefile); ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.