mirror of https://github.com/acidanthera/audk.git
OvmfPkg: introduce a common work area
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3429 Both the TDX and SEV support needs to reserve a page in MEMFD as a work area. The page will contain meta data specific to the guest type. Currently, the SEV-ES support reserves a page in MEMFD (PcdSevEsWorkArea) for the work area. This page can be reused as a TDX work area when Intel TDX is enabled. Based on the discussion [1], it was agreed to rename the SevEsWorkArea to the OvmfWorkArea, and add a header that can be used to indicate the work area type. [1] https://edk2.groups.io/g/devel/message/78262?p=,,,20,0,0,0::\ created,0,SNP,20,2,0,84476064 Cc: James Bottomley <jejb@linux.ibm.com> Cc: Min Xu <min.m.xu@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Erdem Aktas <erdemaktas@google.com> Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> Reviewed-by: Min Xu <min.m.xu@intel.com> Reviewed-by: Jiewen Yao <Jiewen.yao@intel.com>
This commit is contained in:
parent
8b15024dc7
commit
80e67af9af
|
@ -12,6 +12,7 @@
|
||||||
#define _MEM_ENCRYPT_SEV_LIB_H_
|
#define _MEM_ENCRYPT_SEV_LIB_H_
|
||||||
|
|
||||||
#include <Base.h>
|
#include <Base.h>
|
||||||
|
#include <WorkArea.h>
|
||||||
|
|
||||||
//
|
//
|
||||||
// Define the maximum number of #VCs allowed (e.g. the level of nesting
|
// Define the maximum number of #VCs allowed (e.g. the level of nesting
|
||||||
|
@ -36,26 +37,6 @@ typedef struct {
|
||||||
VOID *GhcbBackupPages;
|
VOID *GhcbBackupPages;
|
||||||
} SEV_ES_PER_CPU_DATA;
|
} SEV_ES_PER_CPU_DATA;
|
||||||
|
|
||||||
//
|
|
||||||
// Internal structure for holding SEV-ES information needed during SEC phase
|
|
||||||
// and valid only during SEC phase and early PEI during platform
|
|
||||||
// initialization.
|
|
||||||
//
|
|
||||||
// This structure is also used by assembler files:
|
|
||||||
// OvmfPkg/ResetVector/ResetVector.nasmb
|
|
||||||
// OvmfPkg/ResetVector/Ia32/PageTables64.asm
|
|
||||||
// OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm
|
|
||||||
// any changes must stay in sync with its usage.
|
|
||||||
//
|
|
||||||
typedef struct _SEC_SEV_ES_WORK_AREA {
|
|
||||||
UINT8 SevEsEnabled;
|
|
||||||
UINT8 Reserved1[7];
|
|
||||||
|
|
||||||
UINT64 RandomData;
|
|
||||||
|
|
||||||
UINT64 EncryptionMask;
|
|
||||||
} SEC_SEV_ES_WORK_AREA;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Memory encryption address range states.
|
// Memory encryption address range states.
|
||||||
//
|
//
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
/** @file
|
||||||
|
|
||||||
|
Work Area structure definition
|
||||||
|
|
||||||
|
Copyright (c) 2021, AMD Inc.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef __OVMF_WORK_AREA_H__
|
||||||
|
#define __OVMF_WORK_AREA_H__
|
||||||
|
|
||||||
|
//
|
||||||
|
// Guest type for the work area
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
GUEST_TYPE_NON_ENCRYPTED,
|
||||||
|
GUEST_TYPE_AMD_SEV,
|
||||||
|
GUEST_TYPE_INTEL_TDX,
|
||||||
|
|
||||||
|
} GUEST_TYPE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Confidential computing work area header definition. Any change
|
||||||
|
// to the structure need to be kept in sync with the
|
||||||
|
// PcdOvmfConfidentialComputingWorkAreaHeader.
|
||||||
|
//
|
||||||
|
typedef struct _CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER {
|
||||||
|
UINT8 GuestType;
|
||||||
|
UINT8 Reserved1[3];
|
||||||
|
} CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Internal structure for holding SEV-ES information needed during SEC phase
|
||||||
|
// and valid only during SEC phase and early PEI during platform
|
||||||
|
// initialization.
|
||||||
|
//
|
||||||
|
// This structure is also used by assembler files:
|
||||||
|
// OvmfPkg/ResetVector/ResetVector.nasmb
|
||||||
|
// OvmfPkg/ResetVector/Ia32/PageTables64.asm
|
||||||
|
// OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm
|
||||||
|
// any changes must stay in sync with its usage.
|
||||||
|
//
|
||||||
|
typedef struct _SEC_SEV_ES_WORK_AREA {
|
||||||
|
UINT8 SevEsEnabled;
|
||||||
|
UINT8 Reserved1[7];
|
||||||
|
|
||||||
|
UINT64 RandomData;
|
||||||
|
|
||||||
|
UINT64 EncryptionMask;
|
||||||
|
} SEC_SEV_ES_WORK_AREA;
|
||||||
|
|
||||||
|
//
|
||||||
|
// The SEV work area definition.
|
||||||
|
//
|
||||||
|
typedef struct _SEV_WORK_AREA {
|
||||||
|
CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER Header;
|
||||||
|
|
||||||
|
SEC_SEV_ES_WORK_AREA SevEsWorkArea;
|
||||||
|
} SEV_WORK_AREA;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER Header;
|
||||||
|
SEV_WORK_AREA SevWorkArea;
|
||||||
|
} OVMF_WORK_AREA;
|
||||||
|
|
||||||
|
#endif
|
|
@ -329,6 +329,18 @@
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableBase|0x0|UINT32|0x47
|
gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableBase|0x0|UINT32|0x47
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableSize|0x0|UINT32|0x48
|
gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableSize|0x0|UINT32|0x48
|
||||||
|
|
||||||
|
## The base address and size of the work area used during the SEC
|
||||||
|
# phase by the SEV and TDX supports.
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|0|UINT32|0x49
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize|0|UINT32|0x50
|
||||||
|
|
||||||
|
## The work area contains a fixed size header in the Include/WorkArea.h.
|
||||||
|
# The size of this header is used early boot, and is provided through
|
||||||
|
# a fixed PCD. It need to be kept in sync with any changes to the
|
||||||
|
# header definition.
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader|0|UINT32|0x51
|
||||||
|
|
||||||
|
|
||||||
[PcdsDynamic, PcdsDynamicEx]
|
[PcdsDynamic, PcdsDynamicEx]
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2
|
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable|FALSE|BOOLEAN|0x10
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable|FALSE|BOOLEAN|0x10
|
||||||
|
|
|
@ -82,6 +82,12 @@ SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize = $(BLOCK_SIZ
|
||||||
SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwSpareBase = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwWorkingBase + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
|
SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwSpareBase = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwWorkingBase + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
|
||||||
SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize = $(VARS_SPARE_SIZE)
|
SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize = $(VARS_SPARE_SIZE)
|
||||||
|
|
||||||
|
# The OVMF WorkArea contains a fixed size header followed by the actual data.
|
||||||
|
# The size of header is accessed through a fixed PCD in the reset vector code.
|
||||||
|
# The value need to be kept in sync with the any changes to the Confidential
|
||||||
|
# Computing Work Area header defined in the Include/WorkArea.h
|
||||||
|
SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader = 4
|
||||||
|
|
||||||
!if $(SMM_REQUIRE) == TRUE
|
!if $(SMM_REQUIRE) == TRUE
|
||||||
SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase
|
SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase
|
||||||
SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwWorkingBase
|
SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwWorkingBase
|
||||||
|
|
|
@ -83,7 +83,7 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableBase|gUefiOvmfPkgTokenSpaceGui
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbSize
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbSize
|
||||||
|
|
||||||
0x00B000|0x001000
|
0x00B000|0x001000
|
||||||
gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase|gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize
|
||||||
|
|
||||||
0x00C000|0x001000
|
0x00C000|0x001000
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize
|
||||||
|
@ -99,6 +99,13 @@ FV = PEIFV
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize
|
||||||
FV = DXEFV
|
FV = DXEFV
|
||||||
|
|
||||||
|
##########################################################################################
|
||||||
|
# Set the SEV-ES specific work area PCDs
|
||||||
|
#
|
||||||
|
SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader
|
||||||
|
SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader
|
||||||
|
##########################################################################################
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
[FV.SECFV]
|
[FV.SECFV]
|
||||||
|
|
|
@ -939,9 +939,9 @@ InitializeRamRegions (
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MDE_CPU_X64
|
#ifdef MDE_CPU_X64
|
||||||
if (MemEncryptSevEsIsEnabled ()) {
|
if (FixedPcdGet32 (PcdOvmfWorkAreaSize) != 0) {
|
||||||
//
|
//
|
||||||
// If SEV-ES is enabled, reserve the SEV-ES work area.
|
// Reserve the work area.
|
||||||
//
|
//
|
||||||
// Since this memory range will be used by the Reset Vector on S3
|
// Since this memory range will be used by the Reset Vector on S3
|
||||||
// resume, it must be reserved as ACPI NVS.
|
// resume, it must be reserved as ACPI NVS.
|
||||||
|
@ -951,8 +951,8 @@ InitializeRamRegions (
|
||||||
// such that they would overlap the work area.
|
// such that they would overlap the work area.
|
||||||
//
|
//
|
||||||
BuildMemoryAllocationHob (
|
BuildMemoryAllocationHob (
|
||||||
(EFI_PHYSICAL_ADDRESS)(UINTN) FixedPcdGet32 (PcdSevEsWorkAreaBase),
|
(EFI_PHYSICAL_ADDRESS)(UINTN) FixedPcdGet32 (PcdOvmfWorkAreaBase),
|
||||||
(UINT64)(UINTN) FixedPcdGet32 (PcdSevEsWorkAreaSize),
|
(UINT64)(UINTN) FixedPcdGet32 (PcdOvmfWorkAreaSize),
|
||||||
mS3Supported ? EfiACPIMemoryNVS : EfiBootServicesData
|
mS3Supported ? EfiACPIMemoryNVS : EfiBootServicesData
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,8 +116,8 @@
|
||||||
gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
|
gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize
|
||||||
gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase
|
||||||
gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize
|
||||||
|
|
||||||
[FeaturePcd]
|
[FeaturePcd]
|
||||||
gUefiOvmfPkgTokenSpaceGuid.PcdCsmEnable
|
gUefiOvmfPkgTokenSpaceGuid.PcdCsmEnable
|
||||||
|
|
Loading…
Reference in New Issue