Skip to content

Commit b7326c0

Browse files
Ricardo KollerMarc Zyngier
authored andcommitted
KVM: selftests: Complete x86_64/sync_regs_test ucall
The guest in sync_regs_test does raw ucalls by directly accessing the ucall IO port. It makes these ucalls without setting %rdi to a `struct ucall`, which is what a ucall uses to pass messages. The issue is that if the host did a get_ucall (the receiver side), it would try to access the `struct ucall` at %rdi=0 which would lead to an error ("No mapping for vm virtual address, gva: 0x0"). This issue is currently benign as there is no get_ucall in sync_regs_test; however, that will change in the next commit as it changes the unhandled exception reporting mechanism to use ucalls. In that case, every vcpu_run is followed by a get_ucall to check if the guest is trying to report an unhandled exception. Fix this in advance by setting %rdi to a UCALL_NONE struct ucall for the sync_regs_test guest. Tested with gcc-[8,9,10], and clang-[9,11]. Signed-off-by: Ricardo Koller <ricarkol@google.com> Reviewed-by: Andrew Jones <drjones@redhat.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20210611011020.3420067-3-ricarkol@google.com
1 parent b78f4a5 commit b7326c0

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

tools/testing/selftests/kvm/x86_64/sync_regs_test.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424

2525
#define UCALL_PIO_PORT ((uint16_t)0x1000)
2626

27+
struct ucall uc_none = {
28+
.cmd = UCALL_NONE,
29+
};
30+
2731
/*
2832
* ucall is embedded here to protect against compiler reshuffling registers
2933
* before calling a function. In this test we only need to get KVM_EXIT_IO
@@ -34,7 +38,8 @@ void guest_code(void)
3438
asm volatile("1: in %[port], %%al\n"
3539
"add $0x1, %%rbx\n"
3640
"jmp 1b"
37-
: : [port] "d" (UCALL_PIO_PORT) : "rax", "rbx");
41+
: : [port] "d" (UCALL_PIO_PORT), "D" (&uc_none)
42+
: "rax", "rbx");
3843
}
3944

4045
static void compare_regs(struct kvm_regs *left, struct kvm_regs *right)

0 commit comments

Comments
 (0)