📄 udb.c
字号:
if(off==s.value && s.name[0]=='$'){ off1 = 0; geta(mymap, s.value, &off1); if(off1 && findsym(off1, CANY, &s2) && s2.value == off1){ bprint(i, "$%s(SB)", s2.name); return; } } bprint(i, "%s", s.name); if (s.value != off) bprint(i, "+%llux", s.value-off); bprint(i, "(SB)"); return; } bprint(i, "%ux(R%d)", i->simm13, i->rs1);}static voidunimp(Instr *i, char *m){ bprint(i, "%T", m);}static char *bratab[16] = { /* page 91 */ [0X8] "A", [0X0] "N", [0X9] "NE", [0X1] "E", [0XA] "G", [0X2] "LE", [0XB] "GE", [0X3] "L", [0XC] "GU", [0X4] "LEU", [0XD] "CC", [0X5] "CS", [0XE] "POS", [0X6] "NEG", [0XF] "VC", [0X7] "VS",};static char *fbratab[16] = { /* page 91 */ [0X8] "A", [0X0] "N", [0X7] "U", [0X6] "G", [0X5] "UG", [0X4] "L", [0X3] "UL", [0X2] "LG", [0X1] "NE", [0X9] "E", [0XA] "UE", [0XB] "GE", [0XC] "UGE", [0XD] "LE", [0XE] "ULE", [0XF] "O",};static char *cbratab[16] = { /* page 91 */ [0X8] "A", [0X0] "N", [0X7] "3", [0X6] "2", [0X5] "23", [0X4] "1", [0X3] "13", [0X2] "12", [0X1] "123", [0X9] "0", [0XA] "03", [0XB] "02", [0XC] "023", [0XD] "01", [0XE] "013", [0XF] "012",};static voidbra1(Instr *i, char *m, char *tab[]){ long imm; imm = i->simmdisp22; if(i->a) bprint(i, "%T%T.%c\t", m, tab[i->cond], 'A'+dascase); else bprint(i, "%T%T\t", m, tab[i->cond]); i->curr += symoff(i->curr, i->end-i->curr, i->addr+4*imm, CTEXT); if (!dascase) bprint(i, "(SB)");}static voidbra(Instr *i, char *m) /* page 91 */{ bra1(i, m, bratab);}static voidfbra(Instr *i, char *m) /* page 93 */{ bra1(i, m, fbratab);}static voidcbra(Instr *i, char *m) /* page 95 */{ bra1(i, m, cbratab);}static voidtrap(Instr *i, char *m) /* page 101 */{ if(i->i == 0) bprint(i, "%T%T\tR%d+R%d", m, bratab[i->cond], i->rs2, i->rs1); else bprint(i, "%T%T\t$%ux+R%d", m, bratab[i->cond], i->simm13, i->rs1);}static voidsethi(Instr *i, char *m) /* page 89 */{ ulong imm; imm = i->immdisp22<<10; if(dascase){ bprint(i, "%T\t%lux, R%d", m, imm, i->rd); return; } if(imm==0 && i->rd==0){ bprint(i, "NOP"); return; } if(i->target < 0){ bprint(i, "MOVW\t$%lux, R%d", imm, i->rd); return; } bprint(i, "MOVW\t$%lux, R%d", i->imm32, i->target);}static char ldtab[] = { 'W', 'B', 'H', 'D',};static char*moveinstr(int op3, char *m){ char *s; int c; static char buf[8]; if(!dascase){ /* batshit cases */ if(op3 == 0xF || op3 == 0x1F) return "SWAP"; if(op3 == 0xD || op3 == 0x1D) return "TAS"; /* really LDSTUB */ c = ldtab[op3&3]; s = ""; if((op3&11)==1 || (op3&11)==2) s="U"; sprint(buf, "MOV%c%s", c, s); return buf; } return m;}static voidload(Instr *i, char *m) /* page 68 */{ m = moveinstr(i->op3, m); if(i->i == 0) bprint(i, "%s\t(R%d+R%d), R%d", m, i->rs1, i->rs2, i->rd); else{ bprint(i, "%s\t", m); address(i); bprint(i, ", R%d", i->rd); }}static voidloada(Instr *i, char *m) /* page 68 */{ m = moveinstr(i->op3, m); if(i->i == 0) bprint(i, "%s\t(R%d+R%d, %d), R%d", m, i->rs1, i->rs2, i->asi, i->rd); else bprint(i, "unknown ld asi %lux", i->w0);}static voidstore(Instr *i, char *m) /* page 74 */{ m = moveinstr(i->op3, m); if(i->i == 0) bprint(i, "%s\tR%d, (R%d+R%d)", m, i->rd, i->rs1, i->rs2); else{ bprint(i, "%s\tR%d, ", m, i->rd); address(i); }}static voidstorea(Instr *i, char *m) /* page 74 */{ m = moveinstr(i->op3, m); if(i->i == 0) bprint(i, "%s\tR%d, (R%d+R%d, %d)", m, i->rd, i->rs1, i->rs2, i->asi); else bprint(i, "%s\tR%d, %d(R%d, %d), ???", m, i->rd, i->simm13, i->rs1, i->asi);}static voidshift(Instr *i, char *m) /* page 88 */{ if(i->i == 0){ if(i->rs1 == i->rd) if(dascase) bprint(i, "%T\tR%d, R%d", m, i->rs1, i->rs2); else bprint(i, "%T\tR%d, R%d", m, i->rs2, i->rs1); else if(dascase) bprint(i, "%T\tR%d, R%d, R%d", m, i->rs1, i->rs2, i->rd); else bprint(i, "%T\tR%d, R%d, R%d", m, i->rs2, i->rs1, i->rd); }else{ if(i->rs1 == i->rd) if(dascase) bprint(i, "%T\t$%d,R%d", m, i->simm13&0x1F, i->rs1); else bprint(i, "%T\tR%d, $%d", m, i->rs1, i->simm13&0x1F); else if(dascase) bprint(i, "%T\tR%d, $%d, R%d",m,i->rs1,i->simm13&0x1F,i->rd); else bprint(i, "%T\t$%d, R%d, R%d",m,i->simm13&0x1F,i->rs1,i->rd); }}static voidadd(Instr *i, char *m) /* page 82 */{ if(i->i == 0){ if(dascase) bprint(i, "%T\tR%d, R%d", m, i->rs1, i->rs2); else if(i->op3==2 && i->rs1==0 && i->rd) /* OR R2, R0, R1 */ bprint(i, "MOVW\tR%d", i->rs2); else bprint(i, "%T\tR%d, R%d", m, i->rs2, i->rs1); }else{ if(dascase) bprint(i, "%T\tR%d, $%ux", m, i->rs1, i->simm13); else if(i->op3==0 && i->rd && i->rs1==0) /* ADD $x, R0, R1 */ bprint(i, "MOVW\t$%ux", i->simm13); else if(i->op3==0 && i->rd && i->rs1==2){ /* ADD $x, R2, R1 -> MOVW $x(SB), R1 */ bprint(i, "MOVW\t$"); address(i); } else bprint(i, "%T\t$%ux, R%d", m, i->simm13, i->rs1); } if(i->rs1 != i->rd) bprint(i, ", R%d", i->rd);}static voidcmp(Instr *i, char *m){ if(dascase || i->rd){ add(i, m); return; } if(i->i == 0) bprint(i, "CMP\tR%d, R%d", i->rs1, i->rs2); else bprint(i, "CMP\tR%d, $%ux", i->rs1, i->simm13);}static char *regtab[4] = { "Y", "PSTATE", "WIM", /* XXX not any more */ "TT",};static voidwr(Instr *i, char *m) /* page 82 */{ if(dascase){ if(i->i == 0) bprint(i, "%s\tR%d, R%d", m, i->rs1, i->rs2); else bprint(i, "%s\tR%d, $%ux", m, i->rs1, i->simm13); }else{ if(i->i && i->simm13==0) bprint(i, "MOVW\tR%d", i->rs1); else if(i->i == 0) bprint(i, "wr\tR%d, R%d", i->rs2, i->rs1); else bprint(i, "wr\t$%ux, R%d", i->simm13, i->rs1); } bprint(i, ", %s", regtab[i->op3&3]);}static voidrd(Instr *i, char *m) /* page 103 */{ if(i->rs1==15 && i->rd==0){ m = "stbar"; if(!dascase) m = "STBAR"; bprint(i, "%s", m); }else{ if(!dascase) m = "MOVW"; bprint(i, "%s\t%s, R%d", m, regtab[i->op3&3], i->rd); }}static voidjmpl(Instr *i, char *m) /* page 82 */{ if(i->i == 0){ if(i->rd == 15) bprint(i, "%T\t(R%d+R%d)", "CALL", i->rs2, i->rs1); else bprint(i, "%T\t(R%d+R%d), R%d", m, i->rs2, i->rs1, i->rd); }else{ if(!dascase && i->simm13==8 && i->rs1==15 && i->rd==0) bprint(i, "RETURN"); else{ bprint(i, "%T\t", m); address(i); bprint(i, ", R%d", i->rd); } }}static voidloadf(Instr *i, char *m) /* page 70 */{ if(!dascase){ m = "FMOVD"; if(i->op3 == 0x20) m = "FMOVF"; else if(i->op3 == 0x21) m = "MOVW"; } if(i->i == 0) bprint(i, "%s\t(R%d+R%d)", m, i->rs1, i->rs2); else{ bprint(i, "%s\t", m); address(i); } if(i->op3 == 0x21) bprint(i, ", FSR"); else bprint(i, ", R%d", i->rd);}staticvoid storef(Instr *i, char *m) /* page 70 */{ if(!dascase){ m = "FMOVD"; if(i->op3 == 0x25 || i->op3 == 0x26) m = "MOVW"; else if(i->op3 == 0x20) m = "FMOVF"; } bprint(i, "%s\t", m); if(i->op3 == 0x25) bprint(i, "FSR, "); else if(i->op3 == 0x26) bprint(i, "FQ, "); else bprint(i, "R%d, ", i->rd); if(i->i == 0) bprint(i, "(R%d+R%d)", i->rs1, i->rs2); else address(i);}staticvoid loadc(Instr *i, char *m) /* page 72 */{ if(i->i == 0) bprint(i, "%s\t(R%d+R%d), C%d", m, i->rs1, i->rs2, i->rd); else{ bprint(i, "%s\t", m); address(i); bprint(i, ", C%d", i->rd); }}staticvoid loadcsr(Instr *i, char *m) /* page 72 */{ if(i->i == 0) bprint(i, "%s\t(R%d+R%d), CSR", m, i->rs1, i->rs2); else{ bprint(i, "%s\t", m); address(i); bprint(i, ", CSR"); }}static struct{ int opf; char *name;} fptab1[] = { /* ignores rs1 */ 0xC4, "FITOS", /* page 109 */ 0xC8, "FITOD", 0xCC, "FITOX", 0xD1, "FSTOI", /* page 110 */ 0xD2, "FDTOI", 0xD3, "FXTOI", 0xC9, "FSTOD", /* page 111 */ 0xCD, "FSTOX", 0xC6, "FDTOS", 0xCE, "FDTOX", 0xC7, "FXTOS", 0xCB, "FXTOD", 0x01, "FMOVS", /* page 112 */ 0x05, "FNEGS", 0x09, "FABSS", 0x29, "FSQRTS", /* page 113 */ 0x2A, "FSQRTD", 0x2B, "FSQRTX", 0, 0,};static struct{ int opf; char *name;} fptab2[] = { /* uses rs1 */ 0x41, "FADDS", /* page 114 */ 0x42, "FADDD", 0x43, "FADDX", 0x45, "FSUBS", 0x46, "FSUBD", 0x47, "FSUBX", 0x49, "FMULS", /* page 115 */ 0x4A, "FMULD", 0x4B, "FMULX", 0x4D, "FDIVS", 0x4E, "FDIVD", 0x4F, "FDIVX", 0x51, "FCMPS", /* page 116 */ 0x52, "FCMPD", 0x53, "FCMPX", 0x55, "FCMPES", 0x56, "FCMPED", 0x57, "FCMPEX", 0, 0};static voidfpop(Instr *i, char *m) /* page 108-116 */{ int j; if(dascase==0 && i->size==2){ bprint(i, "FMOVD\tF%d, F%d", i->rs2, i->rd); return; } for(j=0; fptab1[j].name; j++) if(fptab1[j].opf == i->opf){ bprint(i, "%T\tF%d, F%d", fptab1[j].name, i->rs2, i->rd); return; } for(j=0; fptab2[j].name; j++) if(fptab2[j].opf == i->opf){ bprint(i, "%T\tF%d, F%d, F%d", fptab2[j].name, i->rs1, i->rs2, i->rd); return; } bprint(i, "%T%ux\tF%d, F%d, F%d", m, i->opf, i->rs1, i->rs2, i->rd);}static intsparc64foll(Map *map, uvlong pc, Rgetter rget, uvlong *foll){ ulong w, r1, r2; char buf[8]; Instr i; mymap = map; if (mkinstr(pc, &i) < 0) return -1; w = i.w0; switch(w & 0xC1C00000){ case 0x00800000: /* branch on int cond */ case 0x01800000: /* branch on fp cond */ case 0x01C00000: /* branch on copr cond */ foll[0] = pc+8; foll[1] = pc + (i.simmdisp22<<2); return 2; } if((w&0xC0000000) == 0x40000000){ /* CALL */ foll[0] = pc + (i.disp30<<2); return 1; } if((w&0xC1F80000) == 0x81C00000){ /* JMPL */ sprint(buf, "R%ld", (w>>14)&0xF); r1 = (*rget)(map, buf); if(w & 0x2000) /* JMPL R1+simm13 */ r2 = i.simm13; else{ /* JMPL R1+R2 */ sprint(buf, "R%ld", w&0xF); r2 = (*rget)(map, buf); } foll[0] = r1 + r2; return 1; } foll[0] = pc+i.size*4; return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -