Renode TLib Workflow (Placeholder)

Commands here are subject to change.

Building

m springbok
m qemu_clean qemu
m renode_clean renode

Note: as we continually make changes to renode, will have to m renode_clean renode to apply updates:

m renode_clean renode

Running Qemu without debugging

qemu_sim_springbok ./out/springbok/test_vsetvl/test_vsetvl.elf

Running Qemu with debugging

qemu_sim_springbok ./out/springbok/test_vsetvl/test_vsetvl.elf -s -S

Running gdb for Qemu

Run gdb on the target elf

Note, same as for Renode but with target remote :1234

riscv32-unknown-elf-gdb out/springbok/test_vsetvl/test_vsetvl.elf \
  -ex "target remote :1234" \
  -ex "layout split" \
  -ex "b main" \
  -ex "c"

Running gdb for Renode

riscv32-unknown-elf-gdb out/springbok/test_vsetvl/test_vsetvl.elf \
  -ex "target remote :3333" \
  -ex "monitor start" \
  -ex "sysbus.cpu2 IsHalted False" \
  -ex "layout split" \
  -ex "b main" \
  -ex "c"

Setup .gdbinit file

Save the following to ${HOME}/.gdbinit:

set auto-load safe-path /
handle SIGXCPU SIG33 SIG35 SIG36 SIG37 SIG38 SIGPWR nostop noprint

define mono_backtrace
 select-frame 0
 set $i = 0
 while ($i < $arg0)
   set $foo = (char*) mono_pmip ($pc)
   if ($foo)
     printf "#%d %p in %s\n", $i, $pc, $foo
   else
     frame
   end
   up-silently
   set $i = $i + 1
 end
end

define mono_stack
 set $mono_thread = mono_thread_current ()
 if ($mono_thread == 0x00)
   printf "No mono thread associated with this thread\n"
 else
   set $ucp = malloc (sizeof (ucontext_t))
   call (void) getcontext ($ucp)
   call (void) mono_print_thread_dump ($ucp)
   call (void) free ($ucp)
 end
end

Running Renode

gdb -ex "set breakpoint pending on" \
  -ex "set pagination off" \
  -ex "b helper_vsetvl" \
  -ex "layout split" \
  -ex "r" \
  --args mono \
  --debug out/host/renode/Renode.exe  \
  -e "\$bin=@out/springbok/test_vsetvl/test_vsetvl.elf; i @sim/config/springbok.resc;" \
  --disable-xwt \
  --console