Base enablement of DXE driver that supports confidential migration. Signed-off-by: Tobin Feldman-Fitzthum <to...@linux.ibm.com> --- OvmfPkg/OvmfPkg.dec | 5 ++ OvmfPkg/AmdSev/AmdSevX64.dsc | 1 + OvmfPkg/AmdSev/AmdSevX64.fdf | 1 + .../ConfidentialMigrationDxe.inf | 39 +++++++++ .../ConfidentialMigrationDxe.c | 83 +++++++++++++++++++ 5 files changed, 129 insertions(+) create mode 100644 OvmfPkg/AmdSev/ConfidentialMigration/ConfidentialMigrationDxe.inf create mode 100644 OvmfPkg/AmdSev/ConfidentialMigration/ConfidentialMigrationDxe.c
diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index 4450d78b91..402c3b61fa 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -324,6 +324,11 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId|0|UINT16|0x1b gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated|FALSE|BOOLEAN|0x21 + ## Set via FW_CFG to enable confidentialmigration as source or target. + # + gUefiOvmfPkgTokenSpaceGuid.PcdIsConfidentialMigrationTarget|FALSE|BOOLEAN|0x46 + gUefiOvmfPkgTokenSpaceGuid.PcdStartConfidentialMigrationHandler|FALSE|BOOLEAN|0x47 + ## The IO port aperture shared by all PCI root bridges. # gUefiOvmfPkgTokenSpaceGuid.PcdPciIoBase|0x0|UINT64|0x22 diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc index ca21fd6e5f..fa68143663 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.dsc +++ b/OvmfPkg/AmdSev/AmdSevX64.dsc @@ -787,6 +787,7 @@ !endif OvmfPkg/AmdSev/SecretDxe/SecretDxe.inf OvmfPkg/AmdSev/Grub/Grub.inf + OvmfPkg/AmdSev/ConfidentialMigration/ConfidentialMigrationDxe.inf !if $(BUILD_SHELL) == TRUE ShellPkg/Application/Shell/Shell.inf { <LibraryClasses> diff --git a/OvmfPkg/AmdSev/AmdSevX64.fdf b/OvmfPkg/AmdSev/AmdSevX64.fdf index c0098502aa..6ef6dc89f2 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.fdf +++ b/OvmfPkg/AmdSev/AmdSevX64.fdf @@ -273,6 +273,7 @@ INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf INF OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf !endif INF OvmfPkg/AmdSev/SecretDxe/SecretDxe.inf +INF OvmfPkg/AmdSev/ConfidentialMigration/ConfidentialMigrationDxe.inf INF OvmfPkg/AmdSev/Grub/Grub.inf !if $(BUILD_SHELL) == TRUE INF ShellPkg/Application/Shell/Shell.inf diff --git a/OvmfPkg/AmdSev/ConfidentialMigration/ConfidentialMigrationDxe.inf b/OvmfPkg/AmdSev/ConfidentialMigration/ConfidentialMigrationDxe.inf new file mode 100644 index 0000000000..a4906a2451 --- /dev/null +++ b/OvmfPkg/AmdSev/ConfidentialMigration/ConfidentialMigrationDxe.inf @@ -0,0 +1,39 @@ +## @file +# +# Copyright (C) 2021 IBM Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = ConfidentialMigration + FILE_GUID = 5c2978f4-f175-434b-9e6c-9b03bd7e346f + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = LaunchMigrationHandler + +[Sources] + ConfidentialMigrationDxe.c + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + +[LibraryClasses] + MemoryAllocationLib + DebugLib + UefiBootServicesTableLib + MpInitLib + UefiDriverEntryPoint + +[Protocols] + gEfiMpServiceProtocolGuid + +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdIsConfidentialMigrationTarget + gUefiOvmfPkgTokenSpaceGuid.PcdStartConfidentialMigrationHandler + +[Depex] + gEfiMpServiceProtocolGuid diff --git a/OvmfPkg/AmdSev/ConfidentialMigration/ConfidentialMigrationDxe.c b/OvmfPkg/AmdSev/ConfidentialMigration/ConfidentialMigrationDxe.c new file mode 100644 index 0000000000..6d9fe7043b --- /dev/null +++ b/OvmfPkg/AmdSev/ConfidentialMigration/ConfidentialMigrationDxe.c @@ -0,0 +1,83 @@ +/** @file + In-guest support for confidential migration + + Copyright (C) 2021 IBM Coporation. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ +#include <Library/UefiLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Library/DebugLib.h> +#include <Protocol/MpService.h> + +UINTN MigrationHandlerCpuIndex; + +VOID +EFIAPI +MigrationHandlerMain ( + IN OUT VOID *Buffer + ) +{ + DebugPrint (DEBUG_INFO,"MIGRATION Handler Started\n"); +} + +EFI_STATUS +EFIAPI +LaunchMigrationHandler ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_MP_SERVICES_PROTOCOL *MpProto; + EFI_PROCESSOR_INFORMATION Tcb; + EFI_STATUS Status; + UINTN NumProc; + UINTN NumEnabled; + + gST = SystemTable; + gBS = gST->BootServices; + gRT = gST->RuntimeServices; + + Status = EFI_NOT_STARTED; + + if (!PcdGetBool(PcdStartConfidentialMigrationHandler)) { + return 0; + } + + // + // Use the MP Service protocol to start Migration Handler on AP + // + gBS->LocateProtocol (&gEfiMpServiceProtocolGuid, NULL, (void**)&MpProto); + MpProto->GetNumberOfProcessors (MpProto, &NumProc, &NumEnabled); + if (NumProc < 2) { + DebugPrint (DEBUG_ERROR,"Only one vCPU enabled. Please start an extra for the MH.\n"); + return 0; + } + + MigrationHandlerCpuIndex = NumProc - 1; + + EFI_EVENT Event; + MpProto->GetProcessorInfo (MpProto, MigrationHandlerCpuIndex, &Tcb); + if (Tcb.StatusFlag != 7) { + gBS->CreateEvent (EVT_TIMER, TPL_NOTIFY, NULL, NULL, &Event); + + Status = MpProto->StartupThisAP(MpProto, MigrationHandlerMain, 1, Event, + 0, MpProto, NULL); + } + if (Status != EFI_SUCCESS) { + DebugPrint (DEBUG_ERROR,"Failed to start Migration Handler\n"); + return 0; + } + + // + // If we are the target, wait for incoming migration. Otherwise, + // procede with the boot. + // + if (PcdGetBool(PcdIsConfidentialMigrationTarget)) { + DebugPrint (DEBUG_INFO,"Waiting for incoming confidential migration.\n"); + DisableInterrupts (); + CpuDeadLoop (); + } + + return 0; +} -- 2.20.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72355): https://edk2.groups.io/g/devel/message/72355 Mute This Topic: https://groups.io/mt/81036368/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-