Blob
1 /*2 * init routines3 */4 #include "defs.h"5 #include "fns.h"7 char *symfil;8 char *corfil;10 Map *symmap;11 Map *cormap;12 Regs *correg;13 Map *dotmap;15 void16 setsym(void)17 {18 if(symhdr && symopen(symhdr) < 0)19 dprint("symopen: %r\n");20 /*21 Symbol s;22 if (mach->sbreg && lookup(0, mach->sbreg, &s) < 0)23 mach->sb = s.loc.addr;24 */25 }27 void28 setcor(void)29 {30 unmapproc(cormap);31 unmapfile(corhdr, cormap);32 free(correg);33 correg = nil;35 if (pid > 0) {36 if (mapproc(pid, cormap, &correg) < 0)37 dprint("mapproc %d: %r\n", pid);38 } else {39 if (corhdr) {40 if (mapfile(corhdr, 0, cormap, &correg) < 0)41 dprint("mapfile %s: %r\n", corfil);42 } else43 dprint("no core image\n");44 }45 kmsys();46 return;47 }49 Map*50 dumbmap(int fd)51 {52 Map *dumb;53 Seg s;55 dumb = allocmap();56 memset(&s, 0, sizeof s);57 s.fd = fd;58 s.base = 0;59 s.offset = 0;60 s.size = 0xFFFFFFFF;61 s.name = "data";62 s.file = "<dumb>";63 if(addseg(dumb, s) < 0){64 freemap(dumb);65 return nil;66 }67 if(mach == nil)68 mach = machcpu;69 return dumb;70 }72 /*73 * set up maps for a direct process image (/proc)74 */75 void76 cmdmap(Map *map)77 {78 int i;79 char name[MAXSYM];81 rdc();82 readsym(name);83 i = findseg(map, name, nil);84 if (i < 0) /* not found */85 error("Invalid map name");87 if (expr(0)) {88 // if (strcmp(name, "text") == 0)89 // textseg(expv, &fhdr);90 map->seg[i].base = expv;91 } else92 error("Invalid base address");93 if (expr(0))94 map->seg[i].size = expv - map->seg[i].base;95 else96 error("Invalid end address");97 if (expr(0))98 map->seg[i].offset = expv;99 else100 error("Invalid file offset");101 /*102 if (rdc()=='?' && map == cormap) {103 if (fcor)104 close(fcor);105 fcor=fsym;106 corfil = symfil;107 cormap = symmap;108 } else if (lastc == '/' && map == symmap) {109 if (fsym)110 close(fsym);111 fsym=fcor;112 symfil=corfil;113 symmap=cormap;114 } else115 reread();116 */117 }119 void120 kmsys(void)121 {122 int i;124 i = findseg(symmap, "text", symfil);125 if (i >= 0) {126 symmap->seg[i].base = symmap->seg[i].base&~mach->ktmask;127 symmap->seg[i].size = -symmap->seg[i].base;128 }129 i = findseg(symmap, "data", symfil);130 if (i >= 0) {131 symmap->seg[i].base = symmap->seg[i].base&~mach->ktmask;132 symmap->seg[i].size = -symmap->seg[i].base;133 }134 }136 void137 attachprocess(void)138 {139 if (!adrflg) {140 dprint("used pid$a\n");141 return;142 }143 pid = adrval;144 setcor();145 }