Skip to content
16 changes: 16 additions & 0 deletions c_emulator/riscv_callbacks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,22 @@ void remove_callback(callbacks_if *cb)
callbacks.end());
}

// Invoke pre_step_callback on all registered callbacks before each step.
void call_pre_step_callbacks(bool is_waiting)
{
for (auto c : callbacks) {
c->pre_step_callback(is_waiting);
}
}

// Invoke post_step_callback on all registered callbacks after each step.
void call_post_step_callbacks(bool is_waiting)
{
for (auto c : callbacks) {
c->post_step_callback(is_waiting);
}
}

unit fetch_callback(sbits opcode)
{
for (auto c : callbacks) {
Expand Down
9 changes: 9 additions & 0 deletions c_emulator/riscv_callbacks_if.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@
class callbacks_if {
public:
virtual ~callbacks_if() = default;

// Callback invoked before each step
virtual void pre_step_callback([[maybe_unused]] bool is_waiting) { }

// Callback invoked after each step
virtual void post_step_callback([[maybe_unused]] bool is_waiting) { }

// TODO: finding ways to improve the format
virtual void fetch_callback([[maybe_unused]] sbits opcode) { }
virtual void mem_write_callback([[maybe_unused]] const char *type,
Expand Down Expand Up @@ -63,3 +70,5 @@ class callbacks_if {

void register_callback(callbacks_if *cb);
void remove_callback(callbacks_if *cb);
void call_pre_step_callbacks(bool is_waiting);
void call_post_step_callbacks(bool is_waiting);
8 changes: 7 additions & 1 deletion c_emulator/riscv_sim.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ void flush_logs(void)

void run_sail(void)
{
bool is_waiting;
bool is_waiting = false;
bool exit_wait = true;

/* initialize the step number */
Expand Down Expand Up @@ -414,6 +414,9 @@ void run_sail(void)
break;
}
}

call_pre_step_callbacks(is_waiting);

{ /* run a Sail step */
sail_int sail_step;
CREATE(sail_int)(&sail_step);
Expand All @@ -428,6 +431,9 @@ void run_sail(void)
rvfi->send_trace(config_print_rvfi);
}
}

call_post_step_callbacks(is_waiting);

if (!is_waiting) {
if (config_print_step) {
fprintf(trace_log, "\n");
Expand Down
Loading