Blame


1 0a61c07d 2004-04-19 devnull // 386 support
2 0a61c07d 2004-04-19 devnull
3 0a61c07d 2004-04-19 devnull defn acidinit() // Called after all the init modules are loaded
4 0a61c07d 2004-04-19 devnull {
5 0a61c07d 2004-04-19 devnull bplist = {};
6 0a61c07d 2004-04-19 devnull bpfmt = 'b';
7 0a61c07d 2004-04-19 devnull
8 0a61c07d 2004-04-19 devnull srcpath = {
9 0a61c07d 2004-04-19 devnull "./",
10 0a61c07d 2004-04-19 devnull "/sys/src/libc/port/",
11 0a61c07d 2004-04-19 devnull "/sys/src/libc/9sys/",
12 0a61c07d 2004-04-19 devnull "/sys/src/libc/386/"
13 0a61c07d 2004-04-19 devnull };
14 0a61c07d 2004-04-19 devnull
15 0a61c07d 2004-04-19 devnull srcfiles = {}; // list of loaded files
16 0a61c07d 2004-04-19 devnull srctext = {}; // the text of the files
17 0a61c07d 2004-04-19 devnull }
18 0a61c07d 2004-04-19 devnull
19 0a61c07d 2004-04-19 devnull defn linkreg(addr)
20 0a61c07d 2004-04-19 devnull {
21 0a61c07d 2004-04-19 devnull return {};
22 0a61c07d 2004-04-19 devnull }
23 0a61c07d 2004-04-19 devnull
24 0a61c07d 2004-04-19 devnull defn stk() // trace
25 0a61c07d 2004-04-19 devnull {
26 0a61c07d 2004-04-19 devnull _stk({"PC", *PC, "SP", *SP}, 0);
27 0a61c07d 2004-04-19 devnull }
28 0a61c07d 2004-04-19 devnull
29 0a61c07d 2004-04-19 devnull defn lstk() // trace with locals
30 0a61c07d 2004-04-19 devnull {
31 0a61c07d 2004-04-19 devnull _stk({"PC", *PC, "SP", *SP}, 1);
32 0a61c07d 2004-04-19 devnull }
33 0a61c07d 2004-04-19 devnull
34 0a61c07d 2004-04-19 devnull defn gpr() // print general(hah hah!) purpose registers
35 0a61c07d 2004-04-19 devnull {
36 0a61c07d 2004-04-19 devnull print("AX\t", *AX, " BX\t", *BX, " CX\t", *CX, " DX\t", *DX, "\n");
37 0a61c07d 2004-04-19 devnull print("DI\t", *DI, " SI\t", *SI, " BP\t", *BP, "\n");
38 0a61c07d 2004-04-19 devnull }
39 0a61c07d 2004-04-19 devnull
40 0a61c07d 2004-04-19 devnull defn spr() // print special processor registers
41 0a61c07d 2004-04-19 devnull {
42 0a61c07d 2004-04-19 devnull local pc;
43 0a61c07d 2004-04-19 devnull local cause;
44 0a61c07d 2004-04-19 devnull
45 0a61c07d 2004-04-19 devnull pc = *PC;
46 0a61c07d 2004-04-19 devnull print("PC\t", pc, " ", fmt(pc, 'a'), " ");
47 0a61c07d 2004-04-19 devnull pfl(pc);
48 0a61c07d 2004-04-19 devnull print("SP\t", *SP, " ECODE ", *ECODE, " EFLAG ", *EFLAGS, "\n");
49 0a61c07d 2004-04-19 devnull print("CS\t", *CS, " DS\t ", *DS, " SS\t", *SS, "\n");
50 0a61c07d 2004-04-19 devnull print("GS\t", *GS, " FS\t ", *FS, " ES\t", *ES, "\n");
51 0a61c07d 2004-04-19 devnull
52 0a61c07d 2004-04-19 devnull cause = *TRAP;
53 0a61c07d 2004-04-19 devnull print("TRAP\t", cause, " ", reason(cause), "\n");
54 0a61c07d 2004-04-19 devnull }
55 0a61c07d 2004-04-19 devnull
56 0a61c07d 2004-04-19 devnull defn regs() // print all registers
57 0a61c07d 2004-04-19 devnull {
58 0a61c07d 2004-04-19 devnull spr();
59 0a61c07d 2004-04-19 devnull gpr();
60 0a61c07d 2004-04-19 devnull }
61 0a61c07d 2004-04-19 devnull
62 0a61c07d 2004-04-19 devnull defn mmregs()
63 0a61c07d 2004-04-19 devnull {
64 0a61c07d 2004-04-19 devnull print("MM0\t", *MM0, " MM1\t", *MM1, "\n");
65 0a61c07d 2004-04-19 devnull print("MM2\t", *MM2, " MM3\t", *MM3, "\n");
66 0a61c07d 2004-04-19 devnull print("MM4\t", *MM4, " MM5\t", *MM5, "\n");
67 0a61c07d 2004-04-19 devnull print("MM6\t", *MM6, " MM7\t", *MM7, "\n");
68 0a61c07d 2004-04-19 devnull }
69 0a61c07d 2004-04-19 devnull
70 74685416 2005-11-28 devnull defn pfixstop(pid)
71 74685416 2005-11-28 devnull {
72 74685416 2005-11-28 devnull if *fmt(*PC-1, 'b') == 0xCC then {
73 74685416 2005-11-28 devnull // Linux stops us after the breakpoint, not at it
74 74685416 2005-11-28 devnull *PC = *PC-1;
75 74685416 2005-11-28 devnull }
76 74685416 2005-11-28 devnull }
77 74685416 2005-11-28 devnull
78 74685416 2005-11-28 devnull
79 0a61c07d 2004-04-19 devnull defn pstop(pid)
80 0a61c07d 2004-04-19 devnull {
81 0a61c07d 2004-04-19 devnull local l;
82 0a61c07d 2004-04-19 devnull local pc;
83 74685416 2005-11-28 devnull local why;
84 0a61c07d 2004-04-19 devnull
85 0a61c07d 2004-04-19 devnull pc = *PC;
86 0a61c07d 2004-04-19 devnull
87 74685416 2005-11-28 devnull // FIgure out why we stopped.
88 74685416 2005-11-28 devnull if *fmt(pc, 'b') == 0xCC then {
89 74685416 2005-11-28 devnull why = "breakpoint";
90 74685416 2005-11-28 devnull
91 74685416 2005-11-28 devnull // fix up instruction for print; will put back later
92 74685416 2005-11-28 devnull *pc = @pc;
93 74685416 2005-11-28 devnull } else if *(pc-2\x) == 0x80CD then {
94 74685416 2005-11-28 devnull pc = pc-2;
95 74685416 2005-11-28 devnull why = "system call";
96 74685416 2005-11-28 devnull } else
97 74685416 2005-11-28 devnull why = "stopped";
98 0a61c07d 2004-04-19 devnull
99 74685416 2005-11-28 devnull if printstopped then {
100 74685416 2005-11-28 devnull print(pid,": ", why, "\t");
101 74685416 2005-11-28 devnull print(fmt(pc, 'a'), "\t", *fmt(pc, 'i'), "\n");
102 74685416 2005-11-28 devnull }
103 74685416 2005-11-28 devnull
104 74685416 2005-11-28 devnull if why == "breakpoint" then
105 74685416 2005-11-28 devnull *fmt(pc, bpfmt) = bpinst;
106 74685416 2005-11-28 devnull
107 74685416 2005-11-28 devnull if printstopped && notes then {
108 0a61c07d 2004-04-19 devnull if notes[0] != "sys: breakpoint" then {
109 0a61c07d 2004-04-19 devnull print("Notes pending:\n");
110 0a61c07d 2004-04-19 devnull l = notes;
111 0a61c07d 2004-04-19 devnull while l do {
112 0a61c07d 2004-04-19 devnull print("\t", head l, "\n");
113 0a61c07d 2004-04-19 devnull l = tail l;
114 0a61c07d 2004-04-19 devnull }
115 0a61c07d 2004-04-19 devnull }
116 0a61c07d 2004-04-19 devnull }
117 0a61c07d 2004-04-19 devnull }
118 0a61c07d 2004-04-19 devnull
119 0a61c07d 2004-04-19 devnull aggr Ureg
120 0a61c07d 2004-04-19 devnull {
121 0a61c07d 2004-04-19 devnull 'U' 0 di;
122 0a61c07d 2004-04-19 devnull 'U' 4 si;
123 0a61c07d 2004-04-19 devnull 'U' 8 bp;
124 0a61c07d 2004-04-19 devnull 'U' 12 nsp;
125 0a61c07d 2004-04-19 devnull 'U' 16 bx;
126 0a61c07d 2004-04-19 devnull 'U' 20 dx;
127 0a61c07d 2004-04-19 devnull 'U' 24 cx;
128 0a61c07d 2004-04-19 devnull 'U' 28 ax;
129 0a61c07d 2004-04-19 devnull 'U' 32 gs;
130 0a61c07d 2004-04-19 devnull 'U' 36 fs;
131 0a61c07d 2004-04-19 devnull 'U' 40 es;
132 0a61c07d 2004-04-19 devnull 'U' 44 ds;
133 0a61c07d 2004-04-19 devnull 'U' 48 trap;
134 0a61c07d 2004-04-19 devnull 'U' 52 ecode;
135 0a61c07d 2004-04-19 devnull 'U' 56 pc;
136 0a61c07d 2004-04-19 devnull 'U' 60 cs;
137 0a61c07d 2004-04-19 devnull 'U' 64 flags;
138 0a61c07d 2004-04-19 devnull {
139 0a61c07d 2004-04-19 devnull 'U' 68 usp;
140 0a61c07d 2004-04-19 devnull 'U' 68 sp;
141 0a61c07d 2004-04-19 devnull };
142 0a61c07d 2004-04-19 devnull 'U' 72 ss;
143 0a61c07d 2004-04-19 devnull };
144 0a61c07d 2004-04-19 devnull
145 0a61c07d 2004-04-19 devnull defn
146 0a61c07d 2004-04-19 devnull Ureg(addr) {
147 0a61c07d 2004-04-19 devnull complex Ureg addr;
148 0a61c07d 2004-04-19 devnull print(" di ", addr.di, "\n");
149 0a61c07d 2004-04-19 devnull print(" si ", addr.si, "\n");
150 0a61c07d 2004-04-19 devnull print(" bp ", addr.bp, "\n");
151 0a61c07d 2004-04-19 devnull print(" nsp ", addr.nsp, "\n");
152 0a61c07d 2004-04-19 devnull print(" bx ", addr.bx, "\n");
153 0a61c07d 2004-04-19 devnull print(" dx ", addr.dx, "\n");
154 0a61c07d 2004-04-19 devnull print(" cx ", addr.cx, "\n");
155 0a61c07d 2004-04-19 devnull print(" ax ", addr.ax, "\n");
156 0a61c07d 2004-04-19 devnull print(" gs ", addr.gs, "\n");
157 0a61c07d 2004-04-19 devnull print(" fs ", addr.fs, "\n");
158 0a61c07d 2004-04-19 devnull print(" es ", addr.es, "\n");
159 0a61c07d 2004-04-19 devnull print(" ds ", addr.ds, "\n");
160 0a61c07d 2004-04-19 devnull print(" trap ", addr.trap, "\n");
161 0a61c07d 2004-04-19 devnull print(" ecode ", addr.ecode, "\n");
162 0a61c07d 2004-04-19 devnull print(" pc ", addr.pc, "\n");
163 0a61c07d 2004-04-19 devnull print(" cs ", addr.cs, "\n");
164 0a61c07d 2004-04-19 devnull print(" flags ", addr.flags, "\n");
165 0a61c07d 2004-04-19 devnull print(" sp ", addr.sp, "\n");
166 0a61c07d 2004-04-19 devnull print(" ss ", addr.ss, "\n");
167 0a61c07d 2004-04-19 devnull };
168 0a61c07d 2004-04-19 devnull sizeofUreg = 76;
169 0a61c07d 2004-04-19 devnull
170 0a61c07d 2004-04-19 devnull aggr Linkdebug
171 0a61c07d 2004-04-19 devnull {
172 0a61c07d 2004-04-19 devnull 'X' 0 version;
173 0a61c07d 2004-04-19 devnull 'X' 4 map;
174 0a61c07d 2004-04-19 devnull };
175 0a61c07d 2004-04-19 devnull
176 0a61c07d 2004-04-19 devnull aggr Linkmap
177 0a61c07d 2004-04-19 devnull {
178 0a61c07d 2004-04-19 devnull 'X' 0 addr;
179 0a61c07d 2004-04-19 devnull 'X' 4 name;
180 0a61c07d 2004-04-19 devnull 'X' 8 dynsect;
181 0a61c07d 2004-04-19 devnull 'X' 12 next;
182 0a61c07d 2004-04-19 devnull 'X' 16 prev;
183 0a61c07d 2004-04-19 devnull };
184 0a61c07d 2004-04-19 devnull
185 0a61c07d 2004-04-19 devnull defn
186 0a61c07d 2004-04-19 devnull linkdebug()
187 0a61c07d 2004-04-19 devnull {
188 0a61c07d 2004-04-19 devnull local a;
189 0a61c07d 2004-04-19 devnull
190 0a61c07d 2004-04-19 devnull if !havesymbol("_DYNAMIC") then
191 0a61c07d 2004-04-19 devnull return 0;
192 0a61c07d 2004-04-19 devnull
193 0a61c07d 2004-04-19 devnull a = _DYNAMIC;
194 0a61c07d 2004-04-19 devnull while *a != 0 do {
195 0a61c07d 2004-04-19 devnull if *a == 21 then // 21 == DT_DEBUG
196 0a61c07d 2004-04-19 devnull return *(a+4);
197 0a61c07d 2004-04-19 devnull a = a+8;
198 0a61c07d 2004-04-19 devnull }
199 0a61c07d 2004-04-19 devnull return 0;
200 0a61c07d 2004-04-19 devnull }
201 0a61c07d 2004-04-19 devnull
202 0a61c07d 2004-04-19 devnull defn
203 7284df18 2004-04-19 devnull dynamicmap()
204 0a61c07d 2004-04-19 devnull {
205 6c885647 2004-04-20 devnull if systype == "linux" || systype == "freebsd" then {
206 0a61c07d 2004-04-19 devnull local r, m, n;
207 0a61c07d 2004-04-19 devnull
208 0a61c07d 2004-04-19 devnull r = linkdebug();
209 0a61c07d 2004-04-19 devnull if r then {
210 0a61c07d 2004-04-19 devnull complex Linkdebug r;
211 0a61c07d 2004-04-19 devnull m = r.map;
212 0a61c07d 2004-04-19 devnull n = 0;
213 0a61c07d 2004-04-19 devnull while m != 0 && n < 100 do {
214 0a61c07d 2004-04-19 devnull complex Linkmap m;
215 6c885647 2004-04-20 devnull if m.name && *(m.name\b) && access(*(m.name\s)) then
216 08ddcb74 2005-02-11 devnull print("textfile({\"", *(m.name\s), "\", ", m.addr\X, "});\n");
217 0a61c07d 2004-04-19 devnull m = m.next;
218 0a61c07d 2004-04-19 devnull n = n+1;
219 0a61c07d 2004-04-19 devnull }
220 0a61c07d 2004-04-19 devnull }
221 0a61c07d 2004-04-19 devnull }
222 7284df18 2004-04-19 devnull }
223 0a61c07d 2004-04-19 devnull
224 7284df18 2004-04-19 devnull defn
225 7284df18 2004-04-19 devnull acidmap()
226 7284df18 2004-04-19 devnull {
227 08ddcb74 2005-02-11 devnull // dynamicmap();
228 7284df18 2004-04-19 devnull acidtypes();
229 0a61c07d 2004-04-19 devnull }
230 0a61c07d 2004-04-19 devnull
231 0a61c07d 2004-04-19 devnull print(acidfile);