Re: [PATCH] KVM: selftests: Add operand to vmsave/vmload/vmrun in svm.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/02/21 04:17, 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.

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>
---
  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");
  }


Queued, thanks.

Paolo




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux