dis_ppc.c
来自「umon bootloader source code, support mip」· C语言 代码 · 共 1,329 行 · 第 1/2 页
C
1,329 行
int
opcode03(ulong instr)
{
printf("twi %x,%s,0x%04X\n",to(instr),ra(instr),(ushort)(instr&IM));
return(0);
}
int
opcode07(ulong instr)
{
return(rt_ra_x("mulli",instr));
}
int
opcode08(ulong instr)
{
return(rt_ra_x("subfic",instr));
}
int
opcode10(ulong instr)
{
return(bf_ra("cmpli",instr));
}
int
opcode11(ulong instr)
{
return(bf_ra("cmpi",instr));
}
int
opcode12(ulong instr)
{
return(rt_ra_x("addic",instr));
}
int
opcode13(ulong instr)
{
return(rt_ra_x("addic.",instr));
}
int
opcode14(ulong instr)
{
return(rt_ra_x("addi",instr));
}
int
opcode15(ulong instr)
{
return(rt_ra_x("addis",instr));
}
int
opcode16(ulong instr)
{
ulong mask;
if (instr & BD_NEGATIVE)
mask = 0xffff0000;
else
mask = 0;
switch((instr & BO) >> 21) {
case 16:
prnem(tbl17[aalk(instr)]);
printf("0x%lx\n", (instr & BD) | mask);
return(0);
case 0:
prnem(tbl18[aalk(instr)]);
printf("%s,0x%lx\n", bi(instr), (instr & BD) | mask);
return(0);
case 8:
prnem(tbl19[aalk(instr)]);
printf("%s,0x%lx\n", bi(instr), (instr & BD) | mask);
return(0);
case 18:
prnem(tbl20[aalk(instr)]);
printf("0x%lx\n", (instr & BD) | mask);
return(0);
case 2:
prnem(tbl21[aalk(instr)]);
printf("%s,0x%lx\n", bi(instr), (instr & BD) | mask);
return(0);
case 10:
prnem(tbl22[aalk(instr)]);
printf("%s,0x%lx\n", bi(instr), (instr & BD) | mask);
return(0);
}
prnem(tbl7[aalk(instr)]);
printf("%ld,%ld,0x%lx\n", ((instr & BO) >> 21),((instr & BI) >> 16),
(instr & BD) | mask);
return(0);
}
int
opcode17(ulong instr)
{
if (instr & 0x2)
printf("sc\n");
else
return(-1);
return(0);
}
int
opcode18(ulong instr)
{
ulong mask, delta, dest;
#if INCLUDE_TFSSYMTBL
ulong offset;
char func[32];
#endif
if (instr & LI_NEGATIVE)
mask = 0xfe000000;
else
mask = 0;
prnem(tbl6[aalk(instr)]);
delta = (instr & LI) | mask;
if (instr & AA)
dest = delta;
else
dest = (ulong)DisAddr + delta;
#if INCLUDE_TFSSYMTBL
if (AddrToSym(-1,dest,func,&offset)) {
printf("0x%lx (%s",delta,func);
if (offset)
printf(": 0x%lx",dest);
printf(")\n");
}
else
#endif
printf("0x%lx (addr=0x%lx)\n",delta,dest);
return(0);
}
int
opcode19(ulong instr)
{
if (instr == ISYNC) {
printf("isync\n");
return(0);
}
switch(xo_oe(instr)) {
case 0:
prnem("mcrf");
printf("%s,%s\n",bf(instr),bfa(instr));
break;
case 16:
if ((instr & (BO_0 | BO_2)) != (BO_0 | BO_2)) {
if (instr & LK)
prnem("bclrl");
else
prnem("bclr");
}
else {
if (instr & LK)
prnem("blrl");
else
prnem("blr");
}
if ((instr & (BO_0 | BO_2)) != (BO_0 | BO_2))
printf("%s,%s",bo(instr),bi(instr));
printf("\n");
return(0);
case 33:
return(bt_ba_bb("crnor",instr));
case 50:
printf("rfi\n");
return(0);
case 51:
printf("rfci\n");
return(0);
case 129:
return(bt_ba_bb("crandc",instr));
case 193:
return(bt_ba_bb("crxor",instr));
case 225:
return(bt_ba_bb("crnand",instr));
case 257:
return(bt_ba_bb("crand",instr));
case 289:
return(bt_ba_bb("creqv",instr));
case 417:
return(bt_ba_bb("crorc",instr));
case 449:
return(bt_ba_bb("cror",instr));
case 528:
if ((instr & (BO_0 | BO_2)) != (BO_0 | BO_2))
prnem("bcctr");
else
prnem("bctr");
if (instr & LK)
printf("l");
if ((instr & (BO_0 | BO_2)) != (BO_0 | BO_2))
printf("%s,%s",bo(instr),bi(instr));
printf("\n");
return(0);
default:
return(opcodeXX(instr));
}
return(-1);
}
int
opcode20(ulong instr)
{
return(ra_rs_sh_mb_me("rlwimi",instr));
}
int
opcode21(ulong instr)
{
return(ra_rs_sh_mb_me("rlwinm",instr));
}
int
opcode23(ulong instr)
{
prnemdot("rlwnm",instr & RC);
printf("%s,%s,%s,0x%04X,0x%04X\n",
ra(instr),rs(instr),rb(instr),mb(instr),me(instr));
return(0);
}
int
opcode24(ulong instr)
{
prnem("ori");
printf("%s,%s,0x%04X%s",
ra(instr),rs(instr),(ushort)(instr&IM),
instr==0x60000000 ? " (nop)\n" : "\n");
return(0);
}
int
opcode25(ulong instr)
{
return(ra_rs("oris",instr));
}
int
opcode26(ulong instr)
{
return(ra_rs("xori",instr));
}
int
opcode27(ulong instr)
{
return(ra_rs("xoris",instr));
}
int
opcode28(ulong instr)
{
return(ra_rs("addi.",instr));
}
int
opcode29(ulong instr)
{
return(ra_rs("addis.",instr));
}
int
opcode31(ulong instr)
{
if (instr == SYNC) {
printf("sync\n");
return(0);
}
switch(xo_oe(instr)) {
case 8:
return(rt_ra_rb(tbl13[oerc(instr)],instr));
case 10:
return(rt_ra_rb(tbl2[oerc(instr)],instr));
case 20:
return(rt_ra_rb("lwarx",instr));
case 23:
return(rt_ra_rb("lwzx",instr));
case 40:
return(rt_ra_rb(tbl12[oerc(instr)],instr));
case 55:
return(rt_ra_rb("lwzux",instr));
case 87:
return(rt_ra_rb("lbzx",instr));
case 104:
return(rt_ra(tbl11[oerc(instr)],instr));
case 119:
return(rt_ra_rb("lbzux",instr));
case 136:
return(rt_ra_rb(tbl14[oerc(instr)],instr));
case 138:
return(rt_ra_rb(tbl3[oerc(instr)],instr));
case 151:
return(rs_ra_rb("stwx",instr));
case 183:
return(rs_ra_rb("stwux",instr));
case 200:
return(rt_ra(tbl16[oerc(instr)],instr));
case 202:
return(rt_ra(tbl5[oerc(instr)],instr));
case 215:
return(rs_ra_rb("stbx",instr));
case 232:
return(rt_ra(tbl15[oerc(instr)],instr));
case 234:
return(rt_ra(tbl4[oerc(instr)],instr));
case 235:
return(rt_ra_rb(tbl10[oerc(instr)],instr));
case 266:
return(rt_ra_rb(tbl1[oerc(instr)],instr));
case 279:
return(rt_ra_rb("lhzx",instr));
case 311:
return(rt_ra_rb("lhzux",instr));
case 459:
return(rt_ra_rb(tbl9[oerc(instr)],instr));
case 491:
return(rt_ra_rb(tbl8[oerc(instr)],instr));
case 534:
return(rt_ra_rb("lwbrx",instr));
case 662:
return(rs_ra_rb("stwbrx",instr));
case 512:
prnem("mcrxr");
printf("%s\n",bf(instr));
return(0);
case 533:
return(rt_ra_rb("lswx",instr));
case 536:
prnemdot("srw",instr & RC);
printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr));
return(0);
case 597:
prnem("lswi");
printf("%s,%s,0x%04X\n",rt(instr),ra(instr),nb(instr));
return(0);
case 661:
return(rs_ra_rb("stswx",instr));
case 725:
prnem("stswi");
printf("%s,%s,0x%04X\n",rs(instr),ra(instr),nb(instr));
return(0);
case 790:
return(rt_ra_rb("lhbrx",instr));
case 792:
prnemdot("sraw",instr & RC);
printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr));
return(0);
case 824:
prnemdot("srawi",instr & RC);
printf("%s,%s,0x%04X\n", ra(instr),rs(instr),sh(instr));
return(0);
case 854:
printf("eieio\n"); /* yep, that's really an instruction */
return(0);
case 918:
return(rs_ra_rb("sthbrx",instr));
case 922:
prnemdot("extsh",instr & RC);
printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr));
return(0);
case 954:
prnemdot("extsb",instr & RC);
printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr));
return(0);
case 966:
return(ra_rb("icci",instr));
case 982:
return(ra_rb("icbi",instr));
case 998:
return(ra_rb("icread",instr));
case 1014:
return(ra_rb("dcbz",instr));
}
switch(xo_nooe(instr)) {
case 0:
prnem("cmp");
printf("%s,0,%s,%s\n",bf(instr),ra(instr),rb(instr));
return(0);
case 4:
prnem("tw");
printf("0x%04X,%s,%s\n",to(instr),ra(instr),rb(instr));
return(0);
case 11:
prnemdot("mulhwu",instr & RC);
printf("%s,%s,%s\n", rt(instr),ra(instr),rb(instr));
return(0);
case 19:
prnem("mfcr");
printf("%s\n",rt(instr));
return(0);
case 24:
prnemdot("slw",instr & RC);
printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr));
return(0);
case 26:
prnemdot("cntizw",instr & RC);
printf("%s,0,%s,%s\n", rs(instr),ra(instr),rb(instr));
return(0);
case 28:
prnemdot("andc",instr & RC);
printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr));
return(0);
case 32:
prnem("cmpl");
printf("%s,0,%s,%s\n",bf(instr),ra(instr),rb(instr));
return(0);
case 54:
prnem("dcbst");
printf("%s,%s\n",ra(instr),rb(instr));
return(0);
case 60:
prnemdot("and",instr & RC);
printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr));
return(0);
case 75:
prnemdot("mulhw",instr & RC);
printf("%s,%s,%s\n", rt(instr),ra(instr),rb(instr));
return(0);
case 83:
prnem("mfmsr");
printf("%s\n",rt(instr));
return(0);
case 86:
prnem("dcbf");
printf("%s,%s\n",ra(instr),rb(instr));
return(0);
case 124:
prnemdot("nor",instr & RC);
printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr));
return(0);
case 131:
prnem("wrtee");
printf("%s\n",rs(instr));
return(0);
case 144:
prnem("mtcrf");
printf("0x%x,%s\n",fxm(instr),rs(instr));
return(0);
case 146:
prnem("mtmsr");
printf("%s\n",rs(instr));
return(0);
case 150:
if (instr & 1)
return(rs_ra_rb("stwcx.",instr));
else
return(-1);
case 163:
prnem("wrteei");
if (instr & 0x8000)
printf("1\n");
else
printf("0\n");
return(0);
case 246:
prnem("dcbtst");
printf("%s,%s\n",ra(instr),rb(instr));
return(0);
case 247:
prnem("stbux");
printf("%s,%s\n",rs(instr),ra(instr));
return(0);
case 262:
prnem("icbt");
printf("%s,%s\n",ra(instr),rb(instr));
return(0);
case 278:
prnem("dcbt");
printf("%s,%s\n",ra(instr),rb(instr));
return(0);
case 284:
prnemdot("eqv",instr & RC);
printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr));
return(0);
case 316:
prnemdot("xor",instr & RC);
printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr));
return(0);
case 323:
#if USE_SPRDCR_NAMES
printf("mf%s %s\n",dcrn(instr),rt(instr));
#else
prnem("mfdcr");
printf("%s,%s\n",dcrn(instr),rt(instr));
#endif
return(0);
case 339:
#if USE_SPRDCR_NAMES
printf("mf%s,%s\n",sprf(instr),rt(instr));
#else
prnem("mfspr");
printf("%s,%s\n",sprf(instr),rt(instr));
#endif
return(0);
case 343:
prnem("lhax");
printf("%s,%s,%s\n",rt(instr),ra(instr),rb(instr));
return(0);
case 370:
prnem("tlbia");
printf("\n");
return(0);
case 375:
prnem("lhaux");
printf("%s,%s,%s\n",rt(instr),ra(instr),rb(instr));
return(0);
case 407:
return(rs_ra_rb("sthx",instr));
case 412:
prnemdot("orc",instr & RC);
printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr));
return(0);
case 439:
return(rs_ra_rb("sthux",instr));
case 444:
prnemdot("or",instr & RC);
printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr));
return(0);
case 451:
#if USE_SPRDCR_NAMES
printf("mt%s %s\n",dcrn(instr),rs(instr));
#else
prnem("mtdcr");
printf("%s,%s\n",dcrn(instr),rs(instr));
#endif
return(0);
case 454:
prnem("dcci");
printf("%s,%s\n",ra(instr),rb(instr));
return(0);
case 467:
#if USE_SPRDCR_NAMES
printf("mt%s,%s\n",sprf(instr),rs(instr));
#else
prnem("mtspr");
printf("%s,%s\n",sprf(instr),rs(instr));
#endif
return(0);
case 470:
prnem("dcbi");
printf("%s,%s\n",ra(instr),rb(instr));
return(0);
case 476:
prnemdot("nand",instr & RC);
printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr));
return(0);
case 486:
return(rt_ra_rb("dcread",instr));
}
printf("opcode31 error: 0x%02x%02x%02x%02x\n",
((uchar *)&instr)[0], ((uchar *)&instr)[1],
((uchar *)&instr)[2], ((uchar *)&instr)[3]);
printf("xo_oe() = 0x%04X, xo_nooe() = 0x%04X\n",
xo_oe(instr),xo_nooe(instr));
return(-1);
}
int
opcode32(ulong instr)
{
return(rt_d_ra("lwz",instr));
}
int
opcode33(ulong instr)
{
return(rt_d_ra("lwzu",instr));
}
int
opcode34(ulong instr)
{
return(rt_d_ra("lbz",instr));
}
int
opcode35(ulong instr)
{
return(rt_d_ra("lbzu",instr));
}
int
opcode36(ulong instr)
{
return(rs_d_ra("stw",instr));
}
int
opcode37(ulong instr)
{
return(rs_d_ra("stwu",instr));
}
int
opcode38(ulong instr)
{
return(rt_d_ra("stb",instr));
}
int
opcode39(ulong instr)
{
return(rt_d_ra("stbu",instr));
}
int
opcode40(ulong instr)
{
return(rt_d_ra("lhz",instr));
}
int
opcode41(ulong instr)
{
return(rt_d_ra("lhzu",instr));
}
int
opcode42(ulong instr)
{
return(rt_d_ra("lha",instr));
}
int
opcode43(ulong instr)
{
return(rt_d_ra("lhau",instr));
}
int
opcode44(ulong instr)
{
return(rt_d_ra("sth",instr));
}
int
opcode45(ulong instr)
{
return(rs_d_ra("sthu",instr));
}
int
opcode46(ulong instr)
{
return(rt_d_ra("lmw",instr));
}
int
opcode47(ulong instr)
{
return(rs_d_ra("stmw",instr));
}
#endif /* INCLUDE_DISASSEMBLER */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?