Blob


1 /*
2 * init routines
3 */
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 void
16 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 void
28 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 } else
43 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 void
76 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 } else
92 error("Invalid base address");
93 if (expr(0))
94 map->seg[i].size = expv - map->seg[i].base;
95 else
96 error("Invalid end address");
97 if (expr(0))
98 map->seg[i].offset = expv;
99 else
100 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 } else
115 reread();
116 */
119 void
120 kmsys(void)
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;
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;
136 void
137 attachprocess(void)
139 if (!adrflg) {
140 dprint("used pid$a\n");
141 return;
143 pid = adrval;
144 setcor();