Blame


1 84114f06 2004-04-19 devnull /*
2 84114f06 2004-04-19 devnull * init routines
3 84114f06 2004-04-19 devnull */
4 84114f06 2004-04-19 devnull #include "defs.h"
5 84114f06 2004-04-19 devnull #include "fns.h"
6 84114f06 2004-04-19 devnull
7 84114f06 2004-04-19 devnull char *symfil;
8 84114f06 2004-04-19 devnull char *corfil;
9 84114f06 2004-04-19 devnull
10 84114f06 2004-04-19 devnull Map *symmap;
11 84114f06 2004-04-19 devnull Map *cormap;
12 84114f06 2004-04-19 devnull Regs *correg;
13 84114f06 2004-04-19 devnull Map *dotmap;
14 84114f06 2004-04-19 devnull
15 84114f06 2004-04-19 devnull void
16 84114f06 2004-04-19 devnull setsym(void)
17 84114f06 2004-04-19 devnull {
18 30880121 2005-01-07 devnull if(symhdr && symopen(symhdr) < 0)
19 30880121 2005-01-07 devnull dprint("symopen: %r\n");
20 84114f06 2004-04-19 devnull /*
21 84114f06 2004-04-19 devnull Symbol s;
22 84114f06 2004-04-19 devnull if (mach->sbreg && lookup(0, mach->sbreg, &s) < 0)
23 84114f06 2004-04-19 devnull mach->sb = s.loc.addr;
24 84114f06 2004-04-19 devnull */
25 84114f06 2004-04-19 devnull }
26 84114f06 2004-04-19 devnull
27 84114f06 2004-04-19 devnull void
28 84114f06 2004-04-19 devnull setcor(void)
29 84114f06 2004-04-19 devnull {
30 b030a6c3 2005-01-23 devnull static int mapped;
31 84114f06 2004-04-19 devnull
32 b030a6c3 2005-01-23 devnull if (corhdr) {
33 b030a6c3 2005-01-23 devnull if (!mapped) {
34 84114f06 2004-04-19 devnull if (mapfile(corhdr, 0, cormap, &correg) < 0)
35 84114f06 2004-04-19 devnull dprint("mapfile %s: %r\n", corfil);
36 b030a6c3 2005-01-23 devnull mapped = 1;
37 b030a6c3 2005-01-23 devnull }
38 b030a6c3 2005-01-23 devnull free(correg);
39 b030a6c3 2005-01-23 devnull if (pid == 0 && corhdr->nthread > 0)
40 b030a6c3 2005-01-23 devnull pid = corhdr->thread[0].id;
41 b030a6c3 2005-01-23 devnull correg = coreregs(corhdr, pid);
42 b030a6c3 2005-01-23 devnull if(correg == nil)
43 b030a6c3 2005-01-23 devnull dprint("no such pid in core dump\n");
44 b030a6c3 2005-01-23 devnull } else {
45 b030a6c3 2005-01-23 devnull unmapproc(cormap);
46 b030a6c3 2005-01-23 devnull unmapfile(corhdr, cormap);
47 b030a6c3 2005-01-23 devnull free(correg);
48 b030a6c3 2005-01-23 devnull correg = nil;
49 b030a6c3 2005-01-23 devnull
50 b030a6c3 2005-01-23 devnull if (pid > 0) {
51 b030a6c3 2005-01-23 devnull if (mapproc(pid, cormap, &correg) < 0)
52 b030a6c3 2005-01-23 devnull dprint("mapproc %d: %r\n", pid);
53 84114f06 2004-04-19 devnull } else
54 84114f06 2004-04-19 devnull dprint("no core image\n");
55 84114f06 2004-04-19 devnull }
56 84114f06 2004-04-19 devnull kmsys();
57 84114f06 2004-04-19 devnull return;
58 84114f06 2004-04-19 devnull }
59 84114f06 2004-04-19 devnull
60 84114f06 2004-04-19 devnull Map*
61 84114f06 2004-04-19 devnull dumbmap(int fd)
62 84114f06 2004-04-19 devnull {
63 84114f06 2004-04-19 devnull Map *dumb;
64 84114f06 2004-04-19 devnull Seg s;
65 84114f06 2004-04-19 devnull
66 84114f06 2004-04-19 devnull dumb = allocmap();
67 84114f06 2004-04-19 devnull memset(&s, 0, sizeof s);
68 84114f06 2004-04-19 devnull s.fd = fd;
69 84114f06 2004-04-19 devnull s.base = 0;
70 84114f06 2004-04-19 devnull s.offset = 0;
71 84114f06 2004-04-19 devnull s.size = 0xFFFFFFFF;
72 84114f06 2004-04-19 devnull s.name = "data";
73 84114f06 2004-04-19 devnull s.file = "<dumb>";
74 84114f06 2004-04-19 devnull if(addseg(dumb, s) < 0){
75 84114f06 2004-04-19 devnull freemap(dumb);
76 84114f06 2004-04-19 devnull return nil;
77 84114f06 2004-04-19 devnull }
78 84114f06 2004-04-19 devnull if(mach == nil)
79 84114f06 2004-04-19 devnull mach = machcpu;
80 84114f06 2004-04-19 devnull return dumb;
81 84114f06 2004-04-19 devnull }
82 84114f06 2004-04-19 devnull
83 84114f06 2004-04-19 devnull /*
84 84114f06 2004-04-19 devnull * set up maps for a direct process image (/proc)
85 84114f06 2004-04-19 devnull */
86 84114f06 2004-04-19 devnull void
87 84114f06 2004-04-19 devnull cmdmap(Map *map)
88 84114f06 2004-04-19 devnull {
89 84114f06 2004-04-19 devnull int i;
90 84114f06 2004-04-19 devnull char name[MAXSYM];
91 84114f06 2004-04-19 devnull
92 84114f06 2004-04-19 devnull rdc();
93 84114f06 2004-04-19 devnull readsym(name);
94 84114f06 2004-04-19 devnull i = findseg(map, name, nil);
95 84114f06 2004-04-19 devnull if (i < 0) /* not found */
96 84114f06 2004-04-19 devnull error("Invalid map name");
97 84114f06 2004-04-19 devnull
98 84114f06 2004-04-19 devnull if (expr(0)) {
99 cbeb0b26 2006-04-01 devnull /* if (strcmp(name, "text") == 0) */
100 cbeb0b26 2006-04-01 devnull /* textseg(expv, &fhdr); */
101 84114f06 2004-04-19 devnull map->seg[i].base = expv;
102 84114f06 2004-04-19 devnull } else
103 fa325e9b 2020-01-10 cross error("Invalid base address");
104 84114f06 2004-04-19 devnull if (expr(0))
105 84114f06 2004-04-19 devnull map->seg[i].size = expv - map->seg[i].base;
106 84114f06 2004-04-19 devnull else
107 fa325e9b 2020-01-10 cross error("Invalid end address");
108 84114f06 2004-04-19 devnull if (expr(0))
109 fa325e9b 2020-01-10 cross map->seg[i].offset = expv;
110 84114f06 2004-04-19 devnull else
111 fa325e9b 2020-01-10 cross error("Invalid file offset");
112 84114f06 2004-04-19 devnull /*
113 84114f06 2004-04-19 devnull if (rdc()=='?' && map == cormap) {
114 84114f06 2004-04-19 devnull if (fcor)
115 84114f06 2004-04-19 devnull close(fcor);
116 84114f06 2004-04-19 devnull fcor=fsym;
117 84114f06 2004-04-19 devnull corfil = symfil;
118 84114f06 2004-04-19 devnull cormap = symmap;
119 84114f06 2004-04-19 devnull } else if (lastc == '/' && map == symmap) {
120 84114f06 2004-04-19 devnull if (fsym)
121 84114f06 2004-04-19 devnull close(fsym);
122 84114f06 2004-04-19 devnull fsym=fcor;
123 84114f06 2004-04-19 devnull symfil=corfil;
124 84114f06 2004-04-19 devnull symmap=cormap;
125 84114f06 2004-04-19 devnull } else
126 84114f06 2004-04-19 devnull reread();
127 84114f06 2004-04-19 devnull */
128 84114f06 2004-04-19 devnull }
129 84114f06 2004-04-19 devnull
130 84114f06 2004-04-19 devnull void
131 84114f06 2004-04-19 devnull kmsys(void)
132 84114f06 2004-04-19 devnull {
133 84114f06 2004-04-19 devnull int i;
134 84114f06 2004-04-19 devnull
135 84114f06 2004-04-19 devnull i = findseg(symmap, "text", symfil);
136 84114f06 2004-04-19 devnull if (i >= 0) {
137 84114f06 2004-04-19 devnull symmap->seg[i].base = symmap->seg[i].base&~mach->ktmask;
138 84114f06 2004-04-19 devnull symmap->seg[i].size = -symmap->seg[i].base;
139 84114f06 2004-04-19 devnull }
140 84114f06 2004-04-19 devnull i = findseg(symmap, "data", symfil);
141 84114f06 2004-04-19 devnull if (i >= 0) {
142 84114f06 2004-04-19 devnull symmap->seg[i].base = symmap->seg[i].base&~mach->ktmask;
143 84114f06 2004-04-19 devnull symmap->seg[i].size = -symmap->seg[i].base;
144 84114f06 2004-04-19 devnull }
145 84114f06 2004-04-19 devnull }
146 84114f06 2004-04-19 devnull
147 84114f06 2004-04-19 devnull void
148 84114f06 2004-04-19 devnull attachprocess(void)
149 84114f06 2004-04-19 devnull {
150 84114f06 2004-04-19 devnull if (!adrflg) {
151 b030a6c3 2005-01-23 devnull dprint("usage: pid$a\n");
152 84114f06 2004-04-19 devnull return;
153 84114f06 2004-04-19 devnull }
154 84114f06 2004-04-19 devnull pid = adrval;
155 84114f06 2004-04-19 devnull setcor();
156 84114f06 2004-04-19 devnull }