/** @file Kvmtool virtual memory map library. Copyright (c) 2018 - 2020, ARM Limited. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include // 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; }