2 #ifndef ROSE_BinaryAnalysis_Disassembler_Powerpc_H
3 #define ROSE_BinaryAnalysis_Disassembler_Powerpc_H
4 #include <featureTests.h>
5 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
6 #include <Rose/BinaryAnalysis/Disassembler/Base.h>
8 #include "integerOps.h"
9 #include "SageBuilderAsm.h"
12 namespace BinaryAnalysis {
13 namespace Disassembler {
26 State(): ip(0), insn(0) {}
30 ByteOrder::Endianness sex_;
41 virtual Base::Ptr
clone()
const;
52 class ExceptionPowerpc:
public Exception {
54 ExceptionPowerpc(
const std::string &mesg,
const State &state,
size_t bit=0)
58 bytes.push_back((state.insn>>24) & 0xff);
59 bytes.push_back((state.insn>>16) & 0xff);
60 bytes.push_back((state.insn>>8) & 0xff);
61 bytes.push_back(state.insn & 0xff);
62 ASSERT_require(bit<=32);
63 this->bit = 8*(4-(bit/8)) + bit%8;
83 template <
size_t First,
size_t Last> uint64_t fld(State&)
const;
86 bool AA(State &state)
const {
87 return fld<30, 30>(state);
98 uint64_t BD(State &state)
const {
99 return IntegerOps::signExtend<16, 64>((uint64_t)state.insn & 0xfffc);
119 return SageBuilderAsm::buildValueU8(fld<19, 20>(state));
127 return SageBuilderAsm::buildValueU8(fld<6, 10>(state));
137 return SageBuilderAsm::buildValueU32(IntegerOps::signExtend<16, 32>((uint64_t)fld<16, 31>(state)));
139 return SageBuilderAsm::buildValueU64(IntegerOps::signExtend<16, 64>((uint64_t)fld<16, 31>(state)));
141 ASSERT_not_reachable(
"invalid word size");
147 return SageBuilderAsm::buildValueU32(IntegerOps::signExtend<16, 32>((uint64_t)fld<16, 31>(state) & 0xfffc));
149 return SageBuilderAsm::buildValueU64(IntegerOps::signExtend<16, 64>((uint64_t)fld<16, 31>(state) & 0xfffc));
151 ASSERT_not_reachable(
"invalid word size");
155 return SageBuilderAsm::buildValueU8(fld<7, 14>(state));
179 return SageBuilderAsm::buildValueU8(fld<12, 19>(state));
183 return SageBuilderAsm::buildValueU8(fld<10, 10>(state));
187 return SageBuilderAsm::buildValueU8(fld<15, 15>(state));
190 uint8_t L_sync(State &state)
const {
191 return fld<9, 10>(state);
195 return SageBuilderAsm::buildValueU8(fld<20, 26>(state));
198 uint64_t LI(State &state)
const {
199 return IntegerOps::signExtend<26, 64>(uint64_t(fld<6, 29>(state) * 4));
202 bool LK(State &state)
const {
203 return fld<31, 31>(state);
207 return SageBuilderAsm::buildValueU8(fld<21, 25>(state));
211 return SageBuilderAsm::buildValueU8(fld<26, 30>(state));
215 return SageBuilderAsm::buildValueU8(fld<21, 25>(state) + 32 * fld<26, 26>(state));
219 return SageBuilderAsm::buildValueU8(fld<21, 25>(state) + 32 * fld<26, 26>(state));
223 return SageBuilderAsm::buildValueU8(fld<16, 20>(state) == 0 ? 32 : fld<16, 20>(state));
226 bool OE(State &state)
const {
227 return fld<21, 21>(state);
235 return fld<11, 15>(state) == 0 ? (
SgAsmExpression*)SageBuilderAsm::buildValueU8(0) : RA(state);
242 bool Rc(State &state)
const {
243 return fld<31, 31>(state);
255 return SageBuilderAsm::buildValueU8(fld<16, 20>(state));
259 return SageBuilderAsm::buildValueU8(fld<16, 20>(state) + fld<30, 30>(state) * 32);
279 return SageBuilderAsm::buildValueU8(fld<9, 10>(state));
283 return SageBuilderAsm::buildValueU8(fld<6, 10>(state));
287 return SageBuilderAsm::buildValueU8(fld<16, 19>(state));
293 return SageBuilderAsm::buildValueU32(fld<16, 31>(state));
295 return SageBuilderAsm::buildValueU64(fld<16, 31>(state));
297 ASSERT_not_reachable(
"invalid word size");
301 return SageBuilderAsm::buildMemoryReferenceExpression(SageBuilderAsm::buildAddExpression(RA_or_zero(state), D(state)), NULL, t);
305 return SageBuilderAsm::buildMemoryReferenceExpression(SageBuilderAsm::buildAddExpression(RA_or_zero(state), DS(state)), NULL, t);
309 return SageBuilderAsm::buildMemoryReferenceExpression(RA_or_zero(state), NULL, t);
313 return SageBuilderAsm::buildMemoryReferenceExpression(SageBuilderAsm::buildAddExpression(RA_or_zero(state), RB(state)),
318 if (fld<11, 15>(state) == 0)
319 throw ExceptionPowerpc(
"bits 11-15 must be nonzero", state);
320 return SageBuilderAsm::buildMemoryReferenceExpression(SageBuilderAsm::buildAddExpression(RA(state), D(state)), NULL, t);
324 if (fld<11, 15>(state) == 0)
325 throw ExceptionPowerpc(
"bits 11-15 must be nonzero", state);
326 return SageBuilderAsm::buildMemoryReferenceExpression(SageBuilderAsm::buildAddExpression(RA(state), RB(state)), NULL, t);
354 void startInstruction(State &state, rose_addr_t start_va, uint32_t c)
const {
Base class for references to a machine register.
Condition Register (only particular fields or bits may be used).
Sawyer::SharedPointer< Powerpc > PowerpcPtr
Reference counted pointer for Powerpc decoder.
Base class for machine instructions.
Time base register (0..1023).
Disassembler for the PowerPC architecture.
Main namespace for the ROSE library.
virtual SgAsmInstruction * makeUnknownInstruction(const Exception &)
Makes an unknown instruction from an exception.
PowerpcInstructionKind
PowerPC instruction types.
PowerpcPtr Ptr
Reference counting pointer.
Reference to memory locations.
Base class for integer values.
Floating-Point Register (0..31; 64 bits each).
Represents one PowerPC machine instruction.
Special-purpose register (0..1023).
virtual SgAsmInstruction * disassembleOne(const MemoryMap::Ptr &map, rose_addr_t start_va, AddressSet *successors=NULL)
This is the lowest level disassembly function and is implemented in the architecture-specific subclas...
Base class for expressions.
virtual Base::Ptr clone() const
Creates a new copy of a disassembler.
Whole CR (or unknown or not using a CR).
Floating point status and control register.
Base class for binary types.
PowerpcWordSize
PowerPC word size.
General Purpose Register (0..31).
virtual bool canDisassemble(SgAsmGenericHeader *) const
Predicate determining the suitability of a disassembler for a specific file header.
PowerpcConditionRegisterAccessGranularity
PowerPC condition register access granularity.
static Ptr instance(PowerpcWordSize wordSize, ByteOrder::Endianness sex)
Allocating constructor for 32- or 64-bit disassembler.
Base class for all ROSE exceptions.
Virtual base class for instruction disassemblers.
PowerpcRegisterClass
PowerPC register classes.
virtual Unparser::BasePtr unparser() const
Unparser.