mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-13 05:26:24 +07:00
x86/vmware: Add VMware-specific handling for VMMCALL under SEV-ES
Add VMware-specific handling for #VC faults caused by VMMCALL instructions. Signed-off-by: Doug Covelli <dcovelli@vmware.com> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> [ jroedel@suse.de: - Adapt to different paravirt interface ] Co-developed-by: Joerg Roedel <jroedel@suse.de> Signed-off-by: Joerg Roedel <jroedel@suse.de> Signed-off-by: Borislav Petkov <bp@suse.de> Link: https://lkml.kernel.org/r/20200907131613.12703-65-joro@8bytes.org
This commit is contained in:
parent
99419b251e
commit
1a222de8dc
@ -33,6 +33,7 @@
|
||||
#include <asm/timer.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/vmware.h>
|
||||
#include <asm/svm.h>
|
||||
|
||||
#undef pr_fmt
|
||||
#define pr_fmt(fmt) "vmware: " fmt
|
||||
@ -476,10 +477,49 @@ static bool __init vmware_legacy_x2apic_available(void)
|
||||
(eax & (1 << VMWARE_CMD_LEGACY_X2APIC)) != 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
||||
static void vmware_sev_es_hcall_prepare(struct ghcb *ghcb,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
/* Copy VMWARE specific Hypercall parameters to the GHCB */
|
||||
ghcb_set_rip(ghcb, regs->ip);
|
||||
ghcb_set_rbx(ghcb, regs->bx);
|
||||
ghcb_set_rcx(ghcb, regs->cx);
|
||||
ghcb_set_rdx(ghcb, regs->dx);
|
||||
ghcb_set_rsi(ghcb, regs->si);
|
||||
ghcb_set_rdi(ghcb, regs->di);
|
||||
ghcb_set_rbp(ghcb, regs->bp);
|
||||
}
|
||||
|
||||
static bool vmware_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs)
|
||||
{
|
||||
if (!(ghcb_rbx_is_valid(ghcb) &&
|
||||
ghcb_rcx_is_valid(ghcb) &&
|
||||
ghcb_rdx_is_valid(ghcb) &&
|
||||
ghcb_rsi_is_valid(ghcb) &&
|
||||
ghcb_rdi_is_valid(ghcb) &&
|
||||
ghcb_rbp_is_valid(ghcb)))
|
||||
return false;
|
||||
|
||||
regs->bx = ghcb->save.rbx;
|
||||
regs->cx = ghcb->save.rcx;
|
||||
regs->dx = ghcb->save.rdx;
|
||||
regs->si = ghcb->save.rsi;
|
||||
regs->di = ghcb->save.rdi;
|
||||
regs->bp = ghcb->save.rbp;
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
const __initconst struct hypervisor_x86 x86_hyper_vmware = {
|
||||
.name = "VMware",
|
||||
.detect = vmware_platform,
|
||||
.type = X86_HYPER_VMWARE,
|
||||
.init.init_platform = vmware_platform_setup,
|
||||
.init.x2apic_available = vmware_legacy_x2apic_available,
|
||||
.name = "VMware",
|
||||
.detect = vmware_platform,
|
||||
.type = X86_HYPER_VMWARE,
|
||||
.init.init_platform = vmware_platform_setup,
|
||||
.init.x2apic_available = vmware_legacy_x2apic_available,
|
||||
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
||||
.runtime.sev_es_hcall_prepare = vmware_sev_es_hcall_prepare,
|
||||
.runtime.sev_es_hcall_finish = vmware_sev_es_hcall_finish,
|
||||
#endif
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user