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
This commit is contained in:
Родитель
b78f4a5966
Коммит
b7326c0112
|
@ -24,6 +24,10 @@
|
|||
|
||||
#define UCALL_PIO_PORT ((uint16_t)0x1000)
|
||||
|
||||
struct ucall uc_none = {
|
||||
.cmd = UCALL_NONE,
|
||||
};
|
||||
|
||||
/*
|
||||
* ucall is embedded here to protect against compiler reshuffling registers
|
||||
* before calling a function. In this test we only need to get KVM_EXIT_IO
|
||||
|
@ -34,7 +38,8 @@ void guest_code(void)
|
|||
asm volatile("1: in %[port], %%al\n"
|
||||
"add $0x1, %%rbx\n"
|
||||
"jmp 1b"
|
||||
: : [port] "d" (UCALL_PIO_PORT) : "rax", "rbx");
|
||||
: : [port] "d" (UCALL_PIO_PORT), "D" (&uc_none)
|
||||
: "rax", "rbx");
|
||||
}
|
||||
|
||||
static void compare_regs(struct kvm_regs *left, struct kvm_regs *right)
|
||||
|
|
Загрузка…
Ссылка в новой задаче