text: /** @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 <Register/Amd/Cpuid.h>
  #include <Register/Amd/Msr.h>
  #include <Register/Cpuid.h>
  
  /**
    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
    )
  {
    //
    // 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 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
    )
  {
    //
    // Memory encryption bit is not accessible in 32-bit mode
    //
    return RETURN_UNSUPPORTED;
  }
  
  /**
    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
  MemEncryptSevGetAddressRangeState (
    IN PHYSICAL_ADDRESS         Cr3BaseAddress,
    IN PHYSICAL_ADDRESS         BaseAddress,
    IN UINTN                    Length
    )
  {
    //
    // Memory is always encrypted in 32-bit mode
    //
    return MemEncryptSevAddressRangeEncrypted;
  }
  