Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: selftests: Add operand to vmsave/vmload/vmrun in svm.c

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>

authored by

Ricardo Koller and committed by
Paolo Bonzini
47bc726f 2e215216

+4 -4
+4 -4
tools/testing/selftests/kvm/lib/x86_64/svm.c
··· 74 74 wrmsr(MSR_VM_HSAVE_PA, svm->save_area_gpa); 75 75 76 76 memset(vmcb, 0, sizeof(*vmcb)); 77 - asm volatile ("vmsave\n\t" : : "a" (vmcb_gpa) : "memory"); 77 + asm volatile ("vmsave %0\n\t" : : "a" (vmcb_gpa) : "memory"); 78 78 vmcb_set_seg(&save->es, get_es(), 0, -1U, data_seg_attr); 79 79 vmcb_set_seg(&save->cs, get_cs(), 0, -1U, code_seg_attr); 80 80 vmcb_set_seg(&save->ss, get_ss(), 0, -1U, data_seg_attr); ··· 131 131 void run_guest(struct vmcb *vmcb, uint64_t vmcb_gpa) 132 132 { 133 133 asm volatile ( 134 - "vmload\n\t" 134 + "vmload %[vmcb_gpa]\n\t" 135 135 "mov rflags, %%r15\n\t" // rflags 136 136 "mov %%r15, 0x170(%[vmcb])\n\t" 137 137 "mov guest_regs, %%r15\n\t" // rax 138 138 "mov %%r15, 0x1f8(%[vmcb])\n\t" 139 139 LOAD_GPR_C 140 - "vmrun\n\t" 140 + "vmrun %[vmcb_gpa]\n\t" 141 141 SAVE_GPR_C 142 142 "mov 0x170(%[vmcb]), %%r15\n\t" // rflags 143 143 "mov %%r15, rflags\n\t" 144 144 "mov 0x1f8(%[vmcb]), %%r15\n\t" // rax 145 145 "mov %%r15, guest_regs\n\t" 146 - "vmsave\n\t" 146 + "vmsave %[vmcb_gpa]\n\t" 147 147 : : [vmcb] "r" (vmcb), [vmcb_gpa] "a" (vmcb_gpa) 148 148 : "r15", "memory"); 149 149 }