| /** @file | |
| Kvmtool virtual memory map library. | |
| Copyright (c) 2018 - 2020, ARM Limited. All rights reserved. | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <Base.h> | |
| #include <Library/ArmLib.h> | |
| #include <Library/BaseLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/MemoryAllocationLib.h> | |
| // Number of Virtual Memory Map Descriptors | |
| #define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 5 | |
| /** | |
| Return the Virtual Memory Map of your platform | |
| This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU | |
| on your platform. | |
| @param[out] VirtualMemoryMap Array of ARM_MEMORY_REGION_DESCRIPTOR | |
| describing a Physical-to-Virtual Memory | |
| mapping. This array must be ended by a | |
| zero-filled entry. The allocated memory | |
| will not be freed. | |
| **/ | |
| VOID | |
| ArmVirtGetMemoryMap ( | |
| OUT ARM_MEMORY_REGION_DESCRIPTOR **VirtualMemoryMap | |
| ) | |
| { | |
| ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable; | |
| UINTN Idx; | |
| EFI_PHYSICAL_ADDRESS TopOfAddressSpace; | |
| ASSERT (VirtualMemoryMap != NULL); | |
| TopOfAddressSpace = LShiftU64 (1ULL, ArmGetPhysicalAddressBits ()); | |
| VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR *) | |
| AllocatePages ( | |
| EFI_SIZE_TO_PAGES ( | |
| sizeof (ARM_MEMORY_REGION_DESCRIPTOR) * | |
| MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS | |
| ) | |
| ); | |
| if (VirtualMemoryTable == NULL) { | |
| DEBUG (( | |
| DEBUG_ERROR, | |
| "%a: Error: Failed to Allocate Pages\n", | |
| __func__ | |
| )); | |
| return; | |
| } | |
| Idx = 0; | |
| // System DRAM | |
| VirtualMemoryTable[Idx].PhysicalBase = PcdGet64 (PcdSystemMemoryBase); | |
| VirtualMemoryTable[Idx].VirtualBase = VirtualMemoryTable[Idx].PhysicalBase; | |
| VirtualMemoryTable[Idx].Length = PcdGet64 (PcdSystemMemorySize); | |
| VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; | |
| // Peripheral space before DRAM | |
| VirtualMemoryTable[++Idx].PhysicalBase = 0x0; | |
| VirtualMemoryTable[Idx].VirtualBase = 0x0; | |
| VirtualMemoryTable[Idx].Length = PcdGet64 (PcdSystemMemoryBase); | |
| VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; | |
| // Peripheral space after DRAM | |
| VirtualMemoryTable[++Idx].PhysicalBase = PcdGet64 (PcdSystemMemoryBase) + | |
| PcdGet64 (PcdSystemMemorySize); | |
| VirtualMemoryTable[Idx].VirtualBase = VirtualMemoryTable[Idx].PhysicalBase; | |
| VirtualMemoryTable[Idx].Length = TopOfAddressSpace - | |
| VirtualMemoryTable[Idx].PhysicalBase; | |
| VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; | |
| // Map the FV region as normal executable memory | |
| VirtualMemoryTable[++Idx].PhysicalBase = PcdGet64 (PcdFvBaseAddress); | |
| VirtualMemoryTable[Idx].VirtualBase = VirtualMemoryTable[Idx].PhysicalBase; | |
| VirtualMemoryTable[Idx].Length = FixedPcdGet32 (PcdFvSize); | |
| VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; | |
| // End of Table | |
| VirtualMemoryTable[++Idx].PhysicalBase = 0; | |
| VirtualMemoryTable[Idx].VirtualBase = 0; | |
| VirtualMemoryTable[Idx].Length = 0; | |
| VirtualMemoryTable[Idx].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)0; | |
| ASSERT ((Idx + 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS); | |
| *VirtualMemoryMap = VirtualMemoryTable; | |
| } |