Message ID | 20241018084010.406285-1-cleger@rivosinc.com |
---|---|
Headers | show |
Series | lib: sbi: add Ssdbltrp and Smdbltrp ISA extensions | expand |
On Fri, Oct 18, 2024 at 2:22 PM Clément Léger <cleger@rivosinc.com> wrote: > > A double trap typically arises during a sensitive phase in trap handling > operations when an exception or interrupt occurs while the trap > handler (the component responsible for managing these events) is in a > non-reentrant state. This non-reentrancy usually occurs in the early > phase of trap handling, wherein the trap handler has not yet preserved > the necessary state to handle and resume from the trap. The occurrence > of such event is unlikely but can happen when dealing with hardware > errors. > > This series adds support for Ssdbltrp and Smdbltrp ratified ISA > extensions [1]. > > Ssdbltrp can be tested using qemu[2], opensbi[3], linux[4] and > kvm-unit-tests[5]. Assuming you have a riscv environment available and > configured (CROSS_COMPILE), it can be built for riscv64 using the > following instructions: > > Qemu: > $ git clone https://github.com/rivosinc/qemu.git > $ cd qemu > $ git switch -C dbltrp_v4 dev/cleger/dbltrp_v4 > $ mkdir build && cd build > $ ../configure --target-list=riscv64-softmmu > $ make > > OpenSBI: > $ git clone https://github.com/rivosinc/opensbi.git > $ cd opensbi > $ git switch -C dbltrp_v4 dev/cleger/dbltrp_v4 > $ make O=build PLATFORM_RISCV_XLEN=64 PLATFORM=generic > > Linux: > $ git clone https://github.com/rivosinc/linux.git > $ cd linux > $ git switch -C dbltrp_v1 dev/cleger/dbltrp_v1 > $ export ARCH=riscv > $ make O=build defconfig > $ ./script/config --file build/.config --enable RISCV_DBLTRP > $ make O=build > > kvm-unit-tests: > $ git clone https://github.com/clementleger/kvm-unit-tests.git > $ cd kvm-unit-tests > $ git switch -C dbltrp_v1 dev/cleger/dbltrp_v1 > $ ./configure --arch=riscv64 --cross-prefix=$CROSS_COMPILE > $ make > > You will also need kvmtool in your rootfs. > > Run with kvm-unit-test test as kernel: > $ qemu-system-riscv64 \ > -M virt \ > -cpu rv64,ssdbltrp=true,smdbltrp=true \ > -nographic \ > -serial mon:stdio \ > -bios opensbi/build/platform/generic/firmware/fw_jump.bin \ > -kernel kvm-unit-tests-dbltrp/riscv/sbi_dbltrp.flat > ... > [OpenSBI boot partially elided] > Boot HART ISA Extensions : sscofpmf,sstc,zicntr,zihpm,zicboz,zicbom,sdtrig,svadu,ssdbltrp > ... > ########################################################################## > # kvm-unit-tests > ########################################################################## > > PASS: sbi: fwft: FWFT extension probing no error > PASS: sbi: fwft: FWFT extension is present > PASS: sbi: fwft: dbltrp: Get double trap enable feature value > PASS: sbi: fwft: dbltrp: Set double trap enable feature value == 0 > PASS: sbi: fwft: dbltrp: Get double trap enable feature value == 0 > PASS: sbi: fwft: dbltrp: Double trap disabled, trap first time ok > PASS: sbi: fwft: dbltrp: Set double trap enable feature value == 1 > PASS: sbi: fwft: dbltrp: Get double trap enable feature value == 1 > PASS: sbi: fwft: dbltrp: Trapped twice allowed ok > INFO: sbi: fwft: dbltrp: Should generate a double trap and crash ! > > sbi_trap_error: hart0: trap0: double trap handler failed (error -10) > > sbi_trap_error: hart0: trap0: mcause=0x0000000000000010 mtval=0x0000000000000000 > sbi_trap_error: hart0: trap0: mtval2=0x0000000000000003 mtinst=0x0000000000000000 > sbi_trap_error: hart0: trap0: mepc=0x00000000802000d8 mstatus=0x8000000a01006900 > sbi_trap_error: hart0: trap0: ra=0x00000000802001fc sp=0x0000000080213e70 > sbi_trap_error: hart0: trap0: gp=0x0000000000000000 tp=0x0000000080088000 > sbi_trap_error: hart0: trap0: s0=0x0000000080213e80 s1=0x0000000000000001 > sbi_trap_error: hart0: trap0: a0=0x0000000080213e80 a1=0x0000000080208193 > sbi_trap_error: hart0: trap0: a2=0x000000008020dc20 a3=0x000000000000000f > sbi_trap_error: hart0: trap0: a4=0x0000000080210cd8 a5=0x00000000802110d0 > sbi_trap_error: hart0: trap0: a6=0x00000000802136e4 a7=0x0000000046574654 > sbi_trap_error: hart0: trap0: s2=0x0000000080210cd9 s3=0x0000000000000000 > sbi_trap_error: hart0: trap0: s4=0x0000000000000000 s5=0x0000000000000000 > sbi_trap_error: hart0: trap0: s6=0x0000000000000000 s7=0x0000000000000001 > sbi_trap_error: hart0: trap0: s8=0x0000000000002000 s9=0x0000000080083700 > sbi_trap_error: hart0: trap0: s10=0x0000000000000000 s11=0x0000000000000000 > sbi_trap_error: hart0: trap0: t0=0x0000000000000000 t1=0x0000000080213ed8 > sbi_trap_error: hart0: trap0: t2=0x0000000000001000 t3=0x0000000080213ee0 > sbi_trap_error: hart0: trap0: t4=0x0000000000000000 t5=0x000000008020f8d0 > sbi_trap_error: hart0: trap0: t6=0x0000000000000000 > > Run with linux and kvm-unit-test test in kvm (testing VS-mode): > $ qemu-system-riscv64 \ > -M virt \ > -cpu rv64,ssdbltrp=true,smdbltrp=true \ > -nographic \ > -serial mon:stdio \ > -bios opensbi/build/platform/generic/firmware/fw_jump.bin \ > -kernel linux/build/arch/riscv/boot/Image > ... > [Linux boot partially elided] > [ 0.735079] riscv-dbltrp: Double trap handling registered > ... > > $ lkvm run -k sbi_dbltrp.flat -m 128 -c 2 > ########################################################################## > # kvm-unit-tests > ########################################################################## > > PASS: sbi: fwft: FWFT extension probing no error > PASS: sbi: fwft: FWFT extension is present > PASS: sbi: fwft: dbltrp: Get double trap enable feature value > PASS: sbi: fwft: dbltrp: Set double trap enable feature value == 0 > PASS: sbi: fwft: dbltrp: Get double trap enable feature value == 0 > PASS: sbi: fwft: dbltrp: Double trap disabled, trap first time ok > PASS: sbi: fwft: dbltrp: Set double trap enable feature value == 1 > PASS: sbi: fwft: dbltrp: Get double trap enable feature value == 1 > PASS: sbi: fwft: dbltrp: Trapped twice allowed ok > INFO: sbi: fwft: dbltrp: Should generate a double trap and crash ! > [ 51.939077] Guest double trap > [ 51.939323] kvm [93]: VCPU exit error -95 > [ 51.939683] kvm [93]: SEPC=0x802000d8 SSTATUS=0x200004520 HSTATUS=0x200200180 > [ 51.939947] kvm [93]: SCAUSE=0x10 STVAL=0x0 HTVAL=0x3 HTINST=0x0 > KVM_RUN failed: Operation not supported > $ > > Testing Smbdbltrp can be done using gdb and trigger some trap. For > instance, interrupt M-mode firmware at some point, set mstatus.mdt = 1 > and corrupt some register to generate a NULL pointer exception. > > Link: https://github.com/riscv/riscv-isa-manual/commit/52a5742d5ab5a0792019033631b2035a493ad981 [1] > Link: https://github.com/rivosinc/qemu/tree/dev/cleger/dbltrp_v4 [2] > Link: https://github.com/rivosinc/opensbi/tree/dev/cleger/dbltrp_v4 [3] > Link: https://github.com/rivosinc/linux/tree/dev/cleger/dbltrp_v1 [4] > Link: https://github.com/clementleger/kvm-unit-tests/tree/dev/cleger/dbltrp_v1 [5] > > --- > V4: > - Rebased on master > - Move mstatusH restoration before mstatus since it contains MDT bit > - Factorize landing pad/shadow stack menvcfg usage in fwft > > V3: > - Added Samuel Reviewed-by and fix some minor comments > > V2: > - Add check for riscv_len inside CLEAR_MDT macro > - Order fwft entries by id order > - Move menvcfg generic access function to the top of sbi_fwft.c file > - Split SSE event support > - Add an additional MDT clear after MTVEC is set for all harts > > Clément Léger (7): > lib: sbi: factorize previous virtualization mode read from regs > lib: sbi: factorize previous mode computation > lib: sbi: add Ssdbltrp ISA extension support > lib: sbi: send a double trap SSE event to supervisor > lib: sbi: fwft: factorize menvcfg read/write > lib: sbi: implement firmware feature SBI_FWFT_DOUBLE_TRAP > lib: sbi: add Smdbltrp ISA extension support Applied this series to the riscv/opensbi repo. Thanks, Anup > > firmware/fw_base.S | 37 ++++++++-- > include/sbi/riscv_encoding.h | 18 +++-- > include/sbi/sbi_ecall_interface.h | 1 + > include/sbi/sbi_hart.h | 2 + > include/sbi/sbi_trap.h | 14 ++++ > include/sbi/sbi_trap_ldst.h | 2 + > lib/sbi/objects.mk | 1 + > lib/sbi/sbi_double_trap.c | 30 ++++++++ > lib/sbi/sbi_emulate_csr.c | 16 +--- > lib/sbi/sbi_fwft.c | 119 ++++++++++++++++-------------- > lib/sbi/sbi_hart.c | 4 + > lib/sbi/sbi_illegal_insn.c | 2 +- > lib/sbi/sbi_sse.c | 1 + > lib/sbi/sbi_system.c | 2 +- > lib/sbi/sbi_trap.c | 14 ++-- > lib/sbi/sbi_trap_ldst.c | 4 +- > 16 files changed, 180 insertions(+), 87 deletions(-) > create mode 100644 lib/sbi/sbi_double_trap.c > > -- > 2.45.2 > > > -- > opensbi mailing list > opensbi@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/opensbi