My Project
|
A low-level machine address for labelling bytes and data. More...
#include <address.hh>
Public Types | |
enum | mach_extreme { m_minimal, m_maximal } |
An enum for specifying extremal addresses. More... | |
Public Member Functions | |
Address (mach_extreme ex) | |
Initialize an extremal address. More... | |
Address (void) | |
Create an invalid address. More... | |
Address (AddrSpace *id, uintb off) | |
Construct an address with a space/offset pair. More... | |
Address (const Address &op2) | |
A copy constructor. More... | |
bool | isInvalid (void) const |
Is the address invalid? More... | |
int4 | getAddrSize (void) const |
Get the number of bytes in the address. More... | |
bool | isBigEndian (void) const |
Is data at this address big endian encoded. More... | |
void | printRaw (ostream &s) const |
Write a raw version of the address to a stream. More... | |
int4 | read (const string &s) |
Read in the address from a string. More... | |
AddrSpace * | getSpace (void) const |
Get the address space. More... | |
uintb | getOffset (void) const |
Get the address offset. More... | |
void | toPhysical (void) |
Convert this to a physical address. More... | |
char | getShortcut (void) const |
Get the shortcut character for the address space. More... | |
Address & | operator= (const Address &op2) |
Copy an address. More... | |
bool | operator== (const Address &op2) const |
Compare two addresses for equality. More... | |
bool | operator!= (const Address &op2) const |
Compare two addresses for inequality. More... | |
bool | operator< (const Address &op2) const |
Compare two addresses via their natural ordering. More... | |
bool | operator<= (const Address &op2) const |
Compare two addresses via their natural ordering. More... | |
Address | operator+ (int4 off) const |
Increment address by a number of bytes. More... | |
Address | operator- (int4 off) const |
Decrement address by a number of bytes. More... | |
bool | containedBy (int4 sz, const Address &op2, int4 sz2) const |
Determine if op2 range contains this range. More... | |
int4 | justifiedContain (int4 sz, const Address &op2, int4 sz2, bool forceleft) const |
Determine if op2 is the least significant part of this. More... | |
int4 | overlap (int4 skip, const Address &op, int4 size) const |
Determine how two address ranges overlap. More... | |
bool | isContiguous (int4 sz, const Address &loaddr, int4 losz) const |
Does this form a contigous range with loaddr. More... | |
bool | isConstant (void) const |
Is this a constant value. More... | |
void | renormalize (int4 size) |
Make sure there is a backing JoinRecord if this is in the join space. More... | |
bool | isJoin (void) const |
Is this a join value. More... | |
void | saveXml (ostream &s) const |
Save this to a stream as an XML tag. More... | |
void | saveXml (ostream &s, int4 size) const |
Save this and a size to a stream as an XML tag. More... | |
Static Public Member Functions | |
static Address | restoreXml (const Element *el, const AddrSpaceManager *manage) |
Restore an address from parsed XML. More... | |
static Address | restoreXml (const Element *el, const AddrSpaceManager *manage, int4 &size) |
Restore an address and size from parsed XML. More... | |
static AddrSpace * | getSpaceFromConst (const Address &addr) |
Recover an encoded address space from an address. More... | |
Protected Attributes | |
AddrSpace * | base |
Pointer to our address space. | |
uintb | offset |
Offset (in bytes) | |
Friends | |
ostream & | operator<< (ostream &s, const Address &addr) |
Write out an address to stream. More... | |
A low-level machine address for labelling bytes and data.
All data that can be manipulated within the processor reverse engineering model can be labelled with an Address. It is simply an address space (AddrSpace) and an offset within that space. Note that processor registers are typically modelled by creating a dedicated address space for them, as distinct from RAM say, and then specifying certain addresses within the register space that correspond to particular registers. However, an arbitrary address could refer to anything, RAM, ROM, cpu register, data segment, coprocessor, stack, nvram, etc. An Address represents an offset only, not an offset and length
Address::Address | ( | mach_extreme | ex | ) |
|
inline |
Create an invalid address.
An invalid address is possible in some circumstances. This deliberately constructs an invalid address
|
inline |
Construct an address with a space/offset pair.
This is the basic Address constructor
id | is the space containing the address |
off | is the offset of the address |
|
inline |
A copy constructor.
This is a standard copy constructor, copying the address space and the offset
op2 | is the Address to copy |
bool Address::containedBy | ( | int4 | sz, |
const Address & | op2, | ||
int4 | sz2 | ||
) | const |
Determine if op2 range contains this range.
Return true if the range starting at this extending the given number of bytes is contained by the second given range.
sz | is the given number of bytes in this range |
op2 | is the start of the second given range |
sz2 | is the number of bytes in the second given range |
|
inline |
Get the number of bytes in the address.
Get the number of bytes needed to encode the offset for this address.
|
inline |
Get the address offset.
Get the offset of the address as an integer.
|
inline |
Get the shortcut character for the address space.
Each address has a shortcut character associated with it for use with the read and printRaw methods.
|
inline |
Get the address space.
Get the address space associated with this address.
Recover an encoded address space from an address.
In LOAD and STORE instructions, the particular address space being read/written is encoded as a constant input parameter to the instruction. Internally, this constant is the actual pointer to the AddrSpace. This function allows the encoded pointer to be recovered from the address it is encoded in.
addr | is the Address encoding the pointer |
|
inline |
Is data at this address big endian encoded.
Determine if data stored at this address is big endian encoded.
|
inline |
Is this a constant value.
Determine if this address is from the constant space. All constant values are represented as an offset into the constant space.
bool Address::isContiguous | ( | int4 | sz, |
const Address & | loaddr, | ||
int4 | losz | ||
) | const |
Does this form a contigous range with loaddr.
Does the location this, sz form a contiguous region to loaddr, losz, where this forms the most significant piece of the logical whole
sz | is the size of this hi region |
loaddr | is the starting address of the low region |
losz | is the size of the low region |
|
inline |
Is the address invalid?
Determine if this is an invalid address. This only detects deliberate invalid addresses.
|
inline |
Is this a join value.
Determine if this address represents a set of joined memory locations.
int4 Address::justifiedContain | ( | int4 | sz, |
const Address & | op2, | ||
int4 | sz2, | ||
bool | forceleft | ||
) | const |
Determine if op2 is the least significant part of this.
Return -1 if (op2,sz2) is not properly contained in (this,sz). If it is contained, return the endian aware offset of (op2,sz2) I.e. if the least significant byte of the op2 range falls on the least significant byte of the this range, return 0. If it intersects the second least significant, return 1, etc. The -forceleft- toggle causes the check to be made against the left (lowest address) side of the container, regardless of the endianness. I.e. it forces a little endian interpretation.
sz | is the size of this range |
op2 | is the address of the second range |
sz2 | is the size of the second range |
forceleft | is true if containments is forced to be on the left even for big endian |
|
inline |
Compare two addresses for inequality.
Check if two addresses are not equal. I.e. if either their address space or offset are different.
op2 | is the address to compare to this |
|
inline |
Increment address by a number of bytes.
Add an integer value to the offset portion of the address. The addition takes into account the size of the address space, and the Address will wrap around if necessary.
off | is the number to add to the offset |
|
inline |
Decrement address by a number of bytes.
Subtract an integer value from the offset portion of the address. The subtraction takes into account the size of the address space, and the Address will wrap around if necessary.
off | is the number to subtract from the offset |
|
inline |
Compare two addresses via their natural ordering.
Do an ordering comparison of two addresses. Addresses are sorted first on space, then on offset. So two addresses in the same space compare naturally based on their offset, but addresses in different spaces also compare. Different spaces are ordered by their index.
op2 | is the address to compare to |
|
inline |
Compare two addresses via their natural ordering.
Do an ordering comparison of two addresses.
op2 | is the address to compare to |
Copy an address.
This is a standard assignment operator, copying the address space pointer and the offset
op2 | is the Address being assigned |
|
inline |
Compare two addresses for equality.
Check if two addresses are equal. I.e. if their address space and offset are the same.
op2 | is the address to compare to this |
int4 Address::overlap | ( | int4 | skip, |
const Address & | op, | ||
int4 | size | ||
) | const |
Determine how two address ranges overlap.
If this + skip falls in the range op to op + size, then a non-negative integer is returned indicating where in the interval it falls. I.e. if this + skip == op, then 0 is returned. Otherwise -1 is returned.
skip | is an adjust to this address |
op | is the start of the range to check |
size | is the size of the range |
|
inline |
Write a raw version of the address to a stream.
Write a short-hand or debug version of this address to a stream.
s | is the stream being written |
|
inline |
Read in the address from a string.
Convert a string into an address. The string format can be tailored for the particular address space.
s | is the string to parse |
void Address::renormalize | ( | int4 | size | ) |
Make sure there is a backing JoinRecord if this is in the join space.
If this is (originally) a join address, reevaluate it in terms of its new offset and siz, changing the space and offset if necessary.
size | is the new size in bytes of the underlying object |
|
static |
Restore an address from parsed XML.
This is usually used to build an address from an <addr> tag, but it can be used to create an address from any tag with the appropriate attributes
or a name attribute can be used to recover an address based on a register name.
el | is the parsed tag |
manage | is the address space manager for the program |
|
static |
Restore an address and size from parsed XML.
This is usually used to build an address from an <addr> tag, but it can be used to create an address from any tag with the appropriate attributes
or a name attribute can be used to recover an address and size based on a register name. If a size is recovered it is stored in size reference.
el | is the parsed tag |
manage | is the address space manager for the program |
size | is the reference to any recovered size |
|
inline |
Save this to a stream as an XML tag.
Save an <addr> tag corresponding to this address to a stream. The exact format is determined by the address space, but this generally has a space and an offset attribute.
s | is the stream being written to |
|
inline |
Save this and a size to a stream as an XML tag.
Save an <addr> tag corresponding to this address to a stream. The tag will also include an extra size attribute so that it can describe an entire memory range.
s | is the stream being written to |
size | is the number of bytes in the range |
void Address::toPhysical | ( | void | ) |
Convert this to a physical address.
|
friend |
Write out an address to stream.
This allows an Address to be written to a stream using the standard '<<' operator. This is a wrapper for the printRaw method and is intended for debugging and console mode uses.
s | is the stream being written to |
addr | is the Address to write |