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