This updates ArmVirtualizationMemoryInitPeiLib so that the PEI memory region, i.e., the region that is used both before and after the MMU and caches are enabled, is invalidated by virtual address before enabling the MMU. This prevents issues where data we modified with the caches and MMU off may be shadowed by clean cachelines in system caches or in lower level caches on other CPUs, resulting in the this data to become invisible once we turn the MMU and caches on. Contributed-under: TianoCore Contribution Agreement 1.0 Reviewed-by: Olivier Martin <Olivier.Martin@arm.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17177 6f19259b-4bc3-4df7-8a09-765794883524
102 lines
3.2 KiB
C
102 lines
3.2 KiB
C
/** @file
|
|
*
|
|
* Copyright (c) 2011-2014, ARM Limited. All rights reserved.
|
|
* Copyright (c) 2014, Linaro Limited. 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 <PiPei.h>
|
|
|
|
#include <Library/ArmPlatformLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/HobLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Library/CacheMaintenanceLib.h>
|
|
|
|
VOID
|
|
BuildMemoryTypeInformationHob (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
InitMmu (
|
|
VOID
|
|
)
|
|
{
|
|
ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable;
|
|
VOID *TranslationTableBase;
|
|
UINTN TranslationTableSize;
|
|
RETURN_STATUS Status;
|
|
|
|
// Get Virtual Memory Map from the Platform Library
|
|
ArmPlatformGetVirtualMemoryMap (&MemoryTable);
|
|
|
|
//Note: Because we called PeiServicesInstallPeiMemory() before to call InitMmu() the MMU Page Table resides in
|
|
// DRAM (even at the top of DRAM as it is the first permanent memory allocation)
|
|
Status = ArmConfigureMmu (MemoryTable, &TranslationTableBase, &TranslationTableSize);
|
|
if (EFI_ERROR (Status)) {
|
|
DEBUG ((EFI_D_ERROR, "Error: Failed to enable MMU\n"));
|
|
}
|
|
}
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
MemoryPeim (
|
|
IN EFI_PHYSICAL_ADDRESS UefiMemoryBase,
|
|
IN UINT64 UefiMemorySize
|
|
)
|
|
{
|
|
EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttributes;
|
|
|
|
// Ensure PcdSystemMemorySize has been set
|
|
ASSERT (PcdGet64 (PcdSystemMemorySize) != 0);
|
|
|
|
//
|
|
// Now, the permanent memory has been installed, we can call AllocatePages()
|
|
//
|
|
ResourceAttributes = (
|
|
EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
|
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
|
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
|
|
EFI_RESOURCE_ATTRIBUTE_TESTED
|
|
);
|
|
|
|
BuildResourceDescriptorHob (
|
|
EFI_RESOURCE_SYSTEM_MEMORY,
|
|
ResourceAttributes,
|
|
PcdGet64 (PcdSystemMemoryBase),
|
|
PcdGet64 (PcdSystemMemorySize)
|
|
);
|
|
|
|
//
|
|
// When running under virtualization, the PI/UEFI memory region may be
|
|
// clean but not invalidated in system caches or in lower level caches
|
|
// on other CPUs. So invalidate the region by virtual address, to ensure
|
|
// that the contents we put there with the caches and MMU off will still
|
|
// be visible after turning them on.
|
|
//
|
|
InvalidateDataCacheRange ((VOID*)(UINTN)UefiMemoryBase, UefiMemorySize);
|
|
|
|
// Build Memory Allocation Hob
|
|
InitMmu ();
|
|
|
|
if (FeaturePcdGet (PcdPrePiProduceMemoryTypeInformationHob)) {
|
|
// Optional feature that helps prevent EFI memory map fragmentation.
|
|
BuildMemoryTypeInformationHob ();
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|