-
Notifications
You must be signed in to change notification settings - Fork 107
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
Conversation
There was a problem hiding this 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.
5e07634
to
158597a
Compare
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 */ |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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).
There was a problem hiding this comment.
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
- Open a bash shell and run
./build/rv32emu -k build/linux-image/Image -i build/linux-image/rootfs.cpio -b build/minimal.dtb -g
- Open another shell and run
riscv32-unknown-elf-gdb -ex "target remote :1234" -ex "cont"
- You can see the emulator start executing in the first shell
There was a problem hiding this comment.
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.
158597a
to
ecb20c8
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Thank @RinHizakura for contributing! |
Use instruction-based emulation for debug mode
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.