BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3108 In preparation for a new interface to be added to the MemEncryptSevLib library that will be used in SEC, create an SEC version of the library. This requires the creation of SEC specific files. Some of the current MemEncryptSevLib functions perform memory allocations which cannot be performed in SEC, so these interfaces will return an error during SEC. Also, the current MemEncryptSevLib library uses some static variables to optimize access to variables, which cannot be used in SEC. Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ard Biesheuvel <ard.biesheuvel@arm.com> Cc: Brijesh Singh <brijesh.singh@amd.com> Acked-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Message-Id: <bc7fa76cc23784ab3f37356b6c10dfec61942c38.1610045305.git.thomas.lendacky@amd.com>
64 lines
1.9 KiB
C
64 lines
1.9 KiB
C
/** @file
|
|
|
|
Secure Encrypted Virtualization (SEV) library helper function
|
|
|
|
Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/MemEncryptSevLib.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Register/QemuSmramSaveStateMap.h>
|
|
#include <Register/SmramSaveStateMap.h>
|
|
#include <Uefi/UefiBaseType.h>
|
|
|
|
/**
|
|
Locate the page range that covers the initial (pre-SMBASE-relocation) SMRAM
|
|
Save State Map.
|
|
|
|
@param[out] BaseAddress The base address of the lowest-address page that
|
|
covers the initial SMRAM Save State Map.
|
|
|
|
@param[out] NumberOfPages The number of pages in the page range that covers
|
|
the initial SMRAM Save State Map.
|
|
|
|
@retval RETURN_SUCCESS BaseAddress and NumberOfPages have been set on
|
|
output.
|
|
|
|
@retval RETURN_UNSUPPORTED SMM is unavailable.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
MemEncryptSevLocateInitialSmramSaveStateMapPages (
|
|
OUT UINTN *BaseAddress,
|
|
OUT UINTN *NumberOfPages
|
|
)
|
|
{
|
|
UINTN MapStart;
|
|
UINTN MapEnd;
|
|
UINTN MapPagesStart; // MapStart rounded down to page boundary
|
|
UINTN MapPagesEnd; // MapEnd rounded up to page boundary
|
|
UINTN MapPagesSize; // difference between MapPagesStart and MapPagesEnd
|
|
|
|
if (!FeaturePcdGet (PcdSmmSmramRequire)) {
|
|
return RETURN_UNSUPPORTED;
|
|
}
|
|
|
|
MapStart = SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET;
|
|
MapEnd = MapStart + sizeof (QEMU_SMRAM_SAVE_STATE_MAP);
|
|
MapPagesStart = MapStart & ~(UINTN)EFI_PAGE_MASK;
|
|
MapPagesEnd = ALIGN_VALUE (MapEnd, EFI_PAGE_SIZE);
|
|
MapPagesSize = MapPagesEnd - MapPagesStart;
|
|
|
|
ASSERT ((MapPagesSize & EFI_PAGE_MASK) == 0);
|
|
|
|
*BaseAddress = MapPagesStart;
|
|
*NumberOfPages = MapPagesSize >> EFI_PAGE_SHIFT;
|
|
|
|
return RETURN_SUCCESS;
|
|
}
|