2 OVMF support for QEMU system firmware flash device: functions specific to the
3 runtime DXE driver build.
5 Copyright (C) 2015, Red Hat, Inc.
6 Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
8 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #include <Library/UefiRuntimeLib.h>
13 #include <Library/MemEncryptSevLib.h>
14 #include <Library/VmgExitLib.h>
15 #include <Register/Amd/Msr.h>
17 #include "QemuFlash.h"
20 QemuFlashConvertPointers (
24 EfiConvertPointer (0x0, (VOID
**) &mFlashBase
);
28 QemuFlashBeforeProbe (
29 IN EFI_PHYSICAL_ADDRESS BaseAddress
,
42 @param[in] Ptr Pointer to the location to write.
43 @param[in] Value The value to write.
48 IN
volatile UINT8
*Ptr
,
52 if (MemEncryptSevEsIsEnabled ()) {
53 MSR_SEV_ES_GHCB_REGISTER Msr
;
56 Msr
.GhcbPhysicalAddress
= AsmReadMsr64 (MSR_SEV_ES_GHCB
);
60 // Writing to flash is emulated by the hypervisor through the use of write
61 // protection. This won't work for an SEV-ES guest because the write won't
62 // be recognized as a true MMIO write, which would result in the required
63 // #VC exception. Instead, use the the VMGEXIT MMIO write support directly
64 // to perform the update.
67 Ghcb
->SharedBuffer
[0] = Value
;
68 Ghcb
->SaveArea
.SwScratch
= (UINT64
) (UINTN
) Ghcb
->SharedBuffer
;
69 VmgSetOffsetValid (Ghcb
, GhcbSwScratch
);
70 VmgExit (Ghcb
, SVM_EXIT_MMIO_WRITE
, (UINT64
) (UINTN
) Ptr
, 1);