Index: trunk/include/VBox/platforms/vbox-armv8.h
===================================================================
--- trunk/include/VBox/platforms/vbox-armv8.h	(revision 102513)
+++ trunk/include/VBox/platforms/vbox-armv8.h	(revision 102514)
@@ -78,6 +78,10 @@
     /** Size of the MMIO region in bytes, 0 if not available. */
     uint64_t                    cbMmio;
+    /** Offset backwards to the start of the MMIO32 region from the start of this descriptor, 0 if not available. */
+    uint64_t                    u64OffBackMmio32;
+    /** Size of the MMIO32 region in bytes, 0 if not available. */
+    uint64_t                    cbMmio32;
     /** Padding to 64KiB. */
-    uint8_t                     abPadding[_64K - 4 * sizeof(uint32_t) - 10 * sizeof(uint64_t)];
+    uint8_t                     abPadding[_64K - 4 * sizeof(uint32_t) - 12 * sizeof(uint64_t)];
 } VBOXPLATFORMARMV8;
 AssertCompileSize(VBOXPLATFORMARMV8, _64K);
Index: trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/Include/Library/VBoxArmPlatformLib.h
===================================================================
--- trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/Include/Library/VBoxArmPlatformLib.h	(revision 102513)
+++ trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/Include/Library/VBoxArmPlatformLib.h	(revision 102514)
@@ -127,4 +127,20 @@
 UINTN EFIAPI VBoxArmPlatformMmioSizeGet(VOID);
 
+
+/**
+ * Returns the physical address of the start of the MMIO32 region.
+ *
+ * @returns Physical address of the MMIO32 region start.
+ */
+EFI_PHYSICAL_ADDRESS EFIAPI VBoxArmPlatformMmio32StartGetPhysAddr(VOID);
+
+
+/**
+ * Returns the size of the MMIO32 region.
+ *
+ * @returns Size of the MMIO32 region.
+ */
+UINTN EFIAPI VBoxArmPlatformMmio32SizeGet(VOID);
+
 #endif
 
Index: trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxArmPlatformLib/VBoxArmPlatformLib.c
===================================================================
--- trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxArmPlatformLib/VBoxArmPlatformLib.c	(revision 102513)
+++ trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxArmPlatformLib/VBoxArmPlatformLib.c	(revision 102514)
@@ -148,2 +148,23 @@
     return pDesc->cbMmio;
 }
+
+
+EFI_PHYSICAL_ADDRESS EFIAPI VBoxArmPlatformMmio32StartGetPhysAddr(VOID)
+{
+    PCVBOXPLATFORMARMV8 pDesc = (PCVBOXPLATFORMARMV8)VBoxArmPlatformDescGet();
+    ASSERT(pDesc->u32Magic == VBOXPLATFORMARMV8_MAGIC);
+
+    if (!pDesc->cbMmio)
+        return 0;
+
+    return (EFI_PHYSICAL_ADDRESS)((UINTN)pDesc - pDesc->u64OffBackMmio32);
+}
+
+
+UINTN EFIAPI VBoxArmPlatformMmio32SizeGet(VOID)
+{
+    PCVBOXPLATFORMARMV8 pDesc = (PCVBOXPLATFORMARMV8)VBoxArmPlatformDescGet();
+    ASSERT(pDesc->u32Magic == VBOXPLATFORMARMV8_MAGIC);
+
+    return pDesc->cbMmio32;
+}
Index: trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxVirtMemInfoLib/VBoxVirtMemInfoLib.c
===================================================================
--- trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxVirtMemInfoLib/VBoxVirtMemInfoLib.c	(revision 102513)
+++ trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxVirtMemInfoLib/VBoxVirtMemInfoLib.c	(revision 102514)
@@ -46,5 +46,5 @@
 
 // Number of Virtual Memory Map Descriptors
-#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS  6
+#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS  7
 
 /**
@@ -126,5 +126,5 @@
   VirtualMemoryTable[3].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_RO;
 
-  // Map the VBox descriptor region readonnly.
+  // Map the VBox descriptor region readonly.
   VirtualMemoryTable[4].PhysicalBase = VBoxArmPlatformDescGetPhysAddr();
   VirtualMemoryTable[4].VirtualBase  = VirtualMemoryTable[4].PhysicalBase;
@@ -132,6 +132,15 @@
   VirtualMemoryTable[4].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_RO;
 
+  // Map the MMIO32 region if it exists.
+  if (VBoxArmPlatformMmio32SizeGet() != 0)
+  {
+    VirtualMemoryTable[5].PhysicalBase = VBoxArmPlatformMmio32StartGetPhysAddr();
+    VirtualMemoryTable[5].VirtualBase  = VirtualMemoryTable[5].PhysicalBase;
+    VirtualMemoryTable[5].Length       = VBoxArmPlatformMmio32SizeGet();
+    VirtualMemoryTable[5].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+  }
+
   // End of Table
-  ZeroMem (&VirtualMemoryTable[5], sizeof (ARM_MEMORY_REGION_DESCRIPTOR));
+  ZeroMem (&VirtualMemoryTable[6], sizeof (ARM_MEMORY_REGION_DESCRIPTOR));
 
   for (UINTN i = 0; i < MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS; i++)
