Class TaintPcodeExecutorStatePiece
- All Implemented Interfaces:
PcodeExecutorStatePiece<byte[],TaintVec>
The framework-provided class from which this derives expects us to implement state for each
address space using a separate storage object. We do this by providing TaintSpace, which
is where all the taint storage logic is actually located. We then use a map spaceMap to
lazily create a keep each of those spaces.
-
Nested Class Summary
Nested classes/interfaces inherited from interface ghidra.pcode.exec.PcodeExecutorStatePiece
PcodeExecutorStatePiece.Reason -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final Map<AddressSpace, TaintSpace> A lazily-populated map of address space to taint storage.Fields inherited from class ghidra.pcode.exec.AbstractLongOffsetPcodeExecutorStatePiece
addressArithmetic, arithmetic, cb, language, uniqueSpace -
Constructor Summary
ConstructorsConstructorDescriptionTaintPcodeExecutorStatePiece(Language language, PcodeArithmetic<byte[]> addressArithmetic, PcodeArithmetic<TaintVec> arithmetic, PcodeStateCallbacks cb) Create a state pieceTaintPcodeExecutorStatePiece(Language language, PcodeArithmetic<byte[]> addressArithmetic, PcodeStateCallbacks cb) Create the taint piece -
Method Summary
Modifier and TypeMethodDescriptionvoidclear()Erase the entire state or pieceCreate a deep copy of this stategetConcreteBuffer(Address address, PcodeArithmetic.Purpose purpose) Bind a buffer of concrete bytes at the given start addressprotected TaintSpacegetForSpace(AddressSpace space, boolean toWrite) Get the internal space for the given address spaceprotected TaintVecgetFromSpace(TaintSpace space, long offset, int size, PcodeExecutorStatePiece.Reason reason, PcodeStateCallbacks cb) Get a value from the given spacegetNextEntryInternal(AddressSpace space, long offset) Get the entry at a given offset (without issuing callbacks)getRegisterValuesFromSpace(TaintSpace space, List<Register> registers) Can the given space for register values, as inAbstractLongOffsetPcodeExecutorStatePiece.getRegisterValues()protected voidsetInSpace(TaintSpace space, long offset, int size, TaintVec val, PcodeStateCallbacks cb) Set a value in the given spaceMethods inherited from class ghidra.pcode.exec.AbstractLongOffsetPcodeExecutorStatePiece
checkSize, forkMap, getAddressArithmetic, getArithmetic, getFromNullSpace, getLanguage, getRegisterValues, getUnique, getVar, getVar, getVarInternal, getVarInternal, getVarInternal, setUnique, setVar, setVar, setVarInternal, setVarInternal, setVarInternal, streamPiecesMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface ghidra.pcode.exec.PcodeExecutorStatePiece
checkRange, getNextEntryInternal, getVar, getVar, getVar, inspectBigInteger, inspectByte, inspectConcrete, inspectInt, inspectLong, inspectRegisterValue, inspectShort, quantizeOffset, setBigInteger, setByte, setConcrete, setInt, setLong, setRegisterValue, setRegisterValue, setShort, setVar, setVar, setVar
-
Field Details
-
spaceMap
A lazily-populated map of address space to taint storage.
-
-
Constructor Details
-
TaintPcodeExecutorStatePiece
public TaintPcodeExecutorStatePiece(Language language, PcodeArithmetic<byte[]> addressArithmetic, PcodeArithmetic<TaintVec> arithmetic, PcodeStateCallbacks cb) Create a state piece- Parameters:
language- the emulator's languageaddressArithmetic- the arithmetic for the address typearithmetic- the arithmetic for the value typecb- callbacks to receive emulation events
-
TaintPcodeExecutorStatePiece
public TaintPcodeExecutorStatePiece(Language language, PcodeArithmetic<byte[]> addressArithmetic, PcodeStateCallbacks cb) Create the taint piece- Parameters:
language- the language of the emulatoraddressArithmetic- the address arithmetic, likely taken from the concrete piececb- callbacks to receive emulation events
-
-
Method Details
-
fork
Description copied from interface:PcodeExecutorStatePieceCreate a deep copy of this state- Parameters:
cb- callbacks to receive emulation events- Returns:
- the copy
-
getConcreteBuffer
Description copied from interface:PcodeExecutorStatePieceBind a buffer of concrete bytes at the given start address- Parameters:
address- the start addresspurpose- the reason why the emulator needs a concrete value- Returns:
- a buffer
-
getForSpace
Get the internal space for the given address spaceHere, we just follow the pattern: delegate to the space map.
- Specified by:
getForSpacein classAbstractLongOffsetPcodeExecutorStatePiece<byte[],TaintVec, TaintSpace> - Parameters:
space- the address spacetoWrite- in case internal spaces are generated lazily, this indicates the space must be present, because it is going to be written to.- Returns:
- the space, or
null
-
setInSpace
protected void setInSpace(TaintSpace space, long offset, int size, TaintVec val, PcodeStateCallbacks cb) Set a value in the given spaceBecause the super class places no bound on
<S>, we have to provide the delegation to the storage space.- Specified by:
setInSpacein classAbstractLongOffsetPcodeExecutorStatePiece<byte[],TaintVec, TaintSpace> - Parameters:
space- the address spaceoffset- the offset within the spacesize- the number of bytes to write (the size of the value)val- the value to storecb- callbacks to receive emulation events
-
getFromSpace
protected TaintVec getFromSpace(TaintSpace space, long offset, int size, PcodeExecutorStatePiece.Reason reason, PcodeStateCallbacks cb) Get a value from the given spaceBecause the super class places no bound on
<S>, we have to provide the delegation to the storage space.- Specified by:
getFromSpacein classAbstractLongOffsetPcodeExecutorStatePiece<byte[],TaintVec, TaintSpace> - Parameters:
space- the address spaceoffset- the offset within the spacesize- the number of bytes to read (the size of the value)reason- the reason for reading statecb- callbacks to receive emulation events- Returns:
- the read value
-
getRegisterValuesFromSpace
protected Map<Register,TaintVec> getRegisterValuesFromSpace(TaintSpace space, List<Register> registers) Description copied from class:AbstractLongOffsetPcodeExecutorStatePieceCan the given space for register values, as inAbstractLongOffsetPcodeExecutorStatePiece.getRegisterValues()- Specified by:
getRegisterValuesFromSpacein classAbstractLongOffsetPcodeExecutorStatePiece<byte[],TaintVec, TaintSpace> - Parameters:
space- the space to scanregisters- the registers known to be in the corresponding address space- Returns:
- the map of registers to values
-
clear
public void clear()Description copied from interface:PcodeExecutorStatePieceErase the entire state or pieceThis is generally only useful when the state is itself a cache to another object. This will ensure the state is reading from that object rather than a stale cache. If this is not a cache, this could in fact clear the whole state, and the machine using it will be left in the dark.
-
getNextEntryInternal
Description copied from interface:PcodeExecutorStatePieceGet the entry at a given offset (without issuing callbacks)(Optional operation) For pieces where each value is effective over a range, it is common to use an internal map (vice a byte array). When serializing the state, or otherwise seeking a complete examination, it is useful to retrieve those internal entries. This returns the next entry at or after the given offset within the given space. NOTE the returned entry must be for the given space. If no such entry exists, return
null.- Parameters:
space- the address spaceoffset- the offset within the space- Returns:
- the entry or null
-