Package ghidra.program.model.address
Class ProtectedAddressSpace
java.lang.Object
ghidra.program.model.address.GenericAddressSpace
ghidra.program.model.address.SegmentedAddressSpace
ghidra.program.model.address.ProtectedAddressSpace
- All Implemented Interfaces:
AddressSpace
,Comparable<AddressSpace>
Address Space for (intel) 16-bit protected mode programs. This space produces
SegmentedAddress objects whose underlying (flat) offset encodes both the
segment and the segment offset without losing information. There is no possibility
of alternate encodings for a single address as with real-mode.
-
Field Summary
Modifier and TypeFieldDescriptionprotected Address
protected long
protected final Address
protected final long
protected final int
protected long
Fields inherited from interface ghidra.program.model.address.AddressSpace
DEFAULT_REGISTER_SPACE, EXTERNAL_SPACE, HASH_SPACE, ID_SIZE_MASK, ID_SIZE_SHIFT, ID_TYPE_MASK, ID_UNIQUE_SHIFT, OTHER_SPACE, TYPE_CODE, TYPE_CONSTANT, TYPE_DELETED, TYPE_EXTERNAL, TYPE_IPTR_CONSTANT, TYPE_IPTR_INTERNAL, TYPE_IPTR_SPACEBASE, TYPE_JOIN, TYPE_NONE, TYPE_OTHER, TYPE_RAM, TYPE_REGISTER, TYPE_STACK, TYPE_SYMBOL, TYPE_UNIQUE, TYPE_UNKNOWN, TYPE_VARIABLE, VARIABLE_SPACE
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionCreates a new address by adding displacement to the given address.addNoWrap
(GenericAddress addr, BigInteger displacement) Creates a new address by adding displacement to the given address.Creates a new address by adding displacement to the given address.addWrapSpace
(Address addr, long displacement) Creates a new address by adding the displacement to the given address.int
compareTo
(AddressSpace space) boolean
getAddress
(long offset, boolean isAddressableWordOffset) Returns a new address in this space with the given offset.final Address
getAddress
(String addrString) Parses the String into an address within this address space.int
Returns the number of data bytes which correspond to each addressable location within this space (i.e., word-size in bytes).long
getAddressableWordOffset
(long byteOffset) Get the addressable memory word offset which corresponds to the specified memory byte offset.protected SegmentedAddress
getAddressInSegment
(long flat, int preferredSegment) Given a flat address offset and a preferred segment, try to create an address that maps to the offset and is in the segment.protected long
getDefaultOffsetFromFlat
(long flat) Given a flat address offset, extract the offset portion assuming the default segment.protected int
getDefaultSegmentFromFlat
(long flat) Given a flat address offset, extract the default 16-bit segment portionprotected long
getFlatOffset
(int segment, long offset) Given a 16-bit segment and an offset, produce the flat address offsetGet the maximum address allowed for this AddressSpace.Get the minimum address allowed for this AddressSpace.int
getNextOpenSegment
(Address addr) Get the segment index for the first segment whose start address comes after the given addressprotected long
getOffsetFromFlat
(long flat, int segment) Given a flat address offset, extract a segment offset assuming a specific segment value.getOverlayAddress
(Address addr) No overlay translation necessary, this is a base addressSpace.int
getSize()
Returns the number of bits that are used to form the address.int
Get the ID for this spacegetTruncatedAddress
(long offset, boolean isAddressableWordOffset) Returns a new address in this space with the given offset.int
getType()
Returns the type of this address spaceint
Returns the unique id value for this space.final int
hashCode()
boolean
Returns true if this space has registers that are mapped into it.boolean
Returns true if space uses signed offsetboolean
Returns true if this space in the constant spaceboolean
Returns true if this space in the EXTERNAL_SPACEboolean
Returns true if this space represents a location in the HASH space.boolean
Returns true if this space represents represents a Loaded Memory region (e.g., processor RAM).boolean
Returns true if this space represents a memory address.boolean
Returns true if this space represents represents a Non-Loaded storage region for retaining non-loaded file data (e.g., OTHER)boolean
Returns true if this addressSpace is an OverlayAddressSpaceboolean
Returns true if this space represents a register locationboolean
Returns true if this space represents a stack locationboolean
isSuccessor
(Address addr1, Address addr2) Tests whether addr2 immediately follows addr1.boolean
Returns true if this space in the unique spaceboolean
isValidRange
(long byteOffset, long length) Check the specified address range for validity within this space.boolean
Returns true if this space represents a variable locationlong
makeValidOffset
(long offset) Tests if the offset if valid.void
setHasMappedRegisters
(boolean hasRegisters) Tag this memory space as having memory mapped registersvoid
setShowSpaceName
(boolean b) boolean
Returns true if the address should display its addressSpace name.long
Calculates the displacement between addr1 and addr2 (addr1 - addr2)subtractNoWrap
(Address addr, long displacement) Creates a new address by subtracting displacement from addr's offset.subtractWrap
(Address addr, long displacement) Creates a new address by subtracting displacement from addr's offset.subtractWrapSpace
(Address addr, long displacement) Creates a new address by subtracting the displacement from the given address.protected void
testAddressSpace
(Address addr) toString()
long
truncateAddressableWordOffset
(long wordOffset) Truncate the specified addressable unit/word offset within this space to produce a valid offset.long
truncateOffset
(long offset) Truncate the specified byte offset within this space to produce a valid offset.Methods inherited from class ghidra.program.model.address.SegmentedAddressSpace
add, getAddress, getAddress, getAddress, getAddressInThisSpaceOnly, getPhysicalSpace, getPointerSize, getUncheckedAddress, subtract
Methods inherited from class ghidra.program.model.address.GenericAddressSpace
getName
-
Field Details
-
minOffset
protected final long minOffset -
maxOffset
protected long maxOffset -
minAddress
-
maxAddress
-
spaceSize
protected long spaceSize -
spaceID
protected final int spaceID
-
-
Constructor Details
-
ProtectedAddressSpace
-
-
Method Details
-
getFlatOffset
protected long getFlatOffset(int segment, long offset) Description copied from class:SegmentedAddressSpace
Given a 16-bit segment and an offset, produce the flat address offset- Overrides:
getFlatOffset
in classSegmentedAddressSpace
- Parameters:
segment
- is the segment valueoffset
- is the 16-bit offset into the segment- Returns:
- the encoded flat offset
-
getDefaultSegmentFromFlat
protected int getDefaultSegmentFromFlat(long flat) Description copied from class:SegmentedAddressSpace
Given a flat address offset, extract the default 16-bit segment portion- Overrides:
getDefaultSegmentFromFlat
in classSegmentedAddressSpace
- Parameters:
flat
- is the flat offset- Returns:
- the segment value
-
getDefaultOffsetFromFlat
protected long getDefaultOffsetFromFlat(long flat) Description copied from class:SegmentedAddressSpace
Given a flat address offset, extract the offset portion assuming the default segment.- Overrides:
getDefaultOffsetFromFlat
in classSegmentedAddressSpace
- Parameters:
flat
- is the flat offset- Returns:
- the offset value
-
getOffsetFromFlat
protected long getOffsetFromFlat(long flat, int segment) Description copied from class:SegmentedAddressSpace
Given a flat address offset, extract a segment offset assuming a specific segment value.- Overrides:
getOffsetFromFlat
in classSegmentedAddressSpace
- Parameters:
flat
- is the flat offsetsegment
- is the specific segment value- Returns:
- the segment offset
-
getAddressInSegment
Description copied from class:SegmentedAddressSpace
Given a flat address offset and a preferred segment, try to create an address that maps to the offset and is in the segment. For architectures like x86 real-mode, multiple address encodings can map to the same flat address offset. This method tries to select between the different encodings. If the flat offset cannot be encoded with the preferred segment, null is returned.- Overrides:
getAddressInSegment
in classSegmentedAddressSpace
- Parameters:
flat
- is the flat offsetpreferredSegment
- is the 16-bit preferred segment value- Returns:
- the segment encoded address or null
-
getNextOpenSegment
Description copied from class:SegmentedAddressSpace
Get the segment index for the first segment whose start address comes after the given address- Overrides:
getNextOpenSegment
in classSegmentedAddressSpace
- Parameters:
addr
- is the given address- Returns:
- the segment index
-
hasSignedOffset
public boolean hasSignedOffset()Description copied from interface:AddressSpace
Returns true if space uses signed offset- Specified by:
hasSignedOffset
in interfaceAddressSpace
-
getSize
public int getSize()Description copied from interface:AddressSpace
Returns the number of bits that are used to form the address. Thus the maximum offset for this address space will be 2^size-1.- Specified by:
getSize
in interfaceAddressSpace
-
getAddressableUnitSize
public int getAddressableUnitSize()Description copied from interface:AddressSpace
Returns the number of data bytes which correspond to each addressable location within this space (i.e., word-size in bytes). NOTE: When transforming a byte-offset to an addressable word offset the methodAddressSpace.getAddressableWordOffset(long)
should be used instead of simple division. When transforming an addressable word-offset to a byte-offset simple multiplication may be used. Neither of these transformations perform address space bounds checking.byteOffset = wordOffset * addressUnitSize wordOffset = getAddressableWordOffset(byteOffset)
- Specified by:
getAddressableUnitSize
in interfaceAddressSpace
-
getAddressableWordOffset
public long getAddressableWordOffset(long byteOffset) Description copied from interface:AddressSpace
Get the addressable memory word offset which corresponds to the specified memory byte offset. This method handles some of the issues of unsigned math when stuck using Java's signed long primitives. No space bounds checking is performed.- Specified by:
getAddressableWordOffset
in interfaceAddressSpace
- Parameters:
byteOffset
- memory byte offset- Returns:
- addressable memory word offset
-
getType
public int getType()Description copied from interface:AddressSpace
Returns the type of this address space- Specified by:
getType
in interfaceAddressSpace
-
getUnique
public int getUnique()Returns the unique id value for this space.- Specified by:
getUnique
in interfaceAddressSpace
-
getAddress
Description copied from interface:AddressSpace
Parses the String into an address within this address space.- Specified by:
getAddress
in interfaceAddressSpace
- Parameters:
addrString
- the string to parse as an address.- Returns:
- an address if the string parsed successfully or null if the AddressSpace specified in the addrString is not this space.
- Throws:
AddressFormatException
- if the string cannot be parsed or the parsed offset is larger than the size for this space.
-
getAddress
public Address getAddress(long offset, boolean isAddressableWordOffset) throws AddressOutOfBoundsException Description copied from interface:AddressSpace
Returns a new address in this space with the given offset. NOTE: for those spaces with an addressable unit size other than 1, the address returned may not correspond to an addressable unit/word boundary if a byte-offset is specified.- Specified by:
getAddress
in interfaceAddressSpace
- Parameters:
offset
- the offset for the new address.isAddressableWordOffset
- if true the specified offset is an addressable unit/word offset, otherwise offset is a byte offset. SeeAddressSpace.getAddressableUnitSize()
to understand the distinction (i.e., wordOffset = byteOffset * addressableUnitSize).- Returns:
- address with given offset
- Throws:
AddressOutOfBoundsException
- if the offset is less than 0 or greater than the max offset allowed for this space.
-
getTruncatedAddress
Description copied from interface:AddressSpace
Returns a new address in this space with the given offset. The specified offset will be truncated within the space and will not throw an exception. NOTE: for those spaces with an addressable unit size other than 1, the address returned may not correspond to a word boundary (addressable unit) if a byte-offset is specified.- Specified by:
getTruncatedAddress
in interfaceAddressSpace
- Parameters:
offset
- the offset for the new address.isAddressableWordOffset
- if true the specified offset is an addressable unit/word offset, otherwise offset is a byte offset. SeeAddressSpace.getAddressableUnitSize()
to understand the distinction (i.e., wordOffset = byteOffset * addressableUnitSize).- Returns:
- address with given byte offset truncated to the physical space size
-
subtract
Description copied from interface:AddressSpace
Calculates the displacement between addr1 and addr2 (addr1 - addr2)- Specified by:
subtract
in interfaceAddressSpace
- Parameters:
addr1
- the address to subtract from.addr2
- the address to subtract.- Returns:
- the difference. (
addr1.offset - addr2.offset
).
-
subtractWrap
Description copied from interface:AddressSpace
Creates a new address by subtracting displacement from addr's offset.- Specified by:
subtractWrap
in interfaceAddressSpace
- Parameters:
addr
- the original address. The new address will wrap in a manner that depends on the address space. For a generic address space this will wrap at the extents of the address space. For a segmented address space it will wrap at the extents of the segment.displacement
- the displacement to subtract.- Returns:
- a new address created by subtracting the displacement from addr.offset.
-
subtractWrapSpace
Description copied from interface:AddressSpace
Creates a new address by subtracting the displacement from the given address. If the offset is greater than the max offset of the address space, the high order bits are masked off, making the address wrap. For non-segmented addresses this will be the same as subtractWrap(). For segmented addresses, the address will wrap when the 20 bit (oxfffff) offset is exceeded, as opposed to when the segment offset is exceeded.- Specified by:
subtractWrapSpace
in interfaceAddressSpace
- Parameters:
addr
- the address to subtract the displacement from.displacement
- the displacement to subtract.- Returns:
- The new Address formed by subtracting the displacement from the specified address.
-
subtractNoWrap
Description copied from interface:AddressSpace
Creates a new address by subtracting displacement from addr's offset. The new offset will NOT wrap!- Specified by:
subtractNoWrap
in interfaceAddressSpace
- Parameters:
addr
- the original addressdisplacement
- the displacement to subtract.- Returns:
- The new address created by subtracting displacement from addr.offset.
- Throws:
AddressOverflowException
- if the subtraction would cause a wrap,
-
addWrap
Description copied from interface:AddressSpace
Creates a new address by adding displacement to the given address. The resulting address may wrap. The new address will wrap in a manner that depends on the address space. For a generic address space this will wrap at the extents of the address space. For a segmented address space it will wrap at the extents of the segment.- Specified by:
addWrap
in interfaceAddressSpace
- Parameters:
addr
- the original address.displacement
- the displacement to add.- Returns:
- the new address created by adding displacement to addr.offset.
-
addWrapSpace
Description copied from interface:AddressSpace
Creates a new address by adding the displacement to the given address. If the offset is greater than the max offset of the address space, the high order bits are masked off, making the address wrap. For non-segmented addresses this will be the same as addWrap(). For segmented addresses, the address will wrap when the 20 bit (oxfffff) offset is exceeded, as opposed to when the segment offset is exceeded.- Specified by:
addWrapSpace
in interfaceAddressSpace
- Parameters:
addr
- the address to add the displacement to.displacement
- the displacement to add.- Returns:
- The new Address formed by adding the displacement to the specified addresst.
-
addNoWrap
Description copied from interface:AddressSpace
Creates a new address by adding displacement to the given address. The new address will NOT wrap!- Specified by:
addNoWrap
in interfaceAddressSpace
- Parameters:
addr
- the original address.displacement
- the displacement to add.- Returns:
- The new address created by adding displacement to addr.offset.
- Throws:
AddressOverflowException
- if the addition would cause a wrap,
-
addNoWrap
public Address addNoWrap(GenericAddress addr, BigInteger displacement) throws AddressOverflowException Description copied from interface:AddressSpace
Creates a new address by adding displacement to the given address. The new address will NOT wrap!- Specified by:
addNoWrap
in interfaceAddressSpace
- Parameters:
addr
- the original address.displacement
- the displacement to add.- Returns:
- The new address created by adding displacement to addr.offset.
- Throws:
AddressOverflowException
- if the addition would cause a wrap,
-
isValidRange
public boolean isValidRange(long byteOffset, long length) Description copied from interface:AddressSpace
Check the specified address range for validity within this space. Segmented spaces will restrict a range to a single segment.- Specified by:
isValidRange
in interfaceAddressSpace
- Parameters:
byteOffset
-length
-- Returns:
- true if range is valid for this space
-
isSuccessor
Description copied from interface:AddressSpace
Tests whether addr2 immediately follows addr1.- Specified by:
isSuccessor
in interfaceAddressSpace
- Parameters:
addr1
- the first address.addr2
- the second address.
-
getMaxAddress
Description copied from interface:AddressSpace
Get the maximum address allowed for this AddressSpace. NOTE: Use of this method to identify the region associated with an overlay memory block within its overlay address space is no longer supported. Defined regions of an overlay space may now be determined usingOverlayAddressSpace.getOverlayAddressSet()
.- Specified by:
getMaxAddress
in interfaceAddressSpace
- Returns:
- maximum address of this address space.
-
getMinAddress
Description copied from interface:AddressSpace
Get the minimum address allowed for this AddressSpace. For a memory space the returned address will have an offset of 0 within this address space. NOTE: Use of this method to identify the region associated with an overlay memory block within its overlay address space is no longer supported. Defined regions of an overlay space may now be determined usingOverlayAddressSpace.getOverlayAddressSet()
.- Specified by:
getMinAddress
in interfaceAddressSpace
- Returns:
- minimum address of this address space.
-
compareTo
- Specified by:
compareTo
in interfaceComparable<AddressSpace>
-
equals
-
hashCode
public final int hashCode() -
getSpaceID
public int getSpaceID()Description copied from interface:AddressSpace
Get the ID for this space- Specified by:
getSpaceID
in interfaceAddressSpace
- Returns:
- space ID
-
testAddressSpace
-
toString
-
showSpaceName
public boolean showSpaceName()Description copied from interface:AddressSpace
Returns true if the address should display its addressSpace name.- Specified by:
showSpaceName
in interfaceAddressSpace
-
getOverlayAddress
No overlay translation necessary, this is a base addressSpace. (non-Javadoc)- Specified by:
getOverlayAddress
in interfaceAddressSpace
- Parameters:
addr
- address possibly falling within this overlay space.- Returns:
- an address relative to this overlay
- See Also:
-
makeValidOffset
Description copied from interface:AddressSpace
Tests if the offset if valid. If the space is signed, then it sign extends the offset.- Specified by:
makeValidOffset
in interfaceAddressSpace
- Parameters:
offset
- the offset to test and/or sign extend- Returns:
- the valid positive offset or appropriate sign extended offset.
- Throws:
AddressOutOfBoundsException
- if offset is invalid
-
truncateOffset
public long truncateOffset(long offset) Description copied from interface:AddressSpace
Truncate the specified byte offset within this space to produce a valid offset.- Specified by:
truncateOffset
in interfaceAddressSpace
- Parameters:
offset
- any byte offset- Returns:
- truncated byte offset
-
truncateAddressableWordOffset
public long truncateAddressableWordOffset(long wordOffset) Description copied from interface:AddressSpace
Truncate the specified addressable unit/word offset within this space to produce a valid offset.- Specified by:
truncateAddressableWordOffset
in interfaceAddressSpace
- Parameters:
wordOffset
- any addressable unit/word offset- Returns:
- truncated word offset
-
isMemorySpace
public boolean isMemorySpace()Description copied from interface:AddressSpace
Returns true if this space represents a memory address. NOTE: It is important to make the distinction between Loaded and Non-Loaded memory addresses. Program importers may create memory blocks associated with Non-Loaded file content which are not associated with processor defined memory regions. While Loaded file content is placed into memory blocks which are associated with specific memory address spaces defined by the processor language specification.- Specified by:
isMemorySpace
in interfaceAddressSpace
- See Also:
-
isLoadedMemorySpace
public boolean isLoadedMemorySpace()Description copied from interface:AddressSpace
Returns true if this space represents represents a Loaded Memory region (e.g., processor RAM).- Specified by:
isLoadedMemorySpace
in interfaceAddressSpace
-
isNonLoadedMemorySpace
public boolean isNonLoadedMemorySpace()Description copied from interface:AddressSpace
Returns true if this space represents represents a Non-Loaded storage region for retaining non-loaded file data (e.g., OTHER)- Specified by:
isNonLoadedMemorySpace
in interfaceAddressSpace
-
isHashSpace
public boolean isHashSpace()Description copied from interface:AddressSpace
Returns true if this space represents a location in the HASH space.- Specified by:
isHashSpace
in interfaceAddressSpace
-
isRegisterSpace
public boolean isRegisterSpace()Description copied from interface:AddressSpace
Returns true if this space represents a register location- Specified by:
isRegisterSpace
in interfaceAddressSpace
-
isStackSpace
public boolean isStackSpace()Description copied from interface:AddressSpace
Returns true if this space represents a stack location- Specified by:
isStackSpace
in interfaceAddressSpace
-
isUniqueSpace
public boolean isUniqueSpace()Description copied from interface:AddressSpace
Returns true if this space in the unique space- Specified by:
isUniqueSpace
in interfaceAddressSpace
-
isConstantSpace
public boolean isConstantSpace()Description copied from interface:AddressSpace
Returns true if this space in the constant space- Specified by:
isConstantSpace
in interfaceAddressSpace
-
isVariableSpace
public boolean isVariableSpace()Description copied from interface:AddressSpace
Returns true if this space represents a variable location- Specified by:
isVariableSpace
in interfaceAddressSpace
-
isExternalSpace
public boolean isExternalSpace()Description copied from interface:AddressSpace
Returns true if this space in the EXTERNAL_SPACE- Specified by:
isExternalSpace
in interfaceAddressSpace
-
isOverlaySpace
public boolean isOverlaySpace()Description copied from interface:AddressSpace
Returns true if this addressSpace is an OverlayAddressSpace- Specified by:
isOverlaySpace
in interfaceAddressSpace
-
setShowSpaceName
public void setShowSpaceName(boolean b) -
hasMappedRegisters
public boolean hasMappedRegisters()Description copied from interface:AddressSpace
Returns true if this space has registers that are mapped into it. This means that registers could actually have pointers to them.- Specified by:
hasMappedRegisters
in interfaceAddressSpace
- Returns:
- true if this space has any registers mapped in it.
-
setHasMappedRegisters
public void setHasMappedRegisters(boolean hasRegisters) Tag this memory space as having memory mapped registers- Parameters:
hasRegisters
- true if it has registers, false otherwise
-