Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use instruction-based emulation for debug mode #530

Merged
merged 1 commit into from
Dec 28, 2024

Conversation

RinHizakura
Copy link
Collaborator

In debug mode(gdbstub), we'll need one instruction/cycle per step for trace. For such usecase, using the block-based emulation will be too expensive which slow down the execution. Switch to instruction-based emulation for debug mode.

@jserv jserv added this to the release-2025.1 milestone Dec 27, 2024
Copy link
Contributor

@jserv jserv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmarks

Benchmark suite Current: ecb20c8 Previous: 158597a Ratio
Dhrystone 1346 Average DMIPS over 10 runs 1329 Average DMIPS over 10 runs 0.99
Coremark 950.448 Average iterations/sec over 10 runs 973.118 Average iterations/sec over 10 runs 1.02

This comment was automatically generated by workflow using github-action-benchmark.

@RinHizakura RinHizakura force-pushed the debug-mode-optimize branch 4 times, most recently from 5e07634 to 158597a Compare December 27, 2024 06:58
src/emulate.c Outdated
static void rv_check_interrupt(riscv_t *rv)
{
vm_attr_t *attr = PRIV(rv);
/* check for any interrupt after every block/instruction emulation */
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this comment to the beginning of the while loop in the rv_step since rv_step_debug call it step by step.

assert(arg);
riscv_t *rv = arg;

rv_check_interrupt(rv);
Copy link
Collaborator

@ChinYikMing ChinYikMing Dec 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about modify here like following?

#if RV32_HAS(SYSTEM) && !RV32_HAS(ELF_LOADER)
    rv_check_interrupt(rv);
#endif

In this way, the dummy rv_check_interrupt can be removed.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The debug mode of system simulation is not supported yet. Should we remove this statement to avoid ambiguity?

Copy link
Collaborator Author

@RinHizakura RinHizakura Dec 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does "debug mode of system simulation is not supported" mean here? The debug/gdbstub mode should be supported naturally because there's no big difference between program or system emulation. I already checked that we could read/write the register, set the breakpoint and step instructions on system emulation.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would rv32emu support debugging with booting Linux Kernel now? I failed to run file build/linux-image/Image in riscv32-unknown-elf-gdb to launch the remote GDB since it is not the RISC-V executable.

Copy link
Collaborator Author

@RinHizakura RinHizakura Dec 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Please use the vmlinux file, Image is not the right one. By the way, you can skip the step to link GDB to an ELF file if you don't need any debug symbol(i.e. just run target remote :1234 and start debugging).

Copy link
Collaborator Author

@RinHizakura RinHizakura Dec 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can check like this

  1. Open a bash shell and run ./build/rv32emu -k build/linux-image/Image -i build/linux-image/rootfs.cpio -b build/minimal.dtb -g
  2. Open another shell and run riscv32-unknown-elf-gdb -ex "target remote :1234" -ex "cont"
  3. You can see the emulator start executing in the first shell

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, it works. Thank you to point it out. Can you also update the document for this? (maybe in another PR)

In debug mode(gdbstub), we'll need one instruction/cycle per step
for trace. For such usecase, using the block-based emulation will
be too expensive which slow down the execution. Switch to
instruction-based emulation for debug mode.
Copy link
Collaborator

@vacantron vacantron left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@jserv jserv merged commit d8bf69a into sysprog21:master Dec 28, 2024
8 checks passed
@jserv
Copy link
Contributor

jserv commented Dec 28, 2024

Thank @RinHizakura for contributing!

vestata pushed a commit to vestata/rv32emu that referenced this pull request Jan 24, 2025
Use instruction-based emulation for debug mode
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants