On Wed, Feb 10, 2021 at 03:17:19AM +0000, Ricardo Koller wrote: > 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. It is worth noting that this has been fixed in LLVM already, available in 12.0.0-rc1 (final should be out in about a month or so as far as I am aware): http://github.com/llvm/llvm-project/commit/f47b07315a3c308a214119244b216602c537a1b2 > 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@xxxxxxxxxx> > Link: https://lore.kernel.org/kvm/X+Df2oQczVBmwEzi@xxxxxxxxxx/ > Reviewed-by: Jim Mattson <jmattson@xxxxxxxxxx> > Signed-off-by: Ricardo Koller <ricarkol@xxxxxxxxxx> Yes, same fix as commit f65cf84ee769 ("KVM: SVM: Add register operand to vmsave call in sev_es_vcpu_load"). Reviewed-by: Nathan Chancellor <nathan@xxxxxxxxxx> > --- > tools/testing/selftests/kvm/lib/x86_64/svm.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/tools/testing/selftests/kvm/lib/x86_64/svm.c b/tools/testing/selftests/kvm/lib/x86_64/svm.c > index 3a5c72ed2b79..827fe6028dd4 100644 > --- a/tools/testing/selftests/kvm/lib/x86_64/svm.c > +++ b/tools/testing/selftests/kvm/lib/x86_64/svm.c > @@ -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"); > } > -- > 2.30.0.478.g8a0d178c01-goog >