exec_trace
interface is implemented by processor models
that support tracing. A trace listener registers itself with the
register_tracer call. The tracer callback will be
called by the processor model
when each instruction is just about to be executed, passing the
tracer_data as passed to the register_tracer function
in addition to information about the instruction that is executed.
Invoke unregister_tracer with the same two pointers to deregister
the listener.
typedef void (*instruction_trace_callback_t)(lang_void *tracer_data, conf_object_t *cpu, linear_address_t la, logical_address_t va, physical_address_t pa, byte_string_t opcode);
The pa parameter to the callback will always be valid, but some CPU architectures may not support la or va. The la argument is typically only valid for x86 CPUs. Lastly, the opcode of the instruction is passed in opcode. The opcode is passed without endian conversion, meaning that byte X in opcode corresponds to the byte at pa + X.
SIM_INTERFACE(exec_trace) { void (*register_tracer)(conf_object_t *NOTNULL cpu_obj, instruction_trace_callback_t tracer, lang_void *tracer_data); void (*unregister_tracer)(conf_object_t *NOTNULL cpu_obj, instruction_trace_callback_t tracer, lang_void *tracer_data); }; #define EXEC_TRACE_INTERFACE "exec_trace"