1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- /** @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",
- __FUNCTION__
- ));
- 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;
- }
|