diff --git a/gxf/cpu.py b/gxf/cpu.py index 03b47a0..36672be 100644 --- a/gxf/cpu.py +++ b/gxf/cpu.py @@ -10,6 +10,13 @@ def get_addrsz(): class Registers(object): + # ARM specific + CPSR_V = 1 << 28 + CPSR_C = 1 << 29 + CPSR_Z = 1 << 30 + CPSR_N = 1 << 31 + + # x86(_64) specific EFLAGS_CF = 1 << 0 EFLAGS_PF = 1 << 2 EFLAGS_AF = 1 << 4 @@ -49,19 +56,28 @@ def __init__(self): sl = l.split(None, 2) self.regs[sl[0]] = int(sl[1], 0) - eflags = self.regs["eflags"] - self.flags = {} - self.flags["CF"] = bool(eflags & self.EFLAGS_CF) - self.flags["PF"] = bool(eflags & self.EFLAGS_PF) - self.flags["AF"] = bool(eflags & self.EFLAGS_AF) - self.flags["ZF"] = bool(eflags & self.EFLAGS_ZF) - self.flags["SF"] = bool(eflags & self.EFLAGS_SF) - self.flags["TF"] = bool(eflags & self.EFLAGS_TF) - self.flags["IF"] = bool(eflags & self.EFLAGS_IF) - self.flags["DF"] = bool(eflags & self.EFLAGS_DF) - self.flags["OF"] = bool(eflags & self.EFLAGS_OF) + if 'eflags' in self.regs: # x86 + eflags = self.regs["eflags"] + + self.flags["CF"] = bool(eflags & self.EFLAGS_CF) + self.flags["PF"] = bool(eflags & self.EFLAGS_PF) + self.flags["AF"] = bool(eflags & self.EFLAGS_AF) + self.flags["ZF"] = bool(eflags & self.EFLAGS_ZF) + self.flags["SF"] = bool(eflags & self.EFLAGS_SF) + self.flags["TF"] = bool(eflags & self.EFLAGS_TF) + self.flags["IF"] = bool(eflags & self.EFLAGS_IF) + self.flags["DF"] = bool(eflags & self.EFLAGS_DF) + self.flags["OF"] = bool(eflags & self.EFLAGS_OF) + elif 'cpsr' in self.regs: # ARM + cpsr = self.regs["cpsr"] + + self.flags["N"] = bool(cpsr & self.CPSR_N) + self.flags["Z"] = bool(cpsr & self.CPSR_Z) + self.flags["V"] = bool(cpsr & self.CPSR_V) + self.flags["C"] = bool(cpsr & self.CPSR_C) + def get(self, reg): """ diff --git a/gxf/extensions/registers.py b/gxf/extensions/registers.py index a4578ce..c231641 100644 --- a/gxf/extensions/registers.py +++ b/gxf/extensions/registers.py @@ -35,7 +35,7 @@ def run(self, args): tomark.extend(regs.impact.get(t, ())) for reg, val in regs.regs.items(): - if reg == "eflags" or (len(reg) == 2 and reg[1] == "s"): + if reg == "cpsr" or reg == "eflags" or (len(reg) == 2 and reg[1] == "s"): continue if reg in tomark: @@ -51,3 +51,4 @@ def run(self, args): Formattable(((ttype, "%-4s" % reg), (Token.Comment, ": "))), memory.refchain(val))) +