Package ghidra.app.emulator
Class EmulatorHelper
java.lang.Object
ghidra.app.emulator.EmulatorHelper
- All Implemented Interfaces:
EmulatorConfiguration
,MemoryFaultHandler
This is the primary "entry point" for using an
Emulator
.
This is part of the older p-code emulation system. For information about the newer p-code
emulation system, see PcodeEmulator
. There are several example scripts in the
SystemEmulation
module.
- See Also:
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
clearBreakpoint
(Address addr) Clear breakpointcreateMemoryBlockFromMemoryState
(String name, Address start, int length, boolean overlay, TaskMonitor monitor) Create a new initialized memory block using the current emulator memory statevoid
dispose()
void
enableMemoryWriteTracking
(boolean enable) Enable/Disable tracking of memory writes in the form of an address set.Get the current context register valueGet current execution addressGet Program Counter (PC) register defined by applicable processor specificationGet Stack Pointer register defined by applicable compiler specificationprotected Emulator
byte[]
readMemory
(Address addr, int length) byte
readMemoryByte
(Address addr) readNullTerminatedString
(Address addr, int maxLength) Read string from memory state.readRegister
(Register reg) readRegister
(String regName) readStackValue
(int relativeOffset, int size, boolean signed) Read a stack value from the memory state.void
registerCallOtherCallback
(String pcodeOpName, BreakCallBack callback) Register callback for language defined pcodeop (call other).void
Register default callback for language defined pcodeops (call other).boolean
run
(Address addr, ProcessorContext context, TaskMonitor monitor) Start execution at the specified address using the initial context specified.boolean
run
(TaskMonitor monitor) Continue execution from the current execution address.void
setBreakpoint
(Address addr) Establish breakpointvoid
setContextRegister
(Register ctxReg, BigInteger value) Set current context register value.void
setContextRegister
(RegisterValue ctxRegValue) Set current context register value.void
setMemoryFaultHandler
(MemoryFaultHandler handler) Provides ability to install a low-level memory fault handler.boolean
step
(TaskMonitor monitor) Step execution one instruction which may consist of multiple pcode operations.boolean
uninitializedRead
(Address address, int size, byte[] buf, int bufOffset) An attempt has been made to read uninitialized memory at the specified address.boolean
unknownAddress
(Address address, boolean write) Unable to translate the specified addressvoid
unregisterCallOtherCallback
(String pcodeOpName) Unregister callback for language defined pcodeop (call other).void
Unregister default callback for language defined pcodeops (call other).void
writeMemory
(Address addr, byte[] bytes) void
writeMemoryValue
(Address addr, int size, long value) void
writeRegister
(Register reg, long value) void
writeRegister
(Register reg, BigInteger value) void
writeRegister
(String regName, long value) void
writeRegister
(String regName, BigInteger value) void
writeStackValue
(int relativeOffset, int size, long value) Write a value onto the stackvoid
writeStackValue
(int relativeOffset, int size, BigInteger value) Write a value onto the stackMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface ghidra.app.emulator.EmulatorConfiguration
getPreferredMemoryPageSize, getProgramCounterName, isWriteBackEnabled
-
Constructor Details
-
EmulatorHelper
-
-
Method Details
-
newEmulator
-
dispose
public void dispose() -
getMemoryFaultHandler
- Specified by:
getMemoryFaultHandler
in interfaceEmulatorConfiguration
-
getLoadData
- Specified by:
getLoadData
in interfaceEmulatorConfiguration
-
getLanguage
- Specified by:
getLanguage
in interfaceEmulatorConfiguration
-
getProgram
-
getPCRegister
Get Program Counter (PC) register defined by applicable processor specification- Returns:
- Program Counter register
-
getStackPointerRegister
Get Stack Pointer register defined by applicable compiler specification- Returns:
- Stack Pointer register
-
setMemoryFaultHandler
Provides ability to install a low-level memory fault handler. The handler methods should generally return 'false' to allow the default handler to generate the appropriate target error. Within the fault handler, the EmulateExecutionState can be used to distinguish the pcode-emit state and the actual execution state since an attempt to execute an instruction at an uninitialized memory location will cause an uninitializedRead during the PCODE_EMIT state.- Parameters:
handler
- memory fault handler.
-
getEmulateExecutionState
- Returns:
- the low-level emulator execution state
-
readRegister
-
readRegister
-
writeRegister
-
writeRegister
-
writeRegister
-
writeRegister
-
readNullTerminatedString
Read string from memory state.- Parameters:
addr
- memory addressmaxLength
- limit string read to this length. If return string is truncated, "..." will be appended.- Returns:
- string read from memory state
-
readMemoryByte
-
readMemory
-
writeMemory
-
writeMemoryValue
-
readStackValue
Read a stack value from the memory state.- Parameters:
relativeOffset
- offset relative to current stack pointersize
- data size in bytessigned
- true if value read is signed, false if unsigned- Returns:
- value
- Throws:
Exception
- error occurs reading stack pointer
-
writeStackValue
Write a value onto the stack- Parameters:
relativeOffset
- offset relative to current stack pointersize
- data size in bytesvalue
-- Throws:
Exception
- error occurs reading stack pointer
-
writeStackValue
Write a value onto the stack- Parameters:
relativeOffset
- offset relative to current stack pointersize
- data size in bytesvalue
-- Throws:
Exception
- error occurs reading stack pointer
-
setBreakpoint
Establish breakpoint- Parameters:
addr
- memory address for new breakpoint
-
clearBreakpoint
Clear breakpoint- Parameters:
addr
- memory address for breakpoint to be cleared
-
setContextRegister
Set current context register value. Keep in mind that any non-flowing context values will be stripped.- Parameters:
ctxRegValue
-
-
setContextRegister
Set current context register value. Keep in mind that any non-flowing context values will be stripped.- Parameters:
ctxReg
- context registervalue
- context value
-
getContextRegister
Get the current context register value- Returns:
- context register value or null if not set or unknown
-
registerCallOtherCallback
Register callback for language defined pcodeop (call other). WARNING! Using this method may circumvent the default CALLOTHER emulation support when supplied by the Processor module.- Parameters:
pcodeOpName
- the name of the pcode opcallback
- the callback to register
-
registerDefaultCallOtherCallback
Register default callback for language defined pcodeops (call other). WARNING! Using this method may circumvent the default CALLOTHER emulation support when supplied by the Processor module.- Parameters:
callback
- the default callback to register
-
unregisterCallOtherCallback
Unregister callback for language defined pcodeop (call other).- Parameters:
pcodeOpName
- the name of the pcode op
-
unregisterDefaultCallOtherCallback
public void unregisterDefaultCallOtherCallback()Unregister default callback for language defined pcodeops (call other). WARNING! Using this method may circumvent the default CALLOTHER emulation support when supplied by the Processor module. -
getExecutionAddress
Get current execution address- Returns:
- current execution address
-
run
public boolean run(Address addr, ProcessorContext context, TaskMonitor monitor) throws CancelledException Start execution at the specified address using the initial context specified. Method will block until execution stops. This method will initialize context register based upon the program stored context if not already done. In addition, both general register value and the context register may be further modified via the context parameter if specified.- Parameters:
addr
- initial program addresscontext
- optional context settings which override current program contextmonitor
-- Returns:
- true if execution completes without error (i.e., is at breakpoint)
- Throws:
CancelledException
- if execution cancelled via monitor
-
run
Continue execution from the current execution address. No adjustment will be made to the context beyond the normal context flow behavior defined by the language. Method will block until execution stops.- Parameters:
monitor
-- Returns:
- true if execution completes without error (i.e., is at breakpoint)
- Throws:
CancelledException
- if execution cancelled via monitor
-
getLastError
- Returns:
- last error message associated with execution failure
-
step
Step execution one instruction which may consist of multiple pcode operations. No adjustment will be made to the context beyond the normal context flow behavior defined by the language. Method will block until execution stops.- Returns:
- true if execution completes without error
- Throws:
CancelledException
- if execution cancelled via monitor
-
createMemoryBlockFromMemoryState
public MemoryBlock createMemoryBlockFromMemoryState(String name, Address start, int length, boolean overlay, TaskMonitor monitor) throws MemoryConflictException, AddressOverflowException, CancelledException, LockException, DuplicateNameException Create a new initialized memory block using the current emulator memory state- Parameters:
name
- block namestart
- start address of the blocklength
- the size of the blockoverlay
- if true, the block will be created as an OVERLAY which means that a new overlay address space will be created and the block will have a starting address at the same offset as the given start address parameter, but in the new address space.monitor
-- Returns:
- new memory block
- Throws:
LockException
- if exclusive lock not in place (see haveLock())MemoryConflictException
- if the new block overlaps with a previous blockAddressOverflowException
- if the start is beyond the address spaceCancelledException
- user cancelled operationDuplicateNameException
-
enableMemoryWriteTracking
public void enableMemoryWriteTracking(boolean enable) Enable/Disable tracking of memory writes in the form of an address set.- Parameters:
enable
-
-
getTrackedMemoryWriteSet
- Returns:
- address set of memory locations written by the emulator if memory write tracking is enabled, otherwise null is returned. The address set returned will continue to be updated unless memory write tracking becomes disabled.
-
unknownAddress
Description copied from interface:MemoryFaultHandler
Unable to translate the specified address- Specified by:
unknownAddress
in interfaceMemoryFaultHandler
- Parameters:
address
- address which failed to be translatedwrite
- true if memory operation was a write vs. read- Returns:
- true if fault was handled
-
uninitializedRead
Description copied from interface:MemoryFaultHandler
An attempt has been made to read uninitialized memory at the specified address.- Specified by:
uninitializedRead
in interfaceMemoryFaultHandler
- Parameters:
address
- uninitialized storage address (memory, register or unique)size
- number of uninitialized bytesbuf
- storage bufferbufOffset
- read offset within buffer- Returns:
- true if data should be treated as initialized
-
getEmulator
-