In the next three patches, we're going to modify three modules under OvmfPkg. When OVMF is built with -D SMM_REQUIRE and runs in an SEV guest, each affected module will have to know the page range that covers the initial (pre-SMBASE relocation) SMRAM save state map. Add a helper function to MemEncryptSevLib that calculates the "base address" and "number of pages" constants for this page range. (In a RELEASE build -- i.e., with assertions disabled and optimization enabled --, the helper function can be compiled to store two constants determined at compile time.) Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Tested-by: Brijesh Singh <brijesh.singh@amd.com> Reviewed-by: Brijesh Singh <brijesh.singh@amd.com>
		
			
				
	
	
		
			113 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
 | 
						|
  Define Secure Encrypted Virtualization (SEV) base 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.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef _MEM_ENCRYPT_SEV_LIB_H_
 | 
						|
#define _MEM_ENCRYPT_SEV_LIB_H_
 | 
						|
 | 
						|
#include <Base.h>
 | 
						|
 | 
						|
/**
 | 
						|
  Returns a boolean to indicate whether SEV is enabled
 | 
						|
 | 
						|
  @retval TRUE           SEV is enabled
 | 
						|
  @retval FALSE          SEV is not enabled
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
EFIAPI
 | 
						|
MemEncryptSevIsEnabled (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function clears memory encryption bit for the memory region specified by
 | 
						|
  BaseAddress and NumPages 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]  NumPages                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 the memory encryption attribute
 | 
						|
                                      is not supported
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
MemEncryptSevClearPageEncMask (
 | 
						|
  IN PHYSICAL_ADDRESS         Cr3BaseAddress,
 | 
						|
  IN PHYSICAL_ADDRESS         BaseAddress,
 | 
						|
  IN UINTN                    NumPages,
 | 
						|
  IN BOOLEAN                  Flush
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function sets memory encryption bit for the memory region specified by
 | 
						|
  BaseAddress and NumPages 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]  NumPages                The number of pages from start memory
 | 
						|
                                      region.
 | 
						|
  @param[in]  Flush                   Flush the caches before setting 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          Setting the memory encryption attribute
 | 
						|
                                      is not supported
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
MemEncryptSevSetPageEncMask (
 | 
						|
  IN PHYSICAL_ADDRESS         Cr3BaseAddress,
 | 
						|
  IN PHYSICAL_ADDRESS         BaseAddress,
 | 
						|
  IN UINTN                    NumPages,
 | 
						|
  IN BOOLEAN                  Flush
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  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
 | 
						|
  );
 | 
						|
#endif // _MEM_ENCRYPT_SEV_LIB_H_
 |