diff options
| author | 2012-04-10 16:35:29 -0700 | |
|---|---|---|
| committer | 2012-04-10 16:35:29 -0700 | |
| commit | 06383ad19412d477e992afbe3c29e0ad9f957b95 (patch) | |
| tree | bc0c2a976881aa23fc5551fbd73ddc4e061c8579 /src | |
| parent | 0fabb64ae62fea257a9460ab0f07fa57f87e0755 (diff) | |
| parent | 92301d97693ea52f5f6a9bc62d0c7fc611f87c7b (diff) | |
Merge "Decode thread offsets in x86 disassembly." into ics-mr1-plus-art
Diffstat (limited to 'src')
| -rw-r--r-- | src/disassembler_x86.cc | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/src/disassembler_x86.cc b/src/disassembler_x86.cc index 9fc6fbf5f7..496da2ab16 100644 --- a/src/disassembler_x86.cc +++ b/src/disassembler_x86.cc @@ -20,6 +20,7 @@ #include "logging.h" #include "stringprintf.h" +#include "thread.h" namespace art { namespace x86 { @@ -67,14 +68,23 @@ static void DumpIndexReg(std::ostream& os, uint8_t rex, uint8_t reg) { DumpReg0(os, rex, reg_num, false, 0); } +enum SegmentPrefix { + kCs = 0x2e, + kSs = 0x36, + kDs = 0x3e, + kEs = 0x26, + kFs = 0x64, + kGs = 0x65, +}; + static void DumpSegmentOverride(std::ostream& os, uint8_t segment_prefix) { switch (segment_prefix) { - case 0x2E: os << "cs:"; break; - case 0x36: os << "ss:"; break; - case 0x3E: os << "ds:"; break; - case 0x26: os << "es:"; break; - case 0x64: os << "fs:"; break; - case 0x65: os << "gs:"; break; + case kCs: os << "cs:"; break; + case kSs: os << "ss:"; break; + case kDs: os << "ds:"; break; + case kEs: os << "es:"; break; + case kFs: os << "fs:"; break; + case kGs: os << "gs:"; break; default: break; } } @@ -93,12 +103,12 @@ size_t DisassemblerX86::DumpInstruction(std::ostream& os, const uint8_t* instr) prefix[0] = *instr; break; // Group 2 - segment override prefixes: - case 0x2E: - case 0x36: - case 0x3E: - case 0x26: - case 0x64: - case 0x65: + case kCs: + case kSs: + case kDs: + case kEs: + case kFs: + case kGs: prefix[1] = *instr; break; // Group 3 - operand size override: @@ -305,6 +315,7 @@ DISASSEMBLER_ENTRY(cmp, DumpReg(args, rex, *instr & 0x7, false, prefix[2]); } instr++; + uint32_t address_bits = 0; if (has_modrm) { uint8_t modrm = *instr; instr++; @@ -313,7 +324,8 @@ DISASSEMBLER_ENTRY(cmp, uint8_t rm = modrm & 7; std::ostringstream address; if (mod == 0 && rm == 5) { // fixed address - address << StringPrintf("[0x%X]", *reinterpret_cast<const uint32_t*>(instr)); + address_bits = *reinterpret_cast<const uint32_t*>(instr); + address << StringPrintf("[0x%x]", address_bits); instr += 4; } else if (rm == 4 && mod != 3) { // SIB uint8_t sib = *instr; @@ -407,6 +419,10 @@ DISASSEMBLER_ENTRY(cmp, } args << StringPrintf("%d (%p)", displacement, instr + displacement); } + if (prefix[1] == kFs) { + args << " ; "; + Thread::DumpThreadOffset(args, address_bits, 4); + } std::stringstream hex; for (size_t i = 0; begin_instr + i < instr; ++i) { hex << StringPrintf("%02X", begin_instr[i]); |