tamd64 - 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
       ---
       tamd64 (7064B)
       ---
            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/amd64/"
           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         print("R8\t", *R8, " R9\t", *R9, " R10\t", *R10, " R11\t", *R11, "\n");
           39         print("R12\t", *R12, " R13\t", *R13, " R14\t", *R14, " R15\t", *R15, "\n");
           40 }
           41 
           42 defn spr()                                // print special processor registers
           43 {
           44         local pc;
           45         local cause;
           46 
           47         pc = *PC;
           48         print("PC\t", pc, " ", fmt(pc, 'a'), "  ");
           49         pfl(pc);
           50         print("SP\t", *SP, " FLAGS ", *FLAGS, "\n");
           51         print("CS\t", *CS, " DS\t ", *DS, " SS\t", *SS, "\n");
           52         print("GS\t", *GS, " FS\t ", *FS, " ES\t", *ES, "\n");
           53         
           54         cause = *TRAP;
           55         print("TRAP\t", cause, " ", reason(cause), "\n");
           56 }
           57 
           58 defn regs()                                // print all registers
           59 {
           60         spr();
           61         gpr();
           62 }
           63 
           64 defn mmregs()
           65 {
           66         print("MM0\t", *MM0, " MM1\t", *MM1, "\n");
           67         print("MM2\t", *MM2, " MM3\t", *MM3, "\n");
           68         print("MM4\t", *MM4, " MM5\t", *MM5, "\n");
           69         print("MM6\t", *MM6, " MM7\t", *MM7, "\n");
           70 }
           71 
           72 defn pfixstop(pid)
           73 {
           74         if *fmt(*PC-1, 'b') == 0xCC then {
           75                 // Linux stops us after the breakpoint, not at it
           76                 *PC = *PC-1;
           77         }
           78 }
           79 
           80 
           81 defn pstop(pid)
           82 {
           83         local l;
           84         local pc;
           85         local why;
           86 
           87         pc = *PC;
           88 
           89         // FIgure out why we stopped.
           90         if *fmt(pc, 'b') == 0xCC then {
           91                 why = "breakpoint";
           92                 
           93                 // fix up instruction for print; will put back later
           94                 *pc = @pc;
           95         } else if *(pc-2\x) == 0x80CD then {
           96                 pc = pc-2;
           97                 why = "system call";
           98         } else
           99                 why = "stopped";
          100 
          101         if printstopped then {
          102                 print(pid,": ", why, "\t");
          103                 print(fmt(pc, 'a'), "\t", *fmt(pc, 'i'), "\n");
          104         }
          105         
          106         if why == "breakpoint" then
          107                 *fmt(pc, bpfmt) = bpinst;
          108         
          109         if printstopped && notes then {
          110                 if notes[0] != "sys: breakpoint" then {
          111                         print("Notes pending:\n");
          112                         l = notes;
          113                         while l do {
          114                                 print("\t", head l, "\n");
          115                                 l = tail l;
          116                         }
          117                 }
          118         }
          119 }
          120 
          121 aggr Ureg
          122 {
          123         'Y' 0 ax;
          124         'Y' 8 bx;
          125         'Y' 16 cx;
          126         'Y' 24 dx;
          127         'Y' 32 si;
          128         'Y' 40 di;
          129         'Y' 48 bp;
          130         'Y' 56 r8;
          131         'Y' 64 r9;
          132         'Y' 72 r10;
          133         'Y' 80 r11;
          134         'Y' 88 r12;
          135         'Y' 96 r13;
          136         'Y' 104 r14;
          137         'Y' 112 r15;
          138 
          139         'u' 120 ds;
          140         'u' 122 es;
          141         'u' 124 fs;
          142         'u' 126 gs;
          143         
          144         'Y' 128 type;
          145         'Y' 136 error;
          146         'Y' 144 pc;
          147         'Y' 152 cs;
          148         'Y' 160 flags;
          149         'Y' 168 sp;
          150         'Y' 176 ss;
          151 };
          152 
          153 defn
          154 Ureg(addr) {
          155         complex Ureg addr;
          156         print("        ax        ", addr.ax, "\n");
          157         print("        bx        ", addr.bx, "\n");
          158         print("        cx        ", addr.cx, "\n");
          159         print("        dx        ", addr.dx, "\n");
          160         print("        si        ", addr.si, "\n");
          161         print("        di        ", addr.di, "\n");
          162         print("        bp        ", addr.bp, "\n");
          163         print("        r8        ", addr.r8, "\n");
          164         print("        r9        ", addr.r9, "\n");
          165         print("        r10        ", addr.r10, "\n");
          166         print("        r11        ", addr.r11, "\n");
          167         print("        r12        ", addr.r12, "\n");
          168         print("        r13        ", addr.r13, "\n");
          169         print("        r14        ", addr.r14, "\n");
          170         print("        r15        ", addr.r15, "\n");
          171         print("        ds        ", addr.ds, "\n");
          172         print("        es        ", addr.es, "\n");
          173         print("        fs        ", addr.fs, "\n");
          174         print("        gs        ", addr.gs, "\n");
          175         print("        type        ", addr.type, "\n");
          176         print("        error        ", addr.error, "\n");
          177         print("        pc        ", addr.pc, "\n");
          178         print("        cs        ", addr.cs, "\n");
          179         print("        flags        ", addr.flags, "\n");
          180         print("        sp        ", addr.sp, "\n");
          181         print("        ss        ", addr.ss, "\n");
          182 };
          183 sizeofUreg = 184;
          184 
          185 aggr freebsd_amd64_siginfo
          186 {
          187         'X' 0 signo;
          188         'X' 4 errno;
          189         'X' 8 code;
          190         'X' 12 pid;
          191         'X' 16 uid;
          192         'X' 20 status;
          193         'Y' 24 addr;
          194         'Y' 32 sigval;
          195         's' 40 reason;
          196 };
          197 
          198 defn
          199 freebsd_amd64_siginfo(addr) {
          200         complex freebsd_amd64_siginfo addr;
          201         print("        signo        ", addr.signo, "\n");
          202         print("        errno        ", addr.errno, "\n");
          203         print("        code        ", addr.code, "\n");
          204         print("        pid        ", addr.pid, "\n");
          205         print("        uid        ", addr.uid, "\n");
          206         print("        status        ", addr.status, "\n");
          207         print("        addr        ", addr.addr, "\n");
          208         print("        sigval        ", addr.sigval, "\n");
          209 };
          210 
          211 aggr freebsd_amd64_ucontext
          212 {
          213         'X' 0 sigmask0;
          214         'X' 4 sigmask1;
          215         'X' 8 sigmask2;
          216         'X' 12 sigmask3;
          217         'Y' 16 onstack;
          218         'Y' 24 rdi;
          219         'Y' 32 rsi;
          220         'Y' 40 rdx;
          221         'Y' 48 rcx;
          222         'Y' 56 r8;
          223         'Y' 64 r9;
          224         'Y' 72 rax;
          225         'Y' 80 rbx;
          226         'Y' 88 rbp;
          227         'Y' 96 r10;
          228         'Y' 104 r11;
          229         'Y' 112 r12;
          230         'Y' 120 r13;
          231         'Y' 128 r14;
          232         'Y' 136 r15;
          233         'X' 144 trapno;
          234         'x' 148 fs;
          235         'x' 150 gs;
          236         'Y' 152 addr;
          237         'X' 160 flags;
          238         'x' 164 es;
          239         'x' 166 ds;
          240         'Y' 168 err;
          241         'Y' 176 rip;
          242         'Y' 184 cs;
          243         'Y' 192 rflags;
          244         'Y' 200 rsp;
          245         'Y' 208 ss;
          246         'Y' 216 len;
          247         'Y' 224 fpformat;
          248         'Y' 232 ownedfp;
          249         'Y' 240 fpstate0;
          250         'Y' 752 fsbase;
          251         'Y' 760 gsbase;
          252 };
          253 
          254 defn
          255 freebsd_amd64_ucontext(addr) {
          256         complex freebsd_amd64_ucontext addr;
          257         print("        sigmask0        ", addr.sigmask0, "\n");
          258         print("        sigmask1        ", addr.sigmask1, "\n");
          259         print("        sigmask2        ", addr.sigmask2, "\n");
          260         print("        sigmask3        ", addr.sigmask3, "\n");
          261         print("        onstack        ", addr.onstack, "\n");
          262         print("        rdi        ", addr.rdi, "\n");
          263         print("        rsi        ", addr.rsi, "\n");
          264         print("        rdx        ", addr.rdx, "\n");
          265         print("        rcx        ", addr.rcx, "\n");
          266         print("        r8        ", addr.r8, "\n");
          267         print("        r9        ", addr.r9, "\n");
          268         print("        rax        ", addr.rax, "\n");
          269         print("        rbx        ", addr.rbx, "\n");
          270         print("        rbp        ", addr.rbp, "\n");
          271         print("        r10        ", addr.r10, "\n");
          272         print("        r11        ", addr.r11, "\n");
          273         print("        r12        ", addr.r12, "\n");
          274         print("        r13        ", addr.r13, "\n");
          275         print("        r14        ", addr.r14, "\n");
          276         print("        r15        ", addr.r15, "\n");
          277         print("        trapno        ", addr.trapno, "\n");
          278         print("        fs        ", addr.fs, "\n");
          279         print("        gs        ", addr.gs, "\n");
          280         print("        addr        ", addr.addr, "\n");
          281         print("        flags        ", addr.flags, "\n");
          282         print("        es        ", addr.es, "\n");
          283         print("        ds        ", addr.ds, "\n");
          284         print("        err        ", addr.err, "\n");
          285         print("        rip        ", addr.rip, "\n");
          286         print("        cs        ", addr.cs, "\n");
          287         print("        rflags        ", addr.rflags, "\n");
          288         print("        rsp        ", addr.rsp, "\n");
          289         print("        ss        ", addr.ss, "\n");
          290         print("        len        ", addr.len, "\n");
          291         print("        fpformat        ", addr.fpformat, "\n");
          292         print("        ownedfp        ", addr.ownedfp, "\n");
          293         print("        fpstate0        ", addr.fpstate0, "\n");
          294         print("        fsbase        ", addr.fsbase, "\n");
          295         print("        gsbase        ", addr.gsbase, "\n");
          296 }
          297 
          298 // aggr Linkdebug
          299 // {
          300 //         'X' 0 version;
          301 //         'X' 4 map;
          302 // };
          303 // 
          304 // aggr Linkmap
          305 // {
          306 //         'X' 0 addr;
          307 //         'X' 4 name;
          308 //         'X' 8 dynsect;
          309 //         'X' 12 next;
          310 //         'X' 16 prev;
          311 // };
          312 // 
          313 // defn
          314 // linkdebug()
          315 // {
          316 //         local a;
          317 // 
          318 //         if !havesymbol("_DYNAMIC") then
          319 //                 return 0;
          320 //         
          321 //         a = _DYNAMIC;
          322 //         while *a != 0 do {
          323 //                 if *a == 21 then // 21 == DT_DEBUG
          324 //                         return *(a+4);
          325 //                 a = a+8;
          326 //         }
          327 //         return 0;
          328 // }
          329 // 
          330 // defn
          331 // dynamicmap()
          332 // {
          333 //         if systype == "linux"  || systype == "freebsd" then {
          334 //                 local r, m, n;
          335 //         
          336 //                 r = linkdebug();
          337 //                 if r then {
          338 //                         complex Linkdebug r;
          339 //                         m = r.map;
          340 //                         n = 0;
          341 //                         while m != 0 && n < 100 do {
          342 //                                 complex Linkmap m;
          343 //                                 if m.name && *(m.name\b) && access(*(m.name\s)) then
          344 //                                         print("textfile({\"", *(m.name\s), "\", ", m.addr\X, "});\n");
          345 //                                 m = m.next;
          346 //                                 n = n+1;
          347 //                         }
          348 //                 }
          349 //         }
          350 // }
          351 // */
          352 
          353 defn
          354 acidmap()
          355 {
          356 //        dynamicmap();
          357         acidtypes();
          358 }
          359 
          360 print(acidfile);