Commit 0d7bf5e5 authored by Paolo Bonzini's avatar Paolo Bonzini

KVM: SVM: Compile sev.c if and only if CONFIG_KVM_AMD_SEV=y

Stop compiling sev.c when CONFIG_KVM_AMD_SEV=n, as the number of #ifdefs
in sev.c is getting ridiculous, and having #ifdefs inside of SEV helpers
is quite confusing.

To minimize #ifdefs in code flows, #ifdef away only the kvm_x86_ops hooks
and the #VMGEXIT handler. Stubs are also restricted to functions that
check sev_enabled and to the destruction functions sev_free_cpu() and
sev_vm_destroy(), where the style of their callers is to leave checks
to the callers.  Most call sites instead rely on dead code elimination
to take care of functions that are guarded with sev_guest() or
sev_es_guest().
Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Co-developed-by: default avatarSean Christopherson <seanjc@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Message-ID: <20240404121327.3107131-3-pbonzini@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 1ff3c890
...@@ -26,8 +26,9 @@ kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o \ ...@@ -26,8 +26,9 @@ kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o \
kvm-intel-$(CONFIG_X86_SGX_KVM) += vmx/sgx.o kvm-intel-$(CONFIG_X86_SGX_KVM) += vmx/sgx.o
kvm-intel-$(CONFIG_KVM_HYPERV) += vmx/hyperv.o vmx/hyperv_evmcs.o kvm-intel-$(CONFIG_KVM_HYPERV) += vmx/hyperv.o vmx/hyperv_evmcs.o
kvm-amd-y += svm/svm.o svm/vmenter.o svm/pmu.o svm/nested.o svm/avic.o \ kvm-amd-y += svm/svm.o svm/vmenter.o svm/pmu.o svm/nested.o svm/avic.o
svm/sev.o
kvm-amd-$(CONFIG_KVM_AMD_SEV) += svm/sev.o
kvm-amd-$(CONFIG_KVM_HYPERV) += svm/hyperv.o kvm-amd-$(CONFIG_KVM_HYPERV) += svm/hyperv.o
ifdef CONFIG_HYPERV ifdef CONFIG_HYPERV
......
...@@ -32,22 +32,9 @@ ...@@ -32,22 +32,9 @@
#include "cpuid.h" #include "cpuid.h"
#include "trace.h" #include "trace.h"
#ifndef CONFIG_KVM_AMD_SEV #define GHCB_VERSION_MAX 1ULL
/* #define GHCB_VERSION_MIN 1ULL
* When this config is not defined, SEV feature is not supported and APIs in
* this file are not used but this file still gets compiled into the KVM AMD
* module.
*
* We will not have MISC_CG_RES_SEV and MISC_CG_RES_SEV_ES entries in the enum
* misc_res_type {} defined in linux/misc_cgroup.h.
*
* Below macros allow compilation to succeed.
*/
#define MISC_CG_RES_SEV MISC_CG_RES_TYPES
#define MISC_CG_RES_SEV_ES MISC_CG_RES_TYPES
#endif
#ifdef CONFIG_KVM_AMD_SEV
/* enable/disable SEV support */ /* enable/disable SEV support */
static bool sev_enabled = true; static bool sev_enabled = true;
module_param_named(sev, sev_enabled, bool, 0444); module_param_named(sev, sev_enabled, bool, 0444);
...@@ -59,11 +46,6 @@ module_param_named(sev_es, sev_es_enabled, bool, 0444); ...@@ -59,11 +46,6 @@ module_param_named(sev_es, sev_es_enabled, bool, 0444);
/* enable/disable SEV-ES DebugSwap support */ /* enable/disable SEV-ES DebugSwap support */
static bool sev_es_debug_swap_enabled = false; static bool sev_es_debug_swap_enabled = false;
module_param_named(debug_swap, sev_es_debug_swap_enabled, bool, 0444); module_param_named(debug_swap, sev_es_debug_swap_enabled, bool, 0444);
#else
#define sev_enabled false
#define sev_es_enabled false
#define sev_es_debug_swap_enabled false
#endif /* CONFIG_KVM_AMD_SEV */
static u8 sev_enc_bit; static u8 sev_enc_bit;
static DECLARE_RWSEM(sev_deactivate_lock); static DECLARE_RWSEM(sev_deactivate_lock);
...@@ -2194,7 +2176,6 @@ void __init sev_set_cpu_caps(void) ...@@ -2194,7 +2176,6 @@ void __init sev_set_cpu_caps(void)
void __init sev_hardware_setup(void) void __init sev_hardware_setup(void)
{ {
#ifdef CONFIG_KVM_AMD_SEV
unsigned int eax, ebx, ecx, edx, sev_asid_count, sev_es_asid_count; unsigned int eax, ebx, ecx, edx, sev_asid_count, sev_es_asid_count;
bool sev_es_supported = false; bool sev_es_supported = false;
bool sev_supported = false; bool sev_supported = false;
...@@ -2294,7 +2275,6 @@ void __init sev_hardware_setup(void) ...@@ -2294,7 +2275,6 @@ void __init sev_hardware_setup(void)
if (!sev_es_enabled || !cpu_feature_enabled(X86_FEATURE_DEBUG_SWAP) || if (!sev_es_enabled || !cpu_feature_enabled(X86_FEATURE_DEBUG_SWAP) ||
!cpu_feature_enabled(X86_FEATURE_NO_NESTED_DATA_BP)) !cpu_feature_enabled(X86_FEATURE_NO_NESTED_DATA_BP))
sev_es_debug_swap_enabled = false; sev_es_debug_swap_enabled = false;
#endif
} }
void sev_hardware_unsetup(void) void sev_hardware_unsetup(void)
......
...@@ -3303,7 +3303,9 @@ static int (*const svm_exit_handlers[])(struct kvm_vcpu *vcpu) = { ...@@ -3303,7 +3303,9 @@ static int (*const svm_exit_handlers[])(struct kvm_vcpu *vcpu) = {
[SVM_EXIT_RSM] = rsm_interception, [SVM_EXIT_RSM] = rsm_interception,
[SVM_EXIT_AVIC_INCOMPLETE_IPI] = avic_incomplete_ipi_interception, [SVM_EXIT_AVIC_INCOMPLETE_IPI] = avic_incomplete_ipi_interception,
[SVM_EXIT_AVIC_UNACCELERATED_ACCESS] = avic_unaccelerated_access_interception, [SVM_EXIT_AVIC_UNACCELERATED_ACCESS] = avic_unaccelerated_access_interception,
#ifdef CONFIG_KVM_AMD_SEV
[SVM_EXIT_VMGEXIT] = sev_handle_vmgexit, [SVM_EXIT_VMGEXIT] = sev_handle_vmgexit,
#endif
}; };
static void dump_vmcb(struct kvm_vcpu *vcpu) static void dump_vmcb(struct kvm_vcpu *vcpu)
...@@ -5023,6 +5025,7 @@ static struct kvm_x86_ops svm_x86_ops __initdata = { ...@@ -5023,6 +5025,7 @@ static struct kvm_x86_ops svm_x86_ops __initdata = {
.enable_smi_window = svm_enable_smi_window, .enable_smi_window = svm_enable_smi_window,
#endif #endif
#ifdef CONFIG_KVM_AMD_SEV
.mem_enc_ioctl = sev_mem_enc_ioctl, .mem_enc_ioctl = sev_mem_enc_ioctl,
.mem_enc_register_region = sev_mem_enc_register_region, .mem_enc_register_region = sev_mem_enc_register_region,
.mem_enc_unregister_region = sev_mem_enc_unregister_region, .mem_enc_unregister_region = sev_mem_enc_unregister_region,
...@@ -5030,7 +5033,7 @@ static struct kvm_x86_ops svm_x86_ops __initdata = { ...@@ -5030,7 +5033,7 @@ static struct kvm_x86_ops svm_x86_ops __initdata = {
.vm_copy_enc_context_from = sev_vm_copy_enc_context_from, .vm_copy_enc_context_from = sev_vm_copy_enc_context_from,
.vm_move_enc_context_from = sev_vm_move_enc_context_from, .vm_move_enc_context_from = sev_vm_move_enc_context_from,
#endif
.check_emulate_instruction = svm_check_emulate_instruction, .check_emulate_instruction = svm_check_emulate_instruction,
.apic_init_signal_blocked = svm_apic_init_signal_blocked, .apic_init_signal_blocked = svm_apic_init_signal_blocked,
......
...@@ -664,13 +664,16 @@ void avic_refresh_virtual_apic_mode(struct kvm_vcpu *vcpu); ...@@ -664,13 +664,16 @@ void avic_refresh_virtual_apic_mode(struct kvm_vcpu *vcpu);
/* sev.c */ /* sev.c */
#define GHCB_VERSION_MAX 1ULL void pre_sev_run(struct vcpu_svm *svm, int cpu);
#define GHCB_VERSION_MIN 1ULL void sev_init_vmcb(struct vcpu_svm *svm);
void sev_vcpu_after_set_cpuid(struct vcpu_svm *svm);
int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in);
extern unsigned int max_sev_asid; void sev_es_vcpu_reset(struct vcpu_svm *svm);
void sev_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector);
void sev_es_prepare_switch_to_guest(struct sev_es_save_area *hostsa);
void sev_es_unmap_ghcb(struct vcpu_svm *svm);
void sev_vm_destroy(struct kvm *kvm); #ifdef CONFIG_KVM_AMD_SEV
int sev_mem_enc_ioctl(struct kvm *kvm, void __user *argp); int sev_mem_enc_ioctl(struct kvm *kvm, void __user *argp);
int sev_mem_enc_register_region(struct kvm *kvm, int sev_mem_enc_register_region(struct kvm *kvm,
struct kvm_enc_region *range); struct kvm_enc_region *range);
...@@ -679,22 +682,30 @@ int sev_mem_enc_unregister_region(struct kvm *kvm, ...@@ -679,22 +682,30 @@ int sev_mem_enc_unregister_region(struct kvm *kvm,
int sev_vm_copy_enc_context_from(struct kvm *kvm, unsigned int source_fd); int sev_vm_copy_enc_context_from(struct kvm *kvm, unsigned int source_fd);
int sev_vm_move_enc_context_from(struct kvm *kvm, unsigned int source_fd); int sev_vm_move_enc_context_from(struct kvm *kvm, unsigned int source_fd);
void sev_guest_memory_reclaimed(struct kvm *kvm); void sev_guest_memory_reclaimed(struct kvm *kvm);
int sev_handle_vmgexit(struct kvm_vcpu *vcpu);
void pre_sev_run(struct vcpu_svm *svm, int cpu); /* These symbols are used in common code and are stubbed below. */
struct page *snp_safe_alloc_page(struct kvm_vcpu *vcpu);
void sev_free_vcpu(struct kvm_vcpu *vcpu);
void sev_vm_destroy(struct kvm *kvm);
void __init sev_set_cpu_caps(void); void __init sev_set_cpu_caps(void);
void __init sev_hardware_setup(void); void __init sev_hardware_setup(void);
void sev_hardware_unsetup(void); void sev_hardware_unsetup(void);
int sev_cpu_init(struct svm_cpu_data *sd); int sev_cpu_init(struct svm_cpu_data *sd);
void sev_init_vmcb(struct vcpu_svm *svm); extern unsigned int max_sev_asid;
void sev_vcpu_after_set_cpuid(struct vcpu_svm *svm); #else
void sev_free_vcpu(struct kvm_vcpu *vcpu); static inline struct page *snp_safe_alloc_page(struct kvm_vcpu *vcpu) {
int sev_handle_vmgexit(struct kvm_vcpu *vcpu); return alloc_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO);
int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in); }
void sev_es_vcpu_reset(struct vcpu_svm *svm);
void sev_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector); static inline void sev_free_vcpu(struct kvm_vcpu *vcpu) {}
void sev_es_prepare_switch_to_guest(struct sev_es_save_area *hostsa); static inline void sev_vm_destroy(struct kvm *kvm) {}
void sev_es_unmap_ghcb(struct vcpu_svm *svm); static inline void __init sev_set_cpu_caps(void) {}
struct page *snp_safe_alloc_page(struct kvm_vcpu *vcpu); static inline void __init sev_hardware_setup(void) {}
static inline void sev_hardware_unsetup(void) {}
static inline int sev_cpu_init(struct svm_cpu_data *sd) { return 0; }
#define max_sev_asid 0
#endif
/* vmenter.S */ /* vmenter.S */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment