mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08: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: a149180fbc
("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);
|
|
}
|
|
}
|