KvmtoolVirtMemInfoLib.c 3.6 KB

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