Files
system76-edk2/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashSmm.c
Brijesh Singh e4a1d5a7c4 OvmfPkg/QemuFlashFvbServicesRuntimeDxe: Clear C-bit when SEV is active
Commit:24e4ad7 (OvmfPkg: Add AmdSevDxe driver) added a driver which runs
early in DXE phase and clears the C-bit from NonExistent entry -- which
is later split and accommodate the flash MMIO. When SMM is enabled, we
build two sets of page tables; first page table is used when executing
code in non SMM mode (SMM-less-pgtable) and second page table is used
when we are executing code in SMM mode (SMM-pgtable).

During boot time, AmdSevDxe driver clears the C-bit from the
SMM-less-pgtable. But when SMM is enabled, Qemu Flash services are used
from SMM mode.

In this patch we explicitly clear the C-bit from Qemu flash MMIO range
before we probe the flash. When OVMF is built with SMM_REQUIRE then
call to initialize the flash services happen after the SMM-pgtable is
created and processor has served the first SMI. At this time we will
have access to the SMM-pgtable.

Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
[lersek@redhat.com: trivial coding style improvements]
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
2018-03-09 21:44:53 +01:00

55 lines
1.7 KiB
C

/** @file
Define the module hooks used while probing the QEMU flash device.
Copyright (C) 2018, Advanced Micro Devices. All rights reserved.
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/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <Library/MemEncryptSevLib.h>
#include "QemuFlash.h"
VOID
QemuFlashBeforeProbe (
IN EFI_PHYSICAL_ADDRESS BaseAddress,
IN UINTN FdBlockSize,
IN UINTN FdBlockCount
)
{
EFI_STATUS Status;
ASSERT (FeaturePcdGet (PcdSmmSmramRequire));
if (!MemEncryptSevIsEnabled ()) {
return;
}
//
// When SEV is enabled, AmdSevDxe runs early in DXE phase and clears the
// C-bit from the NonExistent entry -- which is later split and accommodate
// the flash MMIO but the driver runs in non SMM context hence it cleared the
// flash ranges from non SMM page table. When SMM is enabled, the flash
// services are accessed from the SMM mode hence we explicitly clear the
// C-bit on flash ranges from SMM page table.
//
Status = MemEncryptSevClearPageEncMask (
0,
BaseAddress,
EFI_SIZE_TO_PAGES (FdBlockSize * FdBlockCount),
FALSE
);
ASSERT_EFI_ERROR (Status);
}