]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86/hyperv: Add hyperv-specific handling for VMMCALL under SEV-ES
authorTianyu Lan <tiala@microsoft.com>
Fri, 18 Aug 2023 10:29:18 +0000 (06:29 -0400)
committerWei Liu <wei.liu@kernel.org>
Tue, 22 Aug 2023 00:38:20 +0000 (00:38 +0000)
Add Hyperv-specific handling for faults caused by VMMCALL
instructions.

Reviewed-by: Dexuan Cui <decui@microsoft.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Signed-off-by: Tianyu Lan <tiala@microsoft.com>
Signed-off-by: Wei Liu <wei.liu@kernel.org>
Link: https://lore.kernel.org/r/20230818102919.1318039-9-ltykernel@gmail.com
arch/x86/kernel/cpu/mshyperv.c

index c56fc151b8db548af862facbc5f59971c92b7474..26b9fcabd7d95b1bea38d5bf95c109d477d27fdb 100644 (file)
@@ -32,6 +32,7 @@
 #include <asm/nmi.h>
 #include <clocksource/hyperv_timer.h>
 #include <asm/numa.h>
+#include <asm/svm.h>
 
 /* Is Linux running as the root partition? */
 bool hv_root_partition;
@@ -574,6 +575,22 @@ static bool __init ms_hyperv_msi_ext_dest_id(void)
        return eax & HYPERV_VS_PROPERTIES_EAX_EXTENDED_IOAPIC_RTE;
 }
 
+#ifdef CONFIG_AMD_MEM_ENCRYPT
+static void hv_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs)
+{
+       /* RAX and CPL are already in the GHCB */
+       ghcb_set_rcx(ghcb, regs->cx);
+       ghcb_set_rdx(ghcb, regs->dx);
+       ghcb_set_r8(ghcb, regs->r8);
+}
+
+static bool hv_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs)
+{
+       /* No checking of the return state needed */
+       return true;
+}
+#endif
+
 const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
        .name                   = "Microsoft Hyper-V",
        .detect                 = ms_hyperv_platform,
@@ -581,4 +598,8 @@ const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
        .init.x2apic_available  = ms_hyperv_x2apic_available,
        .init.msi_ext_dest_id   = ms_hyperv_msi_ext_dest_id,
        .init.init_platform     = ms_hyperv_init_platform,
+#ifdef CONFIG_AMD_MEM_ENCRYPT
+       .runtime.sev_es_hcall_prepare = hv_sev_es_hcall_prepare,
+       .runtime.sev_es_hcall_finish = hv_sev_es_hcall_finish,
+#endif
 };