From d881c6ddf556dfb5032db04733dfa86aa891e7f8 Mon Sep 17 00:00:00 2001 From: Abner Chang Date: Mon, 11 Oct 2021 21:27:33 +0800 Subject: ArmVirtPkg/HighMemDxe: Relocate HighMemDxe to OvmfPkg Relocate HighMemDxe to OvmfPkg/Fdt, this library is leverage by both ARM and RISC-V archs. Signed-off-by: Abner Chang Cc: Ard Biesheuvel Cc: Leif Lindholm Cc: Sami Mujawar Cc: Jiewen Yao Cc: Jordan Justen Cc: Gerd Hoffmann Cc: Daniel Schaefer Cc: Sunil V L Reviewed-by: Daniel Schaefer Reviewed-by: Sunil V L Acked-by: Gerd Hoffmann Cc: Jiewen Yao --- ArmVirtPkg/ArmVirtCloudHv.dsc | 2 +- ArmVirtPkg/ArmVirtCloudHv.fdf | 2 +- ArmVirtPkg/ArmVirtKvmTool.dsc | 2 +- ArmVirtPkg/ArmVirtKvmTool.fdf | 2 +- ArmVirtPkg/ArmVirtQemu.dsc | 2 +- ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 2 +- ArmVirtPkg/ArmVirtQemuKernel.dsc | 2 +- ArmVirtPkg/HighMemDxe/HighMemDxe.c | 128 ---------------------------------- ArmVirtPkg/HighMemDxe/HighMemDxe.inf | 45 ------------ OvmfPkg/Fdt/HighMemDxe/HighMemDxe.c | 128 ++++++++++++++++++++++++++++++++++ OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf | 44 ++++++++++++ 11 files changed, 179 insertions(+), 180 deletions(-) delete mode 100644 ArmVirtPkg/HighMemDxe/HighMemDxe.c delete mode 100644 ArmVirtPkg/HighMemDxe/HighMemDxe.inf create mode 100644 OvmfPkg/Fdt/HighMemDxe/HighMemDxe.c create mode 100644 OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf diff --git a/ArmVirtPkg/ArmVirtCloudHv.dsc b/ArmVirtPkg/ArmVirtCloudHv.dsc index 9ad88e981b..2b722917e3 100644 --- a/ArmVirtPkg/ArmVirtCloudHv.dsc +++ b/ArmVirtPkg/ArmVirtCloudHv.dsc @@ -295,7 +295,7 @@ # ArmVirtPkg/VirtioFdtDxe/VirtioFdtDxe.inf EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf - ArmVirtPkg/HighMemDxe/HighMemDxe.inf + OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioNetDxe/VirtioNet.inf diff --git a/ArmVirtPkg/ArmVirtCloudHv.fdf b/ArmVirtPkg/ArmVirtCloudHv.fdf index 1bb452ebb8..7ecf5ca88d 100644 --- a/ArmVirtPkg/ArmVirtCloudHv.fdf +++ b/ArmVirtPkg/ArmVirtCloudHv.fdf @@ -107,7 +107,7 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf INF ArmVirtPkg/VirtioFdtDxe/VirtioFdtDxe.inf INF EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf - INF ArmVirtPkg/HighMemDxe/HighMemDxe.inf + INF OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf # # PI DXE Drivers producing Architectural Protocols (EFI Services) diff --git a/ArmVirtPkg/ArmVirtKvmTool.dsc b/ArmVirtPkg/ArmVirtKvmTool.dsc index 3cc182545c..97fc98d778 100644 --- a/ArmVirtPkg/ArmVirtKvmTool.dsc +++ b/ArmVirtPkg/ArmVirtKvmTool.dsc @@ -293,7 +293,7 @@ ArmVirtPkg/KvmtoolPlatformDxe/KvmtoolPlatformDxe.inf ArmVirtPkg/VirtioFdtDxe/VirtioFdtDxe.inf EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf - ArmVirtPkg/HighMemDxe/HighMemDxe.inf + OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioNetDxe/VirtioNet.inf diff --git a/ArmVirtPkg/ArmVirtKvmTool.fdf b/ArmVirtPkg/ArmVirtKvmTool.fdf index 1dac8b7880..0535d36b7d 100644 --- a/ArmVirtPkg/ArmVirtKvmTool.fdf +++ b/ArmVirtPkg/ArmVirtKvmTool.fdf @@ -122,7 +122,7 @@ READ_LOCK_STATUS = TRUE INF ArmVirtPkg/VirtioFdtDxe/VirtioFdtDxe.inf INF EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf INF ArmVirtPkg/KvmtoolPlatformDxe/KvmtoolPlatformDxe.inf - INF ArmVirtPkg/HighMemDxe/HighMemDxe.inf + INF OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf # # PI DXE Drivers producing Architectural Protocols (EFI Services) diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 2f1a3cea05..86417f8797 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -407,7 +407,7 @@ # ArmVirtPkg/VirtioFdtDxe/VirtioFdtDxe.inf EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf - ArmVirtPkg/HighMemDxe/HighMemDxe.inf + OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioNetDxe/VirtioNet.inf diff --git a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc index e9518dd273..279b905edd 100644 --- a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc +++ b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc @@ -42,7 +42,7 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf INF ArmVirtPkg/VirtioFdtDxe/VirtioFdtDxe.inf INF EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf - INF ArmVirtPkg/HighMemDxe/HighMemDxe.inf + INF OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf # # PI DXE Drivers producing Architectural Protocols (EFI Services) diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index 3a0c3fb4f0..3fad481e29 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -342,7 +342,7 @@ # ArmVirtPkg/VirtioFdtDxe/VirtioFdtDxe.inf EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf - ArmVirtPkg/HighMemDxe/HighMemDxe.inf + OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioNetDxe/VirtioNet.inf diff --git a/ArmVirtPkg/HighMemDxe/HighMemDxe.c b/ArmVirtPkg/HighMemDxe/HighMemDxe.c deleted file mode 100644 index c383757364..0000000000 --- a/ArmVirtPkg/HighMemDxe/HighMemDxe.c +++ /dev/null @@ -1,128 +0,0 @@ -/** @file -* High memory node enumeration DXE driver for ARM Virtual Machines -* -* Copyright (c) 2015-2016, Linaro Ltd. All rights reserved. -* -* SPDX-License-Identifier: BSD-2-Clause-Patent -* -**/ - -#include -#include -#include -#include -#include - -#include -#include - -EFI_STATUS -EFIAPI -InitializeHighMemDxe ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - FDT_CLIENT_PROTOCOL *FdtClient; - EFI_CPU_ARCH_PROTOCOL *Cpu; - EFI_STATUS Status, FindNodeStatus; - INT32 Node; - CONST UINT32 *Reg; - UINT32 RegSize; - UINTN AddressCells, SizeCells; - UINT64 CurBase; - UINT64 CurSize; - UINT64 Attributes; - EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor; - - Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL, - (VOID **)&FdtClient); - ASSERT_EFI_ERROR (Status); - - Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, - (VOID **)&Cpu); - ASSERT_EFI_ERROR (Status); - - // - // Check for memory node and add the memory spaces except the lowest one - // - for (FindNodeStatus = FdtClient->FindMemoryNodeReg (FdtClient, &Node, - (CONST VOID **) &Reg, &AddressCells, - &SizeCells, &RegSize); - !EFI_ERROR (FindNodeStatus); - FindNodeStatus = FdtClient->FindNextMemoryNodeReg (FdtClient, Node, - &Node, (CONST VOID **) &Reg, &AddressCells, - &SizeCells, &RegSize)) { - ASSERT (AddressCells <= 2); - ASSERT (SizeCells <= 2); - - while (RegSize > 0) { - CurBase = SwapBytes32 (*Reg++); - if (AddressCells > 1) { - CurBase = (CurBase << 32) | SwapBytes32 (*Reg++); - } - CurSize = SwapBytes32 (*Reg++); - if (SizeCells > 1) { - CurSize = (CurSize << 32) | SwapBytes32 (*Reg++); - } - RegSize -= (AddressCells + SizeCells) * sizeof (UINT32); - - Status = gDS->GetMemorySpaceDescriptor (CurBase, &GcdDescriptor); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_WARN, - "%a: Region 0x%lx - 0x%lx not found in the GCD memory space map\n", - __FUNCTION__, CurBase, CurBase + CurSize - 1)); - continue; - } - if (GcdDescriptor.GcdMemoryType == EfiGcdMemoryTypeNonExistent) { - Status = gDS->AddMemorySpace (EfiGcdMemoryTypeSystemMemory, CurBase, - CurSize, EFI_MEMORY_WB); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, - "%a: Failed to add System RAM @ 0x%lx - 0x%lx (%r)\n", - __FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); - continue; - } - - Status = gDS->SetMemorySpaceAttributes (CurBase, CurSize, - EFI_MEMORY_WB); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_WARN, - "%a: gDS->SetMemorySpaceAttributes() failed on region 0x%lx - 0x%lx (%r)\n", - __FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); - } - - // - // Due to the ambiguous nature of the RO/XP GCD memory space attributes, - // it is impossible to add a memory space with the XP attribute in a way - // that does not result in the XP attribute being set on *all* UEFI - // memory map entries that are carved from it, including code regions - // that require executable permissions. - // - // So instead, we never set the RO/XP attributes in the GCD memory space - // capabilities or attribute fields, and apply any protections directly - // on the page table mappings by going through the cpu arch protocol. - // - Attributes = EFI_MEMORY_WB; - if ((PcdGet64 (PcdDxeNxMemoryProtectionPolicy) & - (1U << (UINT32)EfiConventionalMemory)) != 0) { - Attributes |= EFI_MEMORY_XP; - } - - Status = Cpu->SetMemoryAttributes (Cpu, CurBase, CurSize, Attributes); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, - "%a: Failed to set System RAM @ 0x%lx - 0x%lx attribute (%r)\n", - __FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); - } else { - DEBUG ((EFI_D_INFO, "%a: Add System RAM @ 0x%lx - 0x%lx\n", - __FUNCTION__, CurBase, CurBase + CurSize - 1)); - } - } - } - } - - return EFI_SUCCESS; -} diff --git a/ArmVirtPkg/HighMemDxe/HighMemDxe.inf b/ArmVirtPkg/HighMemDxe/HighMemDxe.inf deleted file mode 100644 index 168fc90d2a..0000000000 --- a/ArmVirtPkg/HighMemDxe/HighMemDxe.inf +++ /dev/null @@ -1,45 +0,0 @@ -## @file -# High memory node enumeration DXE driver for ARM Virtual Machines -# -# Copyright (c) 2015-2016, Linaro Ltd. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = HighMemDxe - FILE_GUID = 63EA1463-FBFA-428A-B97F-E222755852D7 - MODULE_TYPE = DXE_DRIVER - VERSION_STRING = 1.0 - - ENTRY_POINT = InitializeHighMemDxe - -[Sources] - HighMemDxe.c - -[Packages] - EmbeddedPkg/EmbeddedPkg.dec - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - ArmPkg/ArmPkg.dec - ArmVirtPkg/ArmVirtPkg.dec - -[LibraryClasses] - BaseLib - DebugLib - DxeServicesTableLib - PcdLib - UefiBootServicesTableLib - UefiDriverEntryPoint - -[Protocols] - gEfiCpuArchProtocolGuid ## CONSUMES - gFdtClientProtocolGuid ## CONSUMES - -[Pcd] - gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy - -[Depex] - gEfiCpuArchProtocolGuid AND gFdtClientProtocolGuid diff --git a/OvmfPkg/Fdt/HighMemDxe/HighMemDxe.c b/OvmfPkg/Fdt/HighMemDxe/HighMemDxe.c new file mode 100644 index 0000000000..c383757364 --- /dev/null +++ b/OvmfPkg/Fdt/HighMemDxe/HighMemDxe.c @@ -0,0 +1,128 @@ +/** @file +* High memory node enumeration DXE driver for ARM Virtual Machines +* +* Copyright (c) 2015-2016, Linaro Ltd. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ + +#include +#include +#include +#include +#include + +#include +#include + +EFI_STATUS +EFIAPI +InitializeHighMemDxe ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + FDT_CLIENT_PROTOCOL *FdtClient; + EFI_CPU_ARCH_PROTOCOL *Cpu; + EFI_STATUS Status, FindNodeStatus; + INT32 Node; + CONST UINT32 *Reg; + UINT32 RegSize; + UINTN AddressCells, SizeCells; + UINT64 CurBase; + UINT64 CurSize; + UINT64 Attributes; + EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor; + + Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL, + (VOID **)&FdtClient); + ASSERT_EFI_ERROR (Status); + + Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, + (VOID **)&Cpu); + ASSERT_EFI_ERROR (Status); + + // + // Check for memory node and add the memory spaces except the lowest one + // + for (FindNodeStatus = FdtClient->FindMemoryNodeReg (FdtClient, &Node, + (CONST VOID **) &Reg, &AddressCells, + &SizeCells, &RegSize); + !EFI_ERROR (FindNodeStatus); + FindNodeStatus = FdtClient->FindNextMemoryNodeReg (FdtClient, Node, + &Node, (CONST VOID **) &Reg, &AddressCells, + &SizeCells, &RegSize)) { + ASSERT (AddressCells <= 2); + ASSERT (SizeCells <= 2); + + while (RegSize > 0) { + CurBase = SwapBytes32 (*Reg++); + if (AddressCells > 1) { + CurBase = (CurBase << 32) | SwapBytes32 (*Reg++); + } + CurSize = SwapBytes32 (*Reg++); + if (SizeCells > 1) { + CurSize = (CurSize << 32) | SwapBytes32 (*Reg++); + } + RegSize -= (AddressCells + SizeCells) * sizeof (UINT32); + + Status = gDS->GetMemorySpaceDescriptor (CurBase, &GcdDescriptor); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, + "%a: Region 0x%lx - 0x%lx not found in the GCD memory space map\n", + __FUNCTION__, CurBase, CurBase + CurSize - 1)); + continue; + } + if (GcdDescriptor.GcdMemoryType == EfiGcdMemoryTypeNonExistent) { + Status = gDS->AddMemorySpace (EfiGcdMemoryTypeSystemMemory, CurBase, + CurSize, EFI_MEMORY_WB); + + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, + "%a: Failed to add System RAM @ 0x%lx - 0x%lx (%r)\n", + __FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); + continue; + } + + Status = gDS->SetMemorySpaceAttributes (CurBase, CurSize, + EFI_MEMORY_WB); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, + "%a: gDS->SetMemorySpaceAttributes() failed on region 0x%lx - 0x%lx (%r)\n", + __FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); + } + + // + // Due to the ambiguous nature of the RO/XP GCD memory space attributes, + // it is impossible to add a memory space with the XP attribute in a way + // that does not result in the XP attribute being set on *all* UEFI + // memory map entries that are carved from it, including code regions + // that require executable permissions. + // + // So instead, we never set the RO/XP attributes in the GCD memory space + // capabilities or attribute fields, and apply any protections directly + // on the page table mappings by going through the cpu arch protocol. + // + Attributes = EFI_MEMORY_WB; + if ((PcdGet64 (PcdDxeNxMemoryProtectionPolicy) & + (1U << (UINT32)EfiConventionalMemory)) != 0) { + Attributes |= EFI_MEMORY_XP; + } + + Status = Cpu->SetMemoryAttributes (Cpu, CurBase, CurSize, Attributes); + + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, + "%a: Failed to set System RAM @ 0x%lx - 0x%lx attribute (%r)\n", + __FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); + } else { + DEBUG ((EFI_D_INFO, "%a: Add System RAM @ 0x%lx - 0x%lx\n", + __FUNCTION__, CurBase, CurBase + CurSize - 1)); + } + } + } + } + + return EFI_SUCCESS; +} diff --git a/OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf b/OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf new file mode 100644 index 0000000000..45779a2d59 --- /dev/null +++ b/OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf @@ -0,0 +1,44 @@ +## @file +# High memory node enumeration DXE driver for ARM Virtual Machines +# +# Copyright (c) 2015-2016, Linaro Ltd. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = HighMemDxe + FILE_GUID = 63EA1463-FBFA-428A-B97F-E222755852D7 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + + ENTRY_POINT = InitializeHighMemDxe + +[Sources] + HighMemDxe.c + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + DxeServicesTableLib + PcdLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Protocols] + gEfiCpuArchProtocolGuid ## CONSUMES + gFdtClientProtocolGuid ## CONSUMES + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy + +[Depex] + gEfiCpuArchProtocolGuid AND gFdtClientProtocolGuid -- cgit v1.2.3