OvmfPkg: Realize EdkiiMemoryAcceptProtocol in TdxDxe
RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3937 Memory usage may exceed the amount accepted at the begining (SEC), TDVF needs to accept memory dynamically when OUT_OF_RESOURCE occurs. Another usage is in SetOrClearSharedBit. If a memory region is changed from shared to private, it must be accepted again. EdkiiMemoryAcceptProtocol is defined in MdePkg and is implementated / installed in TdxDxe for Intel TDX memory acceptance. Cc: Erdem Aktas <erdemaktas@google.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: James Bottomley <jejb@linux.ibm.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Min Xu <min.m.xu@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
parent
2af33db365
commit
7dcc2f3870
|
@ -24,6 +24,7 @@
|
||||||
#include <Library/HobLib.h>
|
#include <Library/HobLib.h>
|
||||||
#include <Protocol/Cpu.h>
|
#include <Protocol/Cpu.h>
|
||||||
#include <Protocol/MpInitLibDepProtocols.h>
|
#include <Protocol/MpInitLibDepProtocols.h>
|
||||||
|
#include <Protocol/MemoryAccept.h>
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
#include <ConfidentialComputingGuestAttr.h>
|
#include <ConfidentialComputingGuestAttr.h>
|
||||||
#include <IndustryStandard/Tdx.h>
|
#include <IndustryStandard/Tdx.h>
|
||||||
|
@ -32,6 +33,95 @@
|
||||||
#include <TdxAcpiTable.h>
|
#include <TdxAcpiTable.h>
|
||||||
#include <Library/MemEncryptTdxLib.h>
|
#include <Library/MemEncryptTdxLib.h>
|
||||||
|
|
||||||
|
#define ALIGNED_2MB_MASK 0x1fffff
|
||||||
|
EFI_HANDLE mTdxDxeHandle = NULL;
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
TdxMemoryAccept (
|
||||||
|
IN EDKII_MEMORY_ACCEPT_PROTOCOL *This,
|
||||||
|
IN EFI_PHYSICAL_ADDRESS StartAddress,
|
||||||
|
IN UINTN Size
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINT32 AcceptPageSize;
|
||||||
|
UINT64 StartAddress1;
|
||||||
|
UINT64 StartAddress2;
|
||||||
|
UINT64 StartAddress3;
|
||||||
|
UINT64 Length1;
|
||||||
|
UINT64 Length2;
|
||||||
|
UINT64 Length3;
|
||||||
|
UINT64 Pages;
|
||||||
|
|
||||||
|
AcceptPageSize = FixedPcdGet32 (PcdTdxAcceptPageSize);
|
||||||
|
StartAddress1 = 0;
|
||||||
|
StartAddress2 = 0;
|
||||||
|
StartAddress3 = 0;
|
||||||
|
Length1 = 0;
|
||||||
|
Length2 = 0;
|
||||||
|
Length3 = 0;
|
||||||
|
|
||||||
|
if (Size == 0) {
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ALIGN_VALUE (StartAddress, SIZE_2MB) != StartAddress) {
|
||||||
|
StartAddress1 = StartAddress;
|
||||||
|
Length1 = ALIGN_VALUE (StartAddress, SIZE_2MB) - StartAddress;
|
||||||
|
if (Length1 >= Size) {
|
||||||
|
Length1 = Size;
|
||||||
|
}
|
||||||
|
|
||||||
|
StartAddress += Length1;
|
||||||
|
Size -= Length1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Size > SIZE_2MB) {
|
||||||
|
StartAddress2 = StartAddress;
|
||||||
|
Length2 = Size & ~(UINT64)ALIGNED_2MB_MASK;
|
||||||
|
StartAddress += Length2;
|
||||||
|
Size -= Length2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Size) {
|
||||||
|
StartAddress3 = StartAddress;
|
||||||
|
Length3 = Size;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
if (Length1 > 0) {
|
||||||
|
Pages = Length1 / SIZE_4KB;
|
||||||
|
Status = TdAcceptPages (StartAddress1, Pages, SIZE_4KB);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Length2 > 0) {
|
||||||
|
Pages = Length2 / AcceptPageSize;
|
||||||
|
Status = TdAcceptPages (StartAddress2, Pages, AcceptPageSize);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Length3 > 0) {
|
||||||
|
Pages = Length3 / SIZE_4KB;
|
||||||
|
Status = TdAcceptPages (StartAddress3, Pages, SIZE_4KB);
|
||||||
|
ASSERT (!EFI_ERROR (Status));
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
EDKII_MEMORY_ACCEPT_PROTOCOL mMemoryAcceptProtocol = {
|
||||||
|
TdxMemoryAccept
|
||||||
|
};
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SetPcdSettings (
|
SetPcdSettings (
|
||||||
EFI_HOB_PLATFORM_INFO *PlatformInfoHob
|
EFI_HOB_PLATFORM_INFO *PlatformInfoHob
|
||||||
|
@ -279,6 +369,19 @@ TdxDxeEntryPoint (
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Install MemoryAccept protocol for TDX
|
||||||
|
//
|
||||||
|
Status = gBS->InstallProtocolInterface (
|
||||||
|
&mTdxDxeHandle,
|
||||||
|
&gEdkiiMemoryAcceptProtocolGuid,
|
||||||
|
EFI_NATIVE_INTERFACE,
|
||||||
|
&mMemoryAcceptProtocol
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Install EdkiiMemoryAcceptProtocol failed.\n"));
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Call TDINFO to get actual number of cpus in domain
|
// Call TDINFO to get actual number of cpus in domain
|
||||||
//
|
//
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
gEfiAcpiTableProtocolGuid ## CONSUMES
|
gEfiAcpiTableProtocolGuid ## CONSUMES
|
||||||
gEfiMpInitLibMpDepProtocolGuid
|
gEfiMpInitLibMpDepProtocolGuid
|
||||||
gEfiMpInitLibUpDepProtocolGuid
|
gEfiMpInitLibUpDepProtocolGuid
|
||||||
|
gEdkiiMemoryAcceptProtocolGuid
|
||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdPciIoBase
|
gUefiOvmfPkgTokenSpaceGuid.PcdPciIoBase
|
||||||
|
@ -69,3 +70,4 @@
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdTdxSharedBitMask
|
gEfiMdeModulePkgTokenSpaceGuid.PcdTdxSharedBitMask
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack
|
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved
|
gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdTdxAcceptPageSize
|
||||||
|
|
Loading…
Reference in New Issue