Skip to content

QEMU crashes with failed assertion when executing compressed instructions with C extension support disabled

Host environment

  • QEMU flavor: qemu-system-riscv64
  • QEMU version: master
  • QEMU command line:
    ./qemu-system-riscv64 -m 128M -smp 1 -machine virt -cpu rv64,c=off -bios none -kernel <image>

Emulated/Virtualized environment

  • Architecture: riscv64

Description of problem

When executing compressed instructions with compressed instruction support disabled (c=off), the tcg riscv translations fails an assertion.

qemu-system-riscv64: qemu/accel/tcg/translate-all.c:1449: tb_gen_code: Assertion `tb->size != 0' failed.

I believe that the issue is caused due to the fact that the compressed instruction without RVC support branch of the decode_opc function does not update ctx->pc_succ_insn, which causes ctx->base.pc_next to not be updated in riscv_tr_translate_insn, which then finally triggers the assertion once the tcg generation returns to tb_gen_code.

Side note, it also seems like the gen_exception_illegal call in the same if case is not needed, since we also call it again at the end of the function.

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information