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);
12 changes: 12 additions & 0 deletions c_emulator/riscv_callbacks_log.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,15 @@ void log_callbacks::vreg_write_callback(unsigned reg, lbits value)
print_lbits_hex(trace_log, value);
}
}

void log_callbacks::pre_step_callback(bool is_waiting)
{
// TODO: per-step logging or statistics
(void)is_waiting;
}

void log_callbacks::post_step_callback(bool is_waiting)
{
// TODO: post-step logging or statistics
(void)is_waiting;
}
2 changes: 2 additions & 0 deletions c_emulator/riscv_callbacks_log.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ class log_callbacks : public callbacks_if {
bool config_use_abi_names = false, FILE *trace_log = nullptr);

// callbacks_if
void pre_step_callback(bool is_waiting) override;
void post_step_callback(bool is_waiting) override;
void mem_write_callback(const char *type, sbits paddr, uint64_t width,
lbits value) override;
void mem_read_callback(const char *type, sbits paddr, uint64_t width,
Expand Down
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