mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 18:36:00 +00:00
9f2febf3f0
Restoration of the host IA32_SPEC_CTRL value is probably too late with respect to the return thunk training sequence. With respect to the user/kernel boundary, AMD says, "If software chooses to toggle STIBP (e.g., set STIBP on kernel entry, and clear it on kernel exit), software should set STIBP to 1 before executing the return thunk training sequence." I assume the same requirements apply to the guest/host boundary. The return thunk training sequence is in vmenter.S, quite close to the VM-exit. On hosts without V_SPEC_CTRL, however, the host's IA32_SPEC_CTRL value is not restored until much later. To avoid this, move the restoration of host SPEC_CTRL to assembly and, for consistency, move the restoration of the guest SPEC_CTRL as well. This is not particularly difficult, apart from some care to cover both 32- and 64-bit, and to share code between SEV-ES and normal vmentry. Cc: stable@vger.kernel.org Fixes: a149180fbcf3 ("x86: Add magic AMD return-thunk") Suggested-by: Jim Mattson <jmattson@google.com> Reviewed-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
30 lines
778 B
C
30 lines
778 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Generate definitions needed by assembly language modules.
|
|
* This code generates raw asm output which is post-processed to extract
|
|
* and format the required data.
|
|
*/
|
|
#define COMPILE_OFFSETS
|
|
|
|
#include <linux/kbuild.h>
|
|
#include "vmx/vmx.h"
|
|
#include "svm/svm.h"
|
|
|
|
static void __used common(void)
|
|
{
|
|
if (IS_ENABLED(CONFIG_KVM_AMD)) {
|
|
BLANK();
|
|
OFFSET(SVM_vcpu_arch_regs, vcpu_svm, vcpu.arch.regs);
|
|
OFFSET(SVM_current_vmcb, vcpu_svm, current_vmcb);
|
|
OFFSET(SVM_spec_ctrl, vcpu_svm, spec_ctrl);
|
|
OFFSET(SVM_vmcb01, vcpu_svm, vmcb01);
|
|
OFFSET(KVM_VMCB_pa, kvm_vmcb_info, pa);
|
|
OFFSET(SD_save_area_pa, svm_cpu_data, save_area_pa);
|
|
}
|
|
|
|
if (IS_ENABLED(CONFIG_KVM_INTEL)) {
|
|
BLANK();
|
|
OFFSET(VMX_spec_ctrl, vcpu_vmx, spec_ctrl);
|
|
}
|
|
}
|