mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 16:01:44 -04:00
Move the majority of the code related to disabling hardware virtualization in emergency from KVM into the virt subsystem so that virt can take full ownership of the state of SVM/VMX. This will allow refcounting usage of SVM/VMX so that KVM and the TDX subsystem can enable VMX without stomping on each other. To route the emergency callback to the "right" vendor code, add to avoid mixing vendor and generic code, implement a x86_virt_ops structure to track the emergency callback, along with the SVM vs. VMX (vs. "none") feature that is active. To avoid having to choose between SVM and VMX, simply refuse to enable either if both are somehow supported. No known CPU supports both SVM and VMX, and it's comically unlikely such a CPU will ever exist. Leave KVM's clearing of loaded VMCSes and MSR_VM_HSAVE_PA in KVM, via a callback explicitly scoped to KVM. Loading VMCSes and saving/restoring host state are firmly tied to running VMs, and thus are (a) KVM's responsibility and (b) operations that are still exclusively reserved for KVM (as far as in-tree code is concerned). I.e. the contract being established is that non-KVM subsystems can utilize virtualization, but for all intents and purposes cannot act as full-blown hypervisors. Reviewed-by: Chao Gao <chao.gao@intel.com> Tested-by: Chao Gao <chao.gao@intel.com> Reviewed-by: Dan Williams <dan.j.williams@intel.com> Tested-by: Sagi Shahar <sagis@google.com> Link: https://patch.msgid.link/20260214012702.2368778-9-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
33 lines
850 B
C
33 lines
850 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_X86_REBOOT_H
|
|
#define _ASM_X86_REBOOT_H
|
|
|
|
#include <linux/kdebug.h>
|
|
|
|
struct pt_regs;
|
|
|
|
struct machine_ops {
|
|
void (*restart)(char *cmd);
|
|
void (*halt)(void);
|
|
void (*power_off)(void);
|
|
void (*shutdown)(void);
|
|
void (*crash_shutdown)(struct pt_regs *);
|
|
void (*emergency_restart)(void);
|
|
};
|
|
|
|
extern struct machine_ops machine_ops;
|
|
extern int crashing_cpu;
|
|
|
|
void native_machine_crash_shutdown(struct pt_regs *regs);
|
|
void native_machine_shutdown(void);
|
|
void __noreturn machine_real_restart(unsigned int type);
|
|
/* These must match dispatch in arch/x86/realmore/rm/reboot.S */
|
|
#define MRR_BIOS 0
|
|
#define MRR_APM 1
|
|
|
|
typedef void (*nmi_shootdown_cb)(int, struct pt_regs*);
|
|
void nmi_shootdown_cpus(nmi_shootdown_cb callback);
|
|
void run_crash_ipi_callback(struct pt_regs *regs);
|
|
|
|
#endif /* _ASM_X86_REBOOT_H */
|