2 Kvmtool virtual memory map library.
4 Copyright (c) 2018 - 2020, ARM Limited. All rights reserved.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
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>
17 // Number of Virtual Memory Map Descriptors
18 #define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 5
21 Return the Virtual Memory Map of your platform
23 This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU
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
35 OUT ARM_MEMORY_REGION_DESCRIPTOR
**VirtualMemoryMap
38 ARM_MEMORY_REGION_DESCRIPTOR
*VirtualMemoryTable
;
40 EFI_PHYSICAL_ADDRESS TopOfAddressSpace
;
42 ASSERT (VirtualMemoryMap
!= NULL
);
44 TopOfAddressSpace
= LShiftU64 (1ULL, ArmGetPhysicalAddressBits ());
46 VirtualMemoryTable
= (ARM_MEMORY_REGION_DESCRIPTOR
*)
49 sizeof (ARM_MEMORY_REGION_DESCRIPTOR
) *
50 MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS
53 if (VirtualMemoryTable
== NULL
) {
56 "%a: Error: Failed to Allocate Pages\n",
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
;
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
;
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
;
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
;
90 VirtualMemoryTable
[++Idx
].PhysicalBase
= 0;
91 VirtualMemoryTable
[Idx
].VirtualBase
= 0;
92 VirtualMemoryTable
[Idx
].Length
= 0;
93 VirtualMemoryTable
[Idx
].Attributes
= (ARM_MEMORY_REGION_ATTRIBUTES
)0;
95 ASSERT ((Idx
+ 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS
);
97 *VirtualMemoryMap
= VirtualMemoryTable
;