On Wed, Sep 21, 2022 at 2:19 PM David Matlack dmatlack@google.com wrote:
On Thu, Sep 15, 2022 at 12:04:44AM +0000, Vishal Annapurve wrote:
Cache the vendor CPU type in a global variable so that multiple calls to is_intel_cpu() do not need to re-execute CPUID.
Add cpu vendor check in kvm_hypercall() so that it executes correct vmcall/vmmcall instruction when running on Intel/AMD hosts. This avoids exit to KVM which anyway tries to patch the instruction according to the cpu type.
The commit shortlog makes no mention (nor even implies) that this commit adds AMD support to kvm_hypercall(). Please break this commit up into 2. One to precompute the result of is_{intel,amd}_cpu() and one to add AMD support to kvm_hypercall().
If you really want to keep this as one commit (I don't know what the benefit would be), please change the shortlog and commit message to focus on the kvm_hypercall() change, as that is the real goal of this commit. The precomputation is arguably and implementation detail. e.g.
is_amd_cpu is used by guest code within fix_hypercall_test.c, just caching the result will break the guest code execution. I have clubbed these two changes together in order to ensure that is_amd_cpu works fine for both host userspace and guest vm logic.
KVM: selftest: Add support for AMD to kvm_hypercall()
Make it possible to use kvm_hypercall() on AMD by checking if running on an AMD CPU and, if so, using vmmcall instead of vmcall. In order to avoid executing CPUID in the guest on every call t kvm_hypercall() (which would be slow), pre-compute the result of is_{intel,amd}_cpu() as part of kvm_selftest_arch_init() and sync it into the guest after loading the ELF image.
But again, it'd be cleaner just to split it up. Caching the result of is_{intel,amd}_cpu() is useful in its own right, independent of the kvm_hypercall() change.
...
@@ -1314,8 +1321,10 @@ bool vm_is_unrestricted_guest(struct kvm_vm *vm)
void kvm_selftest_arch_init(void) {
is_cpu_amd = cpu_vendor_string_is("AuthenticAMD");
}
void kvm_arch_post_vm_elf_load(struct kvm_vm *vm) {
sync_global_to_guest(vm, is_cpu_amd);
}
2.37.2.789.g6183377224-goog