Skip to content

Commit ac6c85e

Browse files
committed
KVM: selftests: riscv: Improve unexpected guest trap handling
Currently, we simply hang using "while (1) ;" upon any unexpected guest traps because the default guest trap handler is guest_hang(). The above approach is not useful to anyone because KVM selftests users will only see a hung application upon any unexpected guest trap. This patch improves unexpected guest trap handling for KVM RISC-V selftests by doing the following: 1) Return to host user-space 2) Dump VCPU registers 3) Die using TEST_ASSERT(0, ...) Signed-off-by: Anup Patel <apatel@ventanamicro.com> Tested-by: Mayuresh Chitale <mchitale@ventanamicro.com> Signed-off-by: Anup Patel <anup@brainfault.org>
1 parent 42226c9 commit ac6c85e

3 files changed

Lines changed: 31 additions & 17 deletions

File tree

tools/testing/selftests/kvm/include/riscv/processor.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,12 @@ static inline void set_reg(struct kvm_vm *vm, uint32_t vcpuid, uint64_t id,
119119
#define SATP_ASID_SHIFT 44
120120
#define SATP_ASID_MASK _AC(0xFFFF, UL)
121121

122-
#define SBI_EXT_EXPERIMENTAL_START 0x08000000
123-
#define SBI_EXT_EXPERIMENTAL_END 0x08FFFFFF
122+
#define SBI_EXT_EXPERIMENTAL_START 0x08000000
123+
#define SBI_EXT_EXPERIMENTAL_END 0x08FFFFFF
124124

125-
#define KVM_RISCV_SELFTESTS_SBI_EXT SBI_EXT_EXPERIMENTAL_END
125+
#define KVM_RISCV_SELFTESTS_SBI_EXT SBI_EXT_EXPERIMENTAL_END
126+
#define KVM_RISCV_SELFTESTS_SBI_UCALL 0
127+
#define KVM_RISCV_SELFTESTS_SBI_UNEXP 1
126128

127129
struct sbiret {
128130
long error;

tools/testing/selftests/kvm/lib/riscv/processor.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,11 @@ void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
268268
core.regs.t3, core.regs.t4, core.regs.t5, core.regs.t6);
269269
}
270270

271-
static void __aligned(16) guest_hang(void)
271+
static void __aligned(16) guest_unexp_trap(void)
272272
{
273-
while (1)
274-
;
273+
sbi_ecall(KVM_RISCV_SELFTESTS_SBI_EXT,
274+
KVM_RISCV_SELFTESTS_SBI_UNEXP,
275+
0, 0, 0, 0, 0, 0);
275276
}
276277

277278
void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
@@ -310,7 +311,7 @@ void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
310311

311312
/* Setup default exception vector of guest */
312313
set_reg(vm, vcpuid, RISCV_CSR_REG(stvec),
313-
(unsigned long)guest_hang);
314+
(unsigned long)guest_unexp_trap);
314315
}
315316

316317
void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)

tools/testing/selftests/kvm/lib/riscv/ucall.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ void ucall(uint64_t cmd, int nargs, ...)
6060
uc.args[i] = va_arg(va, uint64_t);
6161
va_end(va);
6262

63-
sbi_ecall(KVM_RISCV_SELFTESTS_SBI_EXT, 0, (vm_vaddr_t)&uc,
64-
0, 0, 0, 0, 0);
63+
sbi_ecall(KVM_RISCV_SELFTESTS_SBI_EXT,
64+
KVM_RISCV_SELFTESTS_SBI_UCALL,
65+
(vm_vaddr_t)&uc, 0, 0, 0, 0, 0);
6566
}
6667

6768
uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)
@@ -73,14 +74,24 @@ uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)
7374
memset(uc, 0, sizeof(*uc));
7475

7576
if (run->exit_reason == KVM_EXIT_RISCV_SBI &&
76-
run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT &&
77-
run->riscv_sbi.function_id == 0) {
78-
memcpy(&ucall, addr_gva2hva(vm, run->riscv_sbi.args[0]),
79-
sizeof(ucall));
80-
81-
vcpu_run_complete_io(vm, vcpu_id);
82-
if (uc)
83-
memcpy(uc, &ucall, sizeof(ucall));
77+
run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT) {
78+
switch (run->riscv_sbi.function_id) {
79+
case KVM_RISCV_SELFTESTS_SBI_UCALL:
80+
memcpy(&ucall, addr_gva2hva(vm,
81+
run->riscv_sbi.args[0]), sizeof(ucall));
82+
83+
vcpu_run_complete_io(vm, vcpu_id);
84+
if (uc)
85+
memcpy(uc, &ucall, sizeof(ucall));
86+
87+
break;
88+
case KVM_RISCV_SELFTESTS_SBI_UNEXP:
89+
vcpu_dump(stderr, vm, vcpu_id, 2);
90+
TEST_ASSERT(0, "Unexpected trap taken by guest");
91+
break;
92+
default:
93+
break;
94+
}
8495
}
8596

8697
return ucall.cmd;

0 commit comments

Comments
 (0)