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 + -
显示快捷键?