Add Secure Encrypted Virtualization (SEV) helper library. The library provides the routines to: - set or clear memory encryption bit for a given memory region. - query whether SEV is enabled. Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Acked-by: Jordan Justen <jordan.l.justen@intel.com>
		
			
				
	
	
		
			85 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
 | 
						|
  Secure Encrypted Virtualization (SEV) library helper function
 | 
						|
 | 
						|
  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
 | 
						|
 | 
						|
  This program and the accompanying materials
 | 
						|
  are licensed and made available under the terms and conditions of the BSD
 | 
						|
  License which accompanies this distribution.  The full text of the license may
 | 
						|
  be found at http://opensource.org/licenses/bsd-license.php
 | 
						|
 | 
						|
  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Register/Cpuid.h>
 | 
						|
#include <Register/Amd/Cpuid.h>
 | 
						|
#include <Register/Amd/Msr.h>
 | 
						|
#include <Library/MemEncryptSevLib.h>
 | 
						|
 | 
						|
/**
 | 
						|
  This function clears memory encryption bit for the memory region specified
 | 
						|
  by BaseAddress and Number of pages from the current page table context.
 | 
						|
 | 
						|
  @param[in]  Cr3BaseAddress        Cr3 Base Address (if zero then use current CR3)
 | 
						|
  @param[in]  BaseAddress           The physical address that is the start address
 | 
						|
                                    of a memory region.
 | 
						|
  @param[in]  NumberOfPages         The number of pages from start memory region.
 | 
						|
  @param[in]  Flush                 Flush the caches before clearing the bit
 | 
						|
                                    (mostly TRUE except MMIO addresses)
 | 
						|
 | 
						|
  @retval RETURN_SUCCESS            The attributes were cleared for the memory region.
 | 
						|
  @retval RETURN_INVALID_PARAMETER  Number of pages is zero.
 | 
						|
  @retval RETURN_UNSUPPORTED        Clearing memory encryption attribute is not
 | 
						|
                                    supported
 | 
						|
  **/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
MemEncryptSevClearPageEncMask (
 | 
						|
  IN PHYSICAL_ADDRESS         Cr3BaseAddress,
 | 
						|
  IN PHYSICAL_ADDRESS         BaseAddress,
 | 
						|
  IN UINTN                    NumberOfPages,
 | 
						|
  IN BOOLEAN                  Flush
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Memory encryption bit is not accessible in 32-bit mode
 | 
						|
  //
 | 
						|
  return RETURN_UNSUPPORTED;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets memory encryption bit for the memory region specified by
 | 
						|
  BaseAddress and Number of pages from the current page table context.
 | 
						|
 | 
						|
  @param[in]  Cr3BaseAddress        Cr3 Base Address (if zero then use current CR3)
 | 
						|
  @param[in]  BaseAddress           The physical address that is the start address
 | 
						|
                                    of a memory region.
 | 
						|
  @param[in]  NumberOfPages         The number of pages from start memory region.
 | 
						|
  @param[in]  Flush                 Flush the caches before clearing the bit
 | 
						|
                                    (mostly TRUE except MMIO addresses)
 | 
						|
 | 
						|
  @retval RETURN_SUCCESS            The attributes were set for the memory region.
 | 
						|
  @retval RETURN_INVALID_PARAMETER  Number of pages is zero.
 | 
						|
  @retval RETURN_UNSUPPORTED        Clearing memory encryption attribute is not
 | 
						|
                                    supported
 | 
						|
  **/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
MemEncryptSevSetPageEncMask (
 | 
						|
  IN PHYSICAL_ADDRESS         Cr3BaseAddress,
 | 
						|
  IN PHYSICAL_ADDRESS         BaseAddress,
 | 
						|
  IN UINTN                    NumberOfPages,
 | 
						|
  IN BOOLEAN                  Flush
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Memory encryption bit is not accessible in 32-bit mode
 | 
						|
  //
 | 
						|
  return RETURN_UNSUPPORTED;
 | 
						|
}
 |