{
__snp_leak_pages(pfn, pages, true);
}
-void snp_prepare(void);
+int snp_prepare(void);
void snp_shutdown(void);
#else
static inline bool snp_probe_rmptable_info(void) { return false; }
static inline void snp_leak_pages(u64 pfn, unsigned int npages) {}
static inline void kdump_sev_callback(void) { }
static inline void snp_fixup_e820_tables(void) {}
-static inline void snp_prepare(void) {}
+static inline int snp_prepare(void) { return -ENODEV; }
static inline void snp_shutdown(void) {}
#endif
wrmsrq(MSR_VM_HSAVE_PA, 0);
}
-void snp_prepare(void)
+int snp_prepare(void)
{
+ int ret;
u64 val;
/*
*/
rdmsrq(MSR_AMD64_SYSCFG, val);
if (val & MSR_AMD64_SYSCFG_SNP_EN)
- return;
+ return 0;
clear_rmp();
cpus_read_lock();
+ if (!cpumask_equal(cpu_online_mask, cpu_present_mask)) {
+ ret = -EOPNOTSUPP;
+ pr_warn("SNP init failed: not all CPUs online. (%*pbl online <-> %*pbl present masks).\n",
+ cpumask_pr_args(cpu_online_mask),
+ cpumask_pr_args(cpu_present_mask));
+ goto unlock;
+ }
+
/*
* MtrrFixDramModEn is not shared between threads on a core,
* therefore it must be set on all CPUs prior to enabling SNP.
/* SNP_INIT requires MSR_VM_HSAVE_PA to be cleared on all CPUs. */
on_each_cpu(clear_hsave_pa, NULL, 1);
+ ret = 0;
+
+unlock:
cpus_read_unlock();
+
+ return ret;
}
EXPORT_SYMBOL_FOR_MODULES(snp_prepare, "ccp");