t386 - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       t386 (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);