We are going to use the page table structure in yet another place, collect the types and macro that can be used from another module rather than making yet another copy. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2490 Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Tom Lendacky <thomas.lendacky@amd.com> Message-Id: <20210412133003.146438-5-anthony.perard@citrix.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
130 lines
4.6 KiB
C
130 lines
4.6 KiB
C
/** @file
|
|
|
|
Virtual Memory Management Services to set or clear the memory encryption bit
|
|
|
|
Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
|
|
Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
Code is derived from MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.h
|
|
|
|
**/
|
|
|
|
#ifndef __VIRTUAL_MEMORY__
|
|
#define __VIRTUAL_MEMORY__
|
|
|
|
#include <IndustryStandard/PageTable.h>
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/CacheMaintenanceLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Uefi.h>
|
|
|
|
#define SYS_CODE64_SEL 0x38
|
|
|
|
#define PAGE_TABLE_POOL_ALIGNMENT BASE_2MB
|
|
#define PAGE_TABLE_POOL_UNIT_SIZE SIZE_2MB
|
|
#define PAGE_TABLE_POOL_UNIT_PAGES \
|
|
EFI_SIZE_TO_PAGES (PAGE_TABLE_POOL_UNIT_SIZE)
|
|
#define PAGE_TABLE_POOL_ALIGN_MASK \
|
|
(~(EFI_PHYSICAL_ADDRESS)(PAGE_TABLE_POOL_ALIGNMENT - 1))
|
|
|
|
typedef struct {
|
|
VOID *NextPool;
|
|
UINTN Offset;
|
|
UINTN FreePages;
|
|
} PAGE_TABLE_POOL;
|
|
|
|
/**
|
|
Return the pagetable memory encryption mask.
|
|
|
|
@return The pagetable memory encryption mask.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
InternalGetMemEncryptionAddressMask (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
This function clears memory encryption bit for the memory region specified by
|
|
PhysicalAddress and Length from the current page table context.
|
|
|
|
@param[in] Cr3BaseAddress Cr3 Base Address (if zero then use
|
|
current CR3)
|
|
@param[in] PhysicalAddress The physical address that is the start
|
|
address of a memory region.
|
|
@param[in] Length The length of memory region
|
|
@param[in] Flush Flush the caches before applying the
|
|
encryption mask
|
|
|
|
@retval RETURN_SUCCESS The attributes were cleared for the
|
|
memory region.
|
|
@retval RETURN_INVALID_PARAMETER Number of pages is zero.
|
|
@retval RETURN_UNSUPPORTED Clearing the memory encyrption attribute
|
|
is not supported
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
InternalMemEncryptSevSetMemoryDecrypted (
|
|
IN PHYSICAL_ADDRESS Cr3BaseAddress,
|
|
IN PHYSICAL_ADDRESS PhysicalAddress,
|
|
IN UINTN Length,
|
|
IN BOOLEAN Flush
|
|
);
|
|
|
|
/**
|
|
This function sets memory encryption bit for the memory region specified by
|
|
PhysicalAddress and Length from the current page table context.
|
|
|
|
@param[in] Cr3BaseAddress Cr3 Base Address (if zero then use
|
|
current CR3)
|
|
@param[in] PhysicalAddress The physical address that is the start
|
|
address of a memory region.
|
|
@param[in] Length The length of memory region
|
|
@param[in] Flush Flush the caches before applying the
|
|
encryption mask
|
|
|
|
@retval RETURN_SUCCESS The attributes were set for the memory
|
|
region.
|
|
@retval RETURN_INVALID_PARAMETER Number of pages is zero.
|
|
@retval RETURN_UNSUPPORTED Setting the memory encyrption attribute
|
|
is not supported
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
InternalMemEncryptSevSetMemoryEncrypted (
|
|
IN PHYSICAL_ADDRESS Cr3BaseAddress,
|
|
IN PHYSICAL_ADDRESS PhysicalAddress,
|
|
IN UINTN Length,
|
|
IN BOOLEAN Flush
|
|
);
|
|
|
|
/**
|
|
Returns the encryption state of the specified virtual address range.
|
|
|
|
@param[in] Cr3BaseAddress Cr3 Base Address (if zero then use
|
|
current CR3)
|
|
@param[in] BaseAddress Base address to check
|
|
@param[in] Length Length of virtual address range
|
|
|
|
@retval MemEncryptSevAddressRangeUnencrypted Address range is mapped
|
|
unencrypted
|
|
@retval MemEncryptSevAddressRangeEncrypted Address range is mapped
|
|
encrypted
|
|
@retval MemEncryptSevAddressRangeMixed Address range is mapped mixed
|
|
@retval MemEncryptSevAddressRangeError Address range is not mapped
|
|
**/
|
|
MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE
|
|
EFIAPI
|
|
InternalMemEncryptSevGetAddressRangeState (
|
|
IN PHYSICAL_ADDRESS Cr3BaseAddress,
|
|
IN PHYSICAL_ADDRESS BaseAddress,
|
|
IN UINTN Length
|
|
);
|
|
|
|
#endif
|