KVM: selftests: Add operand to vmsave/vmload/vmrun in svm.c
[ Upstream commit 47bc726fe8d1910872dc3d7e7ec70f8b9e6043b7 ] Building the KVM selftests with LLVM's integrated assembler fails with: $ CFLAGS=-fintegrated-as make -C tools/testing/selftests/kvm CC=clang lib/x86_64/svm.c:77:16: error: too few operands for instruction asm volatile ("vmsave\n\t" : : "a" (vmcb_gpa) : "memory"); ^ <inline asm>:1:2: note: instantiated into assembly here vmsave ^ lib/x86_64/svm.c:134:3: error: too few operands for instruction "vmload\n\t" ^ <inline asm>:1:2: note: instantiated into assembly here vmload ^ This is because LLVM IAS does not currently support calling vmsave, vmload, or vmload without an explicit %rax operand. Add an explicit operand to vmsave, vmload, and vmrum in svm.c. Fixing this was suggested by Sean Christopherson. Tested: building without this error in clang 11. The following patch (not queued yet) needs to be applied to solve the other remaining error: "selftests: kvm: remove reassignment of non-absolute variables". Suggested-by: Sean Christopherson <seanjc@google.com> Link: https://lore.kernel.org/kvm/X+Df2oQczVBmwEzi@google.com/ Reviewed-by: Jim Mattson <jmattson@google.com> Signed-off-by: Ricardo Koller <ricarkol@google.com> Message-Id: <20210210031719.769837-1-ricarkol@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
d337537181
commit
293fa72d62
@ -74,7 +74,7 @@ void generic_svm_setup(struct svm_test_data *svm, void *guest_rip, void *guest_r
|
||||
wrmsr(MSR_VM_HSAVE_PA, svm->save_area_gpa);
|
||||
|
||||
memset(vmcb, 0, sizeof(*vmcb));
|
||||
asm volatile ("vmsave\n\t" : : "a" (vmcb_gpa) : "memory");
|
||||
asm volatile ("vmsave %0\n\t" : : "a" (vmcb_gpa) : "memory");
|
||||
vmcb_set_seg(&save->es, get_es(), 0, -1U, data_seg_attr);
|
||||
vmcb_set_seg(&save->cs, get_cs(), 0, -1U, code_seg_attr);
|
||||
vmcb_set_seg(&save->ss, get_ss(), 0, -1U, data_seg_attr);
|
||||
@ -131,19 +131,19 @@ void generic_svm_setup(struct svm_test_data *svm, void *guest_rip, void *guest_r
|
||||
void run_guest(struct vmcb *vmcb, uint64_t vmcb_gpa)
|
||||
{
|
||||
asm volatile (
|
||||
"vmload\n\t"
|
||||
"vmload %[vmcb_gpa]\n\t"
|
||||
"mov rflags, %%r15\n\t" // rflags
|
||||
"mov %%r15, 0x170(%[vmcb])\n\t"
|
||||
"mov guest_regs, %%r15\n\t" // rax
|
||||
"mov %%r15, 0x1f8(%[vmcb])\n\t"
|
||||
LOAD_GPR_C
|
||||
"vmrun\n\t"
|
||||
"vmrun %[vmcb_gpa]\n\t"
|
||||
SAVE_GPR_C
|
||||
"mov 0x170(%[vmcb]), %%r15\n\t" // rflags
|
||||
"mov %%r15, rflags\n\t"
|
||||
"mov 0x1f8(%[vmcb]), %%r15\n\t" // rax
|
||||
"mov %%r15, guest_regs\n\t"
|
||||
"vmsave\n\t"
|
||||
"vmsave %[vmcb_gpa]\n\t"
|
||||
: : [vmcb] "r" (vmcb), [vmcb_gpa] "a" (vmcb_gpa)
|
||||
: "r15", "memory");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user