VirtualBox

Ignore:
Timestamp:
Jul 1, 2021 8:17:41 AM (4 years ago)
Author:
vboxsync
Message:

Devices/EFI: Merge edk-stable202105 and openssl 1.1.1j and make it build, bugref:4643

Location:
trunk/src/VBox/Devices/EFI/FirmwareNew
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/EFI/FirmwareNew

  • trunk/src/VBox/Devices/EFI/FirmwareNew/OvmfPkg/PlatformPei/AmdSev.c

    r85718 r89983  
    22  Initialize Secure Encrypted Virtualization (SEV) support
    33
    4   Copyright (c) 2017, Advanced Micro Devices. All rights reserved.<BR>
     4  Copyright (c) 2017 - 2020, Advanced Micro Devices. All rights reserved.<BR>
    55
    66  SPDX-License-Identifier: BSD-2-Clause-Patent
     
    1111//
    1212#include <IndustryStandard/Q35MchIch9.h>
     13#include <Library/BaseMemoryLib.h>
    1314#include <Library/DebugLib.h>
    1415#include <Library/HobLib.h>
    1516#include <Library/MemEncryptSevLib.h>
     17#include <Library/MemoryAllocationLib.h>
    1618#include <Library/PcdLib.h>
    1719#include <PiPei.h>
    18 #include <Register/Amd/Cpuid.h>
    19 #include <Register/Cpuid.h>
     20#include <Register/Amd/Msr.h>
    2021#include <Register/Intel/SmramSaveStateMap.h>
    2122
    2223#include "Platform.h"
     24
     25/**
     26
     27  Initialize SEV-ES support if running as an SEV-ES guest.
     28
     29  **/
     30STATIC
     31VOID
     32AmdSevEsInitialize (
     33  VOID
     34  )
     35{
     36  UINT8                *GhcbBase;
     37  PHYSICAL_ADDRESS     GhcbBasePa;
     38  UINTN                GhcbPageCount;
     39  UINT8                *GhcbBackupBase;
     40  UINT8                *GhcbBackupPages;
     41  UINTN                GhcbBackupPageCount;
     42  SEV_ES_PER_CPU_DATA  *SevEsData;
     43  UINTN                PageCount;
     44  RETURN_STATUS        PcdStatus, DecryptStatus;
     45  IA32_DESCRIPTOR      Gdtr;
     46  VOID                 *Gdt;
     47
     48  if (!MemEncryptSevEsIsEnabled ()) {
     49    return;
     50  }
     51
     52  PcdStatus = PcdSetBoolS (PcdSevEsIsEnabled, TRUE);
     53  ASSERT_RETURN_ERROR (PcdStatus);
     54
     55  //
     56  // Allocate GHCB and per-CPU variable pages.
     57  //   Since the pages must survive across the UEFI to OS transition
     58  //   make them reserved.
     59  //
     60  GhcbPageCount = mMaxCpuCount * 2;
     61  GhcbBase = AllocateReservedPages (GhcbPageCount);
     62  ASSERT (GhcbBase != NULL);
     63
     64  GhcbBasePa = (PHYSICAL_ADDRESS)(UINTN) GhcbBase;
     65
     66  //
     67  // Each vCPU gets two consecutive pages, the first is the GHCB and the
     68  // second is the per-CPU variable page. Loop through the allocation and
     69  // only clear the encryption mask for the GHCB pages.
     70  //
     71  for (PageCount = 0; PageCount < GhcbPageCount; PageCount += 2) {
     72    DecryptStatus = MemEncryptSevClearPageEncMask (
     73      0,
     74      GhcbBasePa + EFI_PAGES_TO_SIZE (PageCount),
     75      1,
     76      TRUE
     77      );
     78    ASSERT_RETURN_ERROR (DecryptStatus);
     79  }
     80
     81  ZeroMem (GhcbBase, EFI_PAGES_TO_SIZE (GhcbPageCount));
     82
     83  PcdStatus = PcdSet64S (PcdGhcbBase, GhcbBasePa);
     84  ASSERT_RETURN_ERROR (PcdStatus);
     85  PcdStatus = PcdSet64S (PcdGhcbSize, EFI_PAGES_TO_SIZE (GhcbPageCount));
     86  ASSERT_RETURN_ERROR (PcdStatus);
     87
     88  DEBUG ((DEBUG_INFO,
     89    "SEV-ES is enabled, %lu GHCB pages allocated starting at 0x%p\n",
     90    (UINT64)GhcbPageCount, GhcbBase));
     91
     92  //
     93  // Allocate #VC recursion backup pages. The number of backup pages needed is
     94  // one less than the maximum VC count.
     95  //
     96  GhcbBackupPageCount = mMaxCpuCount * (VMGEXIT_MAXIMUM_VC_COUNT - 1);
     97  GhcbBackupBase = AllocatePages (GhcbBackupPageCount);
     98  ASSERT (GhcbBackupBase != NULL);
     99
     100  GhcbBackupPages = GhcbBackupBase;
     101  for (PageCount = 1; PageCount < GhcbPageCount; PageCount += 2) {
     102    SevEsData =
     103      (SEV_ES_PER_CPU_DATA *)(GhcbBase + EFI_PAGES_TO_SIZE (PageCount));
     104    SevEsData->GhcbBackupPages = GhcbBackupPages;
     105
     106    GhcbBackupPages += EFI_PAGE_SIZE * (VMGEXIT_MAXIMUM_VC_COUNT - 1);
     107  }
     108
     109  DEBUG ((DEBUG_INFO,
     110    "SEV-ES is enabled, %lu GHCB backup pages allocated starting at 0x%p\n",
     111    (UINT64)GhcbBackupPageCount, GhcbBackupBase));
     112
     113  AsmWriteMsr64 (MSR_SEV_ES_GHCB, GhcbBasePa);
     114
     115  //
     116  // The SEV support will clear the C-bit from non-RAM areas.  The early GDT
     117  // lives in a non-RAM area, so when an exception occurs (like a #VC) the GDT
     118  // will be read as un-encrypted even though it was created before the C-bit
     119  // was cleared (encrypted). This will result in a failure to be able to
     120  // handle the exception.
     121  //
     122  AsmReadGdtr (&Gdtr);
     123
     124  Gdt = AllocatePages (EFI_SIZE_TO_PAGES ((UINTN) Gdtr.Limit + 1));
     125  ASSERT (Gdt != NULL);
     126
     127  CopyMem (Gdt, (VOID *) Gdtr.Base, Gdtr.Limit + 1);
     128  Gdtr.Base = (UINTN) Gdt;
     129  AsmWriteGdtr (&Gdtr);
     130}
    23131
    24132/**
     
    33141  )
    34142{
    35   CPUID_MEMORY_ENCRYPTION_INFO_EBX  Ebx;
    36143  UINT64                            EncryptionMask;
    37144  RETURN_STATUS                     PcdStatus;
     
    45152
    46153  //
    47   // CPUID Fn8000_001F[EBX] Bit 0:5 (memory encryption bit position)
    48   //
    49   AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, NULL, &Ebx.Uint32, NULL, NULL);
    50   EncryptionMask = LShiftU64 (1, Ebx.Bits.PtePosBits);
    51 
    52   //
    53154  // Set Memory Encryption Mask PCD
    54155  //
     156  EncryptionMask = MemEncryptSevGetEncryptionMask ();
    55157  PcdStatus = PcdSet64S (PcdPteMemoryEncryptionAddressOrMask, EncryptionMask);
    56158  ASSERT_RETURN_ERROR (PcdStatus);
     
    104206    }
    105207  }
     208
     209  //
     210  // Check and perform SEV-ES initialization if required.
     211  //
     212  AmdSevEsInitialize ();
    106213}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette