gdbstub_plugin/disassemble.py

941 lines
21 KiB
Python

trap_condition_table = {
1: "lgt",
2: "llt",
4: "eq",
5: "lge",
6: "lle",
8: "gt",
12: "ge",
16: "lt",
20: "le",
24: "ne",
31: "u"
}
spr_table_suffix = {
1: "xer",
8: "lr",
9: "ctr"
}
spr_table = {}
def decodeI(value):
return (value >> 2) & 0xFFFFFF, (value >> 1) & 1, value & 1
def decodeB(value):
return (value >> 21) & 0x1F, (value >> 16) & 0x1F, (value >> 2) & 0x3FFF, (value >> 1) & 1, value & 1
def decodeD(value):
return (value >> 21) & 0x1F, (value >> 16) & 0x1F, value & 0xFFFF
def decodeX(value):
return (value >> 21) & 0x1F, (value >> 16) & 0x1F, (value >> 11) & 0x1F, value & 1
def decodeABC(value):
return (value >> 21) & 0x1F, (value >> 16) & 0x1F, (value >> 11) & 0x1F, (value >> 6) & 0x1F, value & 1
def decodeR(value):
return (value >> 21) & 0x1F, (value >> 16) & 0x1F, (value >> 11) & 0x1F, (value >> 6) & 0x1F, (value >> 1) & 0x1F, value & 1
def extend_sign(value, bits=16):
if value & 1 << (bits - 1):
value -= 1 << bits
return value
def ihex(value):
sign = "-" if value < 0 else ""
return "%s0x%X" %(sign, abs(value))
condition_table_true = ["lt", "gt", "eq"]
condition_table_false = ["ge", "le", "ne"]
def decode_cond_true(BI):
if BI % 4 < 3:
return condition_table_true[BI % 4]
def decode_cond_false(BI):
if BI % 4 < 3:
return condition_table_false[BI % 4]
def decode_cond(BO, BI):
ctr = ""
if not BO & 4:
if BO & 2:
ctr = "dz"
else:
ctr = "dnz"
cond = ""
if not BO & 16:
if BO & 8:
cond = decode_cond_true(BI)
else:
cond = decode_cond_false(BI)
if cond is not None:
return ctr + cond
NO_SWAP = False
SWAP = True
UNSIGNED = False
SIGNED = True
def decode_simple(instr):
def decode(value, addr):
D, A, B, Rc = decodeX(value)
if D or A or B or Rc:
return "???"
return instr
return decode
def decode_triple_reg(instr, swap):
def decode(value, addr):
D, A, B, Rc = decodeX(value)
if swap:
D, A = A, D
return "%s%s" %(instr, "." * Rc), "r%i, r%i, r%i" %(D, A, B)
return decode
def decode_double_reg(instr, swap):
def decode(value, addr):
D, A, B, Rc = decodeX(value)
if B != 0:
return "???"
if swap:
D, A = A, D
return "%s%s" %(instr, "." * Rc), "r%i, r%i" %(D, A)
return decode
def decode_single_reg(instr):
def decode(value, addr):
D, A, B, Rc = decodeX(value)
if A or B or Rc:
return "???"
return instr, "r%i" %D
return decode
def decode_double_reg_imm(instr, sign, swap):
def decode(value, addr):
D, A, IMM = decodeD(value)
if sign:
IMM = extend_sign(IMM)
if swap:
D, A = A, D
return instr, "r%i, r%i, %s" %(D, A, ihex(IMM))
return decode
def decode_triple_cr(instr, simple1, simple2):
def decode(value, addr):
D, A, B, pad = decodeX(value)
if pad:
return "???"
if D == A == B and simple1:
return simple1, "cr%i" %D
if A == B and simple2:
return simple2, "cr%i, cr%i" %(D, A)
return instr, "cr%i, cr%i, cr%i" %(D, A, B)
return decode
def decode_single_cr(instr, rc_ok):
def decode(value, addr):
D, A, B, Rc = decodeX(value)
if A or B or (Rc and not rc_ok):
return "???"
return instr + "." * Rc, "cr%i" %D
return decode
def decode_compare_reg(instr):
def decode(value, addr):
cr, A, B, pad = decodeX(value)
if cr & 3 or pad:
return "???"
if cr == 0:
return instr, "r%i, r%i" %(A, B)
return instr, "cr%i, r%i, r%i" %(cr >> 2, A, B)
return decode
def decode_compare_imm(instr, sign):
def decode(value, addr):
cr, A, IMM = decodeD(value)
if cr & 3:
return "???"
if sign:
IMM = extend_sign(IMM)
if cr == 0:
return instr, "r%i, %s" %(A, ihex(IMM))
return instr, "cr%i, r%i, %s" %(cr >> 2, A, ihex(IMM))
return decode
def decode_branch_to_reg(reg):
def decode(value, addr):
BO, BI, pad, LK = decodeX(value)
if pad:
return "???"
cond = decode_cond(BO, BI)
suffix = "l" * LK
if cond is None:
return "bc%s%s" %(reg, suffix), "%i, %i" %(BO, BI)
instr = "b%s%s%s" %(cond, reg, suffix)
if BI >= 4:
return instr, "cr%i" %(BI // 4)
return instr
return decode
def decode_double_float(instr):
def decode(value, addr):
D, A, B, Rc = decodeX(value)
if A != 0:
return "???"
return "%s%s" %(instr, "." * Rc), "f%i, f%i" %(D, B)
return decode
def decode_triple_float(instr):
def decode(value, addr):
D, A, B, Rc = decodeX(value)
return "%s%s" %(instr, "." * Rc), "f%i, f%i, f%i" %(D, A, B)
return decode
def decode_triple_float_alt(instr):
def decode(value, addr):
D, A, B, C, Rc = decodeABC(value)
if B != 0:
return "???"
return "%s%s" %(instr, "." * Rc), "f%i, f%i, f%i" %(D, A, C)
return decode
def decode_quad_float(instr):
def decode(value, addr):
D, A, B, C, Rc = decodeABC(value)
return "%s%s" %(instr, "." * Rc), "f%i, f%i, f%i, f%i" %(D, A, C, B)
return decode
def decode_compare_float(instr):
def decode(value, addr):
cr, A, B, pad = decodeX(value)
if cr & 3 or pad:
return "???"
return instr, "cr%i, f%i, f%i" %(cr >> 2, A, B)
return decode
def decode_memory(instr):
def decode(value, addr):
D, A, d = decodeD(value)
d = extend_sign(d)
return instr, "r%i, %s(r%i)" %(D, ihex(d), A)
return decode
def decode_memory_indexed(instr):
def decode(value, addr):
D, A, B, Rc = decodeX(value)
if Rc:
return "???"
if A == 0:
return instr, "r%i, 0, r%i" %(D, B)
return instr, "r%i, r%i, r%i" %(D, A, B)
return decode
def decode_memory_float(instr):
def decode(value, addr):
D, A, d = decodeD(value)
d = extend_sign(d)
return instr, "f%i, %s(r%i)" %(D, ihex(d), A)
return decode
def decode_memory_float_indexed(instr):
def decode(value, addr):
D, A, B, Rc = decodeX(value)
if Rc:
return "???"
if A == 0:
return instr, "f%i, 0, r%i" %(D, B)
return instr, "f%i, r%i, r%i" %(D, A, B)
return decode
def decode_cache(instr):
def decode(value, addr):
D, A, B, Rc = decodeX(value)
if D != 0 or Rc != 0:
return "???"
return instr, "r%i, r%i" %(A, B)
return decode
add = decode_triple_reg("add", NO_SWAP)
addc = decode_triple_reg("addc", NO_SWAP)
adde = decode_triple_reg("adde", NO_SWAP)
def addi(value, addr):
D, A, SIMM = decodeD(value)
SIMM = extend_sign(SIMM)
if A == 0:
return "li", "r%i, %s" %(D, ihex(SIMM))
return "addi", "r%i, r%i, %s" %(D, A, ihex(SIMM))
addic = decode_double_reg_imm("addic", SIGNED, NO_SWAP)
addic_ = decode_double_reg_imm("addic.", SIGNED, NO_SWAP)
def addis(value, addr):
D, A, SIMM = decodeD(value)
SIMM = extend_sign(SIMM)
if A == 0:
return "lis", "r%i, %s" %(D, ihex(SIMM))
return "addis", "r%i, r%i, %s" %(D, A, ihex(SIMM))
addme = decode_double_reg("addme", NO_SWAP)
addze = decode_double_reg("addze", NO_SWAP)
and_ = decode_triple_reg("and", SWAP)
andc = decode_triple_reg("andc", SWAP)
andi = decode_double_reg_imm("andi.", UNSIGNED, SWAP)
andis = decode_double_reg_imm("andis.", UNSIGNED, SWAP)
def b(value, addr):
LI, AA, LK = decodeI(value)
LI = extend_sign(LI, 24) * 4
if AA: dst = LI
else:
dst = addr + LI
return "b%s%s" %("l" * LK, "a" * AA), ihex(dst)
def bc(value, addr):
BO, BI, BD, AA, LK = decodeB(value)
BD = extend_sign(BD, 14) * 4
suffix = "%s%s" %("l" * LK, "a" * AA)
if AA: dst = BD
else:
dst = addr + BD
cond = decode_cond(BO, BI)
if cond is None:
return "bc" + suffix, "%i, %i, %s" %(BO, BI, ihex(dst))
if BI >= 4:
return "b" + cond + suffix, "cr%i, %s" %(BI // 4, ihex(dst))
return "b" + cond + suffix, ihex(dst)
bcctr = decode_branch_to_reg("ctr")
bclr = decode_branch_to_reg("lr")
cmp = decode_compare_reg("cmpw")
cmpi = decode_compare_imm("cmpwi", SIGNED)
cmpl = decode_compare_reg("cmplw")
cmpli = decode_compare_imm("cmplwi", UNSIGNED)
cntlzw = decode_double_reg("cntlzw", SWAP)
crand = decode_triple_cr("crand", None, None)
crandc = decode_triple_cr("crandc", None, None)
creqv = decode_triple_cr("creqv", "crset", None)
crnand = decode_triple_cr("crnand", None, None)
crnor = decode_triple_cr("crnor", None, "crnot")
cror = decode_triple_cr("cror", None, "crmove")
crorc = decode_triple_cr("crorc", None, None)
crxor = decode_triple_cr("crxor", "crclr", None)
dcba = decode_cache("dcba")
dcbf = decode_cache("dcbf")
dcbi = decode_cache("dcbi")
dcbst = decode_cache("dcbst")
dcbt = decode_cache("dcbt")
dcbtst = decode_cache("dcbtst")
dcbz = decode_cache("dcbz")
divw = decode_triple_reg("divw", NO_SWAP)
divwu = decode_triple_reg("divwu", NO_SWAP)
eieio = decode_simple("eieio")
eqv = decode_triple_reg("eqv", SWAP)
extsb = decode_double_reg("extsb", SWAP)
extsh = decode_double_reg("extsh", SWAP)
fabs = decode_double_float("fabs")
fadd = decode_triple_float("fadd")
fadds = decode_triple_float("fadds")
fcmpo = decode_compare_float("fcmpo")
fcmpu = decode_compare_float("fcmpu")
fctiw = decode_double_float("fctiw")
fctiwz = decode_double_float("fctiwz")
fdiv = decode_triple_float("fdiv")
fdivs = decode_triple_float("fdivs")
fmadd = decode_quad_float("fmadd")
fmadds = decode_quad_float("fmadds")
fmr = decode_double_float("fmr")
fmsub = decode_quad_float("fmsub")
fmsubs = decode_quad_float("fmsubs")
fmul = decode_triple_float_alt("fmul")
fmuls = decode_triple_float_alt("fmuls")
fnabs = decode_double_float("fnabs")
fneg = decode_double_float("fneg")
fnmadd = decode_quad_float("fnmadd")
fnmadds = decode_quad_float("fnmadds")
fnmsub = decode_quad_float("fnmsub")
fnmsubs = decode_quad_float("fnmsubs")
fres = decode_double_float("fres")
frsp = decode_double_float("frsp")
fsel = decode_quad_float("fsel")
fsqrte = decode_double_float("fsqrte")
fsqrt = decode_double_float("fsqrt")
fsqrts = decode_double_float("fsqrts")
fsub = decode_triple_float("fsub")
fsubs = decode_triple_float("fsubs")
icbi = decode_cache("icbi")
isync = decode_simple("isync")
lbz = decode_memory("lbz")
lbzu = decode_memory("lbzu")
lbzux = decode_memory_indexed("lbzux")
lbzx = decode_memory_indexed("lbzx")
lfd = decode_memory_float("lfd")
lfdu = decode_memory_float("lfdu")
lfdux = decode_memory_float_indexed("lfdux")
lfdx = decode_memory_float_indexed("lfdx")
lfs = decode_memory_float("lfs")
lfsu = decode_memory_float("lfsu")
lfsux = decode_memory_float_indexed("lfsux")
lfsx = decode_memory_float_indexed("lfsx")
lha = decode_memory("lha")
lhau = decode_memory("lhau")
lhaux = decode_memory_indexed("lhaux")
lhax = decode_memory_indexed("lhax")
lhbrx = decode_memory_indexed("lhbrx")
lhz = decode_memory("lhz")
lhzu = decode_memory("lhzu")
lhzux = decode_memory_indexed("lhzux")
lhzx = decode_memory_indexed("lhzx")
lmw = decode_memory("lmw")
def lswi(value, addr):
D, A, NB, Rc = decodeX(value)
if Rc:
return "???"
return "lswi", "r%i, r%i, %i" %(D, A, NB)
lswx = decode_memory_indexed("lswx")
lwarx = decode_memory_indexed("lwarx")
lwbrx = decode_memory_indexed("lwbrx")
lwz = decode_memory("lwz")
lwzu = decode_memory("lwzu")
lwzux = decode_memory_indexed("lwzux")
lwzx = decode_memory_indexed("lwzx")
def mcrf(value, addr):
crD, crS, pad1, pad2 = decodeX(value)
if crD & 3 or crS & 3 or pad1 or pad2:
return "???"
return "mcrf", "cr%i, cr%i" %(crD, crS)
def mcrfs(value, addr):
crD, crS, pad1, pad2 = decodeX(value)
if crD & 3 or crS & 3 or pad1 or pad2:
return "???"
return "mcrfs", "cr%i, cr%i" %(crD, crS)
mcrxr = decode_single_cr("mcrxr", False)
mfcr = decode_single_reg("mfcr")
def mffs(value, addr):
D, A, B, Rc = decodeX(value)
if A or B:
return "???"
return "mffs%s" %("." * Rc), "f%i" %D
mfmsr = decode_single_reg("mfmsr")
def mfspr(value, addr):
D, lo, hi, pad = decodeX(value)
spr = (hi << 5) | lo
if pad:
return "???"
if spr in spr_table_suffix:
return "mf%s" %spr_table_suffix[spr], "r%i" %D
if spr in spr_table:
return "mfspr", "r%i, %s" %(D, spr_table[spr])
return "mfspr", "r%i, %i" %(D, spr)
def mfsr(value, addr):
D, SR, pad1, pad2 = decodeX(value)
if pad1 or pad2 or SR > 15:
return "???"
return "mfsr", "r%i, %i" %(D, SR)
def mfsrin(value, addr):
D, A, B, Rc = decodeX(value)
if A or Rc:
return "???"
return "mfsrin", "r%i, r%i" %(D, B)
def mftb(value, addr):
D, lo, hi, pad = decodeX(value)
tbr = (hi << 5) | lo
if pad:
return "???"
if tbr == 268: return "mftb", "r%i" %D
if tbr == 269: return "mftbu", "r%i" %D
return "???"
def mtcrf(value, addr):
S, hi, lo, pad = decodeX(value)
if lo & 1 or hi & 16 or pad:
return "???"
mask = (hi << 4) | (lo >> 1)
if mask == 0xFF:
return "mtcr", "r%i" %S
return "mtcrf", "%s, r%i" %(ihex(mask), S)
mtfsb0 = decode_single_cr("mtfsb0", True)
mtfsb1 = decode_single_cr("mtfsb1", True)
def mtfsf(value, addr):
hi, lo, B, Rc = decodeX(value)
if lo & 1 or hi & 16:
return "???"
mask = (hi << 4) | (lo >> 1)
return "mtfsf" + "." * Rc, "%s, f%i" %(ihex(mask), B)
def mtfsfi(value, addr):
cr, pad, IMM, Rc = decodeX(value)
if cr & 3 or pad or IMM & 1:
return "???"
return "mtfsfi" + "." * Rc, "cr%i, %i" %(cr >> 2, IMM >> 1)
mtmsr = decode_single_reg("mtmsr")
def mtspr(value, addr):
S, lo, hi, pad = decodeX(value)
spr = (hi << 5) | lo
if pad:
return "???"
if spr in spr_table_suffix:
return "mt%s" %spr_table_suffix[spr], "r%i" %S
if spr in spr_table:
return "mtspr", "%s, r%i" %(spr_table[spr], S)
return "mtspr", "%i, r%i" %(spr, S)
def mtsr(value, addr):
S, SR, pad1, pad2 = decodeX(value)
if pad1 or pad2 or SR > 15:
return "???"
return "mtsr", "%i, %ri" %(SR, S)
def mtsrin(value, addr):
S, A, B, Rc = decodeX(value)
if A or Rc:
return "???"
return "mtsrin", "r%i, r%i" %(S, B)
mulhw = decode_triple_reg("mulhw", NO_SWAP)
mulhwu = decode_triple_reg("mulhwu", NO_SWAP)
mulli = decode_double_reg_imm("mulli", SIGNED, NO_SWAP)
mullwu = decode_triple_reg("mullwu", NO_SWAP)
nand = decode_triple_reg("nand", SWAP)
neg = decode_double_reg("neg", NO_SWAP)
def nor(value, addr):
S, A, B, Rc = decodeX(value)
if S == B:
return "not" + "." * Rc, "r%i, r%i" %(A, S)
return "nor" + "." * Rc, "r%i, r%i, r%i" %(A, S, B)
def or_(value, addr):
S, A, B, Rc = decodeX(value)
if S == B:
return "mr" + "." * Rc, "r%i, r%i" %(A, S)
return "or" + "." * Rc, "r%i, r%i, r%i" %(A, S, B)
orc = decode_triple_reg("orc", SWAP)
def ori(value, addr):
S, A, UIMM = decodeD(value)
if UIMM == 0:
return "nop"
return "ori", "r%i, r%i, %s" %(A, S, ihex(UIMM))
oris = decode_double_reg_imm("oris", UNSIGNED, SWAP)
rfi = decode_simple("rfi")
def rlwimi(value, addr):
S, A, SH, MB, ME, Rc = decodeR(value)
suffix = "." * Rc
if SH == 32 - MB and ME >= MB:
return "inslwi" + suffix, "r%i, r%i, %i, %i" %(A, S, ME - MB + 1, MB)
if MB < 31 and SH + ME == 32:
return "insrwi" + suffix, "r%i, r%i, %i, %i" %(A, S, 32 - MB - SH, MB)
return "rlwimi" + suffix, "r%i, r%i, %i, %i, %i" %(A, S, SH, MB, ME)
def rlwinm(value, addr):
S, A, SH, MB, ME, Rc = decodeR(value)
suffix = "." * Rc
if MB == 0 and ME == 31 - SH:
return "slwi" + suffix, "r%i, r%i, %i" %(A, S, SH)
if ME == 31 and SH == 32 - MB:
return "srwi" + suffix, "r%i, r%i, %i" %(A, S, MB)
if MB == 0 and ME < 31:
return "extlwi" + suffix, "r%i, r%i, %i, %i" %(A, S, ME + 1, SH)
if ME == 31 and SH >= 32 - MB:
return "extrwi" + suffix, "r%i, r%i, %i, %i" %(A, S, 32 - MB, SH + MB - 32)
if MB == 0 and ME == 31:
if SH >= 16:
return "rotlwi" + suffix, "r%i, r%i, %i" %(A, S, SH)
return "rotrwi" + suffix, "r%i, r%i, %i" %(A, S, 32 - SH)
if SH == 0 and ME == 31:
return "clrlwi" + suffix, "r%i, r%i, %i" %(A, S, MB)
if SH == 0 and MB == 0:
return "clrrwi" + suffix, "r%i, r%i, %i" %(A, S, 31 - ME)
if ME == 31 - SH and MB + SH < 32:
return "clrlslwi" + suffix, "r%i, r%i, %i, %i" (MB + SH, SH)
return "rlwinm" + suffix, "r%i, r%i, %i, %i, %i" %(A, S, SH, MB, ME)
def rlwnm(value, addr):
S, A, B, MB, ME, Rc = decodeR(value)
suffix = "." * Rc
if MB == 0 and ME == 31:
return "rotlw" + suffix, "r%i, r%i, r%i" %(A, S, B)
return "rlwnm" + suffix, "r%i, r%i, r%i, %i, %i" %(A, S, B, MB, ME)
sc = decode_simple("sc")
slw = decode_triple_reg("slw", SWAP)
sraw = decode_triple_reg("sraw", SWAP)
def srawi(value, addr):
S, A, SH, Rc = decodeX(value)
return "srawi" + "." * Rc, "r%i, r%i, %i" %(A, S, SH)
srw = decode_triple_reg("srw", SWAP)
stb = decode_memory("stb")
stbu = decode_memory("stbu")
stbux = decode_memory_indexed("stbux")
stbx = decode_memory_indexed("stbx")
stfd = decode_memory_float("stfd")
stfdu = decode_memory_float("stfdu")
stfdux = decode_memory_float_indexed("stfdux")
stfdx = decode_memory_float_indexed("stfdx")
stfiwx = decode_memory_float_indexed("stfiwx")
stfs = decode_memory_float("stfs")
stfsu = decode_memory_float("stfsu")
stfsux = decode_memory_float_indexed("stfsux")
stfsx = decode_memory_float_indexed("stfsx")
sth = decode_memory("sth")
sthbrx = decode_memory_indexed("sthbrx")
sthu = decode_memory("sthu")
sthux = decode_memory_indexed("sthux")
sthx = decode_memory_indexed("sthx")
stmw = decode_memory("stmw")
def stswi(value, addr):
S, A, NB, Rc = decodeX(value)
if Rc:
return "???"
return "stswi", "r%i, r%i, %i" %(S, A, NB)
stswx = decode_memory_indexed("stswx")
stw = decode_memory("stw")
stwbrx = decode_memory_indexed("stwbrx")
def stwcx(value, addr):
S, A, B, Rc = decodeX(value)
if not Rc:
return "???"
return "stwcx.", "r%i, r%i, r%i" %(S, A, B)
stwu = decode_memory("stwu")
stwux = decode_memory_indexed("stwux")
stwx = decode_memory_indexed("stwx")
subf = decode_triple_reg("subf", NO_SWAP)
subfc = decode_triple_reg("subfc", NO_SWAP)
subfe = decode_triple_reg("subfe", NO_SWAP)
subfic = decode_double_reg_imm("subfic", SIGNED, NO_SWAP)
subfme = decode_double_reg("subfme", NO_SWAP)
subfze = decode_double_reg("subfze", NO_SWAP)
sync = decode_simple("sync")
tlbia = decode_simple("tlbia")
def tlbie(value, addr):
D, A, B, Rc = decodeX(value)
if D or A or Rc:
return "???"
return "tlbie", "r%i" %B
tlbsync = decode_simple("tlbsync")
def tw(value, addr):
TO, A, B, Rc = decodeX(value)
if Rc:
return "???"
if TO == 31 and A == 0 and B == 0:
return "trap"
if TO in trap_condition_table:
return "tw%s" %trap_condition_table[TO], "r%i, r%i" %(A, B)
return "tw", "%i, r%i, r%i" %(TO, A, B)
def twi(value, addr):
TO, A, SIMM = decodeD(value)
SIMM = extend_sign(SIMM)
if TO in trap_condition_table:
return "tw%si" %trap_condition_table[TO], "r%i, %s" %(A, ihex(SIMM))
return "twi", "%i, r%i, %s" %(TO, A, ihex(SIMM))
xor = decode_triple_reg("xor", SWAP)
xori = decode_double_reg_imm("xori", UNSIGNED, SWAP)
xoris = decode_double_reg_imm("xoris", UNSIGNED, SWAP)
opcode_table_19 = {
0: mcrf,
16: bclr,
33: crnor,
50: rfi,
129: crandc,
150: isync,
193: crxor,
225: crnand,
257: crand,
289: creqv,
417: crorc,
449: cror,
528: bcctr
}
opcode_table_31 = {
0: cmp,
4: tw,
8: subfc,
10: addc,
11: mulhwu,
19: mfcr,
20: lwarx,
23: lwzx,
24: slw,
26: cntlzw,
28: and_,
32: cmpl,
40: subf,
54: dcbst,
55: lwzux,
60: andc,
75: mulhw,
83: mfmsr,
86: dcbf,
87: lbzx,
119: lbzux,
124: nor,
138: adde,
146: mtmsr,
150: stwcx,
151: stwx,
183: stwux,
202: addze,
210: mtsr,
215: stbx,
234: addme,
242: mtsrin,
246: dcbtst,
247: stbux,
266: add,
278: dcbt,
279: lhzx,
284: eqv,
306: tlbie,
311: lhzux,
316: xor,
339: mfspr,
343: lhax,
370: tlbia,
375: lhaux,
407: sthx,
412: orc,
439: sthux,
444: or_,
467: mtspr,
470: dcbi,
476: nand,
512: mcrxr,
533: lswx,
534: lwbrx,
535: lfsx,
536: srw,
566: tlbsync,
567: lfsux,
595: mfsr,
597: lswi,
598: sync,
599: lfdx,
631: lfdux,
659: mfsrin,
661: stswx,
662: stwbrx,
663: stfsx,
695: stfsux,
725: stswi,
727: stfdx,
758: dcba,
759: stfdux,
790: lhbrx,
792: sraw,
824: srawi,
854: eieio,
918: sthbrx,
922: extsh,
954: extsb,
982: icbi,
983: stfiwx,
1014: dcbz
}
opcode_table_59 = {
18: fdivs,
20: fsubs,
21: fadds,
22: fsqrts,
24: fres,
25: fmuls,
28: fmsubs,
29: fmadds,
30: fnmsubs,
31: fnmadds
}
opcode_table_63 = {
0: fcmpu,
12: frsp,
14: fctiw,
15: fctiwz,
18: fdiv,
20: fsub,
21: fadd,
22: fsqrt,
23: fsel,
25: fmul,
26: fsqrte,
28: fmsub,
29: fmadd,
30: fnmsub,
31: fnmadd,
32: fcmpo,
38: mtfsb1,
40: fneg,
64: mcrfs,
70: mtfsb0,
72: fmr,
134: mtfsfi,
136: fnabs,
264: fabs,
583: mffs,
711: mtfsf
}
def opcode19(value, addr):
XO = (value >> 1) & 0x3FF
if XO not in opcode_table_19:
return "???"
return opcode_table_19[XO](value, addr)
def opcode31(value, addr):
XO = (value >> 1) & 0x3FF
if XO not in opcode_table_31:
return "???"
return opcode_table_31[XO](value, addr)
def opcode59(value, addr):
XO = (value >> 1) & 0x1F
if XO not in opcode_table_59:
return "???"
return opcode_table_59[XO](value, addr)
def opcode63(value, addr):
XO = (value >> 1) & 0x3FF
if XO not in opcode_table_63:
return "???"
return opcode_table_63[XO](value, addr)
opcode_table = {
3: twi,
7: mulli,
8: subfic,
10: cmpli,
11: cmpi,
12: addic,
13: addic_,
14: addi,
15: addis,
16: bc,
17: sc,
18: b,
19: opcode19,
20: rlwimi,
21: rlwinm,
23: rlwnm,
24: ori,
25: oris,
26: xori,
27: xoris,
28: andi,
29: andis,
31: opcode31,
32: lwz,
33: lwzu,
34: lbz,
35: lbzu,
36: stw,
37: stwu,
38: stb,
39: stbu,
40: lhz,
41: lhzu,
42: lha,
43: lhau,
44: sth,
45: sthu,
46: lmw,
47: stmw,
48: lfs,
49: lfsu,
50: lfd,
51: lfdu,
52: stfs,
53: stfsu,
54: stfd,
55: stfdu,
59: opcode59,
63: opcode63
}
def disassemble(value, address):
opcode = value >> 26
if opcode not in opcode_table:
return "???"
instr = opcode_table[opcode](value, address)
if type(instr) == str:
return instr
return "%-10s%s" %(instr[0], instr[1])