diff options
Diffstat (limited to 'disassembler')
-rw-r--r-- | disassembler/disassembler_arm.cc | 19 | ||||
-rw-r--r-- | disassembler/disassembler_arm.h | 2 |
2 files changed, 18 insertions, 3 deletions
diff --git a/disassembler/disassembler_arm.cc b/disassembler/disassembler_arm.cc index 90d84d5a72..71f70c4e5b 100644 --- a/disassembler/disassembler_arm.cc +++ b/disassembler/disassembler_arm.cc @@ -81,6 +81,19 @@ void DisassemblerArm::DumpCond(std::ostream& os, uint32_t cond) { } } +void DisassemblerArm::DumpMemoryDomain(std::ostream& os, uint32_t domain) { + switch (domain) { + case 0b1111: os << "sy"; break; + case 0b1110: os << "st"; break; + case 0b1011: os << "ish"; break; + case 0b1010: os << "ishst"; break; + case 0b0111: os << "nsh"; break; + case 0b0110: os << "nshst"; break; + case 0b0011: os << "osh"; break; + case 0b0010: os << "oshst"; break; + } +} + void DisassemblerArm::DumpBranchTarget(std::ostream& os, const uint8_t* instr_ptr, int32_t imm32) { os << StringPrintf("%+d (%p)", imm32, instr_ptr + imm32); } @@ -996,9 +1009,9 @@ size_t DisassemblerArm::DumpThumb32(std::ostream& os, const uint8_t* instr_ptr) // Miscellaneous control instructions uint32_t op5 = (instr >> 4) & 0xF; switch (op5) { - case 4: opcode << "dsb"; break; - case 5: opcode << "dmb"; break; - case 6: opcode << "isb"; break; + case 4: opcode << "dsb"; DumpMemoryDomain(args, instr & 0xF); break; + case 5: opcode << "dmb"; DumpMemoryDomain(args, instr & 0xF); break; + case 6: opcode << "isb"; DumpMemoryDomain(args, instr & 0xF); break; } } break; diff --git a/disassembler/disassembler_arm.h b/disassembler/disassembler_arm.h index 2e699ffe88..e34274e126 100644 --- a/disassembler/disassembler_arm.h +++ b/disassembler/disassembler_arm.h @@ -30,6 +30,7 @@ class DisassemblerArm : public Disassembler { virtual size_t Dump(std::ostream& os, const uint8_t* begin); virtual void Dump(std::ostream& os, const uint8_t* begin, const uint8_t* end); + private: void DumpArm(std::ostream& os, const uint8_t* instr); @@ -39,6 +40,7 @@ class DisassemblerArm : public Disassembler { void DumpBranchTarget(std::ostream& os, const uint8_t* instr_ptr, int32_t imm32); void DumpCond(std::ostream& os, uint32_t cond); + void DumpMemoryDomain(std::ostream& os, uint32_t domain); std::vector<const char*> it_conditions_; |