]> git.proxmox.com Git - mirror_edk2.git/blob - ArmVirtPkg/Library/KvmtoolVirtMemInfoLib/KvmtoolVirtMemInfoLib.c
63bb81ef91ce0d16b604f5606a6a340647b706ad
[mirror_edk2.git] / ArmVirtPkg / Library / KvmtoolVirtMemInfoLib / KvmtoolVirtMemInfoLib.c
1 /** @file
2 Kvmtool virtual memory map library.
3
4 Copyright (c) 2018 - 2020, ARM Limited. All rights reserved.
5
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8 **/
9
10 #include <Base.h>
11 #include <Library/ArmLib.h>
12 #include <Library/BaseLib.h>
13 #include <Library/BaseMemoryLib.h>
14 #include <Library/DebugLib.h>
15 #include <Library/MemoryAllocationLib.h>
16
17 // Number of Virtual Memory Map Descriptors
18 #define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 5
19
20 /**
21 Return the Virtual Memory Map of your platform
22
23 This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU
24 on your platform.
25
26 @param[out] VirtualMemoryMap Array of ARM_MEMORY_REGION_DESCRIPTOR
27 describing a Physical-to-Virtual Memory
28 mapping. This array must be ended by a
29 zero-filled entry. The allocated memory
30 will not be freed.
31
32 **/
33 VOID
34 ArmVirtGetMemoryMap (
35 OUT ARM_MEMORY_REGION_DESCRIPTOR **VirtualMemoryMap
36 )
37 {
38 ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable;
39 UINTN Idx;
40 EFI_PHYSICAL_ADDRESS TopOfAddressSpace;
41
42 ASSERT (VirtualMemoryMap != NULL);
43
44 TopOfAddressSpace = LShiftU64 (1ULL, ArmGetPhysicalAddressBits ());
45
46 VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR*)
47 AllocatePages (
48 EFI_SIZE_TO_PAGES (
49 sizeof (ARM_MEMORY_REGION_DESCRIPTOR) *
50 MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS
51 )
52 );
53 if (VirtualMemoryTable == NULL) {
54 DEBUG ((
55 DEBUG_ERROR,
56 "%a: Error: Failed to Allocate Pages\n",
57 __FUNCTION__
58 ));
59 return;
60 }
61
62 Idx = 0;
63 // System DRAM
64 VirtualMemoryTable[Idx].PhysicalBase = PcdGet64 (PcdSystemMemoryBase);
65 VirtualMemoryTable[Idx].VirtualBase = VirtualMemoryTable[Idx].PhysicalBase;
66 VirtualMemoryTable[Idx].Length = PcdGet64 (PcdSystemMemorySize);
67 VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
68
69 // Peripheral space before DRAM
70 VirtualMemoryTable[++Idx].PhysicalBase = 0x0;
71 VirtualMemoryTable[Idx].VirtualBase = 0x0;
72 VirtualMemoryTable[Idx].Length = PcdGet64 (PcdSystemMemoryBase);
73 VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
74
75 // Peripheral space after DRAM
76 VirtualMemoryTable[++Idx].PhysicalBase = PcdGet64 (PcdSystemMemoryBase) +
77 PcdGet64 (PcdSystemMemorySize);
78 VirtualMemoryTable[Idx].VirtualBase = VirtualMemoryTable[Idx].PhysicalBase;
79 VirtualMemoryTable[Idx].Length = TopOfAddressSpace -
80 VirtualMemoryTable[Idx].PhysicalBase;
81 VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
82
83 // Map the FV region as normal executable memory
84 VirtualMemoryTable[++Idx].PhysicalBase = PcdGet64 (PcdFvBaseAddress);
85 VirtualMemoryTable[Idx].VirtualBase = VirtualMemoryTable[Idx].PhysicalBase;
86 VirtualMemoryTable[Idx].Length = FixedPcdGet32 (PcdFvSize);
87 VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
88
89 // End of Table
90 VirtualMemoryTable[++Idx].PhysicalBase = 0;
91 VirtualMemoryTable[Idx].VirtualBase = 0;
92 VirtualMemoryTable[Idx].Length = 0;
93 VirtualMemoryTable[Idx].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)0;
94
95 ASSERT((Idx + 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
96
97 *VirtualMemoryMap = VirtualMemoryTable;
98 }