public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Michael D Kinney" <michael.d.kinney@intel.com>
To: devel@edk2.groups.io
Cc: Leif Lindholm <leif.lindholm@linaro.org>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>
Subject: [edk2-platforms: Patch 2/8] Platform/BeagleBoard: Import BeagleBoardPkg from edk2
Date: Thu,  9 May 2019 20:34:29 -0700	[thread overview]
Message-ID: <20190510033435.24112-3-michael.d.kinney@intel.com> (raw)
In-Reply-To: <20190510033435.24112-1-michael.d.kinney@intel.com>

https://bugzilla.tianocore.org/show_bug.cgi?id=1467

Import BeagleBoardPkg from edk2/master.

Cc: Leif Lindholm <leif.lindholm@linaro.org>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
 .../BeagleBoardPkg/BeagleBoardPkg.dec         |  30 ++
 .../BeagleBoardPkg/BeagleBoardPkg.dsc         | 496 ++++++++++++++++++
 .../BeagleBoardPkg/BeagleBoardPkg.fdf         | 308 +++++++++++
 .../BeagleBoardPkg/ConfigurationHeader.bin    | Bin 0 -> 512 bytes
 .../BeagleBoardPkg/ConfigurationHeader.dat    |  41 ++
 .../Debugger_scripts/rvi_boot_from_ram.inc    |  15 +
 .../Debugger_scripts/rvi_convert_symbols.sh   |  17 +
 .../Debugger_scripts/rvi_dummy.axf            | Bin 0 -> 7984 bytes
 .../Debugger_scripts/rvi_hw_setup.inc         |  61 +++
 .../Debugger_scripts/rvi_load_symbols.inc     |  17 +
 .../Debugger_scripts/rvi_symbols_macros.inc   | 188 +++++++
 .../Debugger_scripts/rvi_unload_symbols.inc   | 112 ++++
 .../Debugger_scripts/trace32_load_symbols.cmm | 205 ++++++++
 .../trace32_load_symbols_cygwin.cmm           | 182 +++++++
 .../BeagleBoardPkg/Include/BeagleBoard.h      | 173 ++++++
 .../Library/BeagleBoardLib/BeagleBoard.c      | 115 ++++
 .../BeagleBoardLib/BeagleBoardHelper.S        |  41 ++
 .../BeagleBoardLib/BeagleBoardHelper.asm      |  47 ++
 .../Library/BeagleBoardLib/BeagleBoardLib.inf |  48 ++
 .../Library/BeagleBoardLib/BeagleBoardMem.c   |  74 +++
 .../Library/BeagleBoardLib/Clock.c            |  63 +++
 .../Library/BeagleBoardLib/PadConfiguration.c | 316 +++++++++++
 .../Library/DxeHobPeCoffLib/DxeHobPeCoff.c    | 282 ++++++++++
 .../DxeHobPeCoffLib/DxeHobPeCoffLib.inf       |  39 ++
 .../LzmaHobCustomDecompressLib.c              |  44 ++
 .../LzmaHobCustomDecompressLib.inf            |  45 ++
 .../MemoryInitPeiLib/MemoryInitPeiLib.c       | 192 +++++++
 .../MemoryInitPeiLib/MemoryInitPeiLib.inf     |  58 ++
 .../Library/ResetSystemLib/ResetSystemLib.c   | 149 ++++++
 .../Library/ResetSystemLib/ResetSystemLib.inf |  37 ++
 .../BeagleBoardPkg/PrePi/Arm/ArchPrePi.c      |  23 +
 .../PrePi/Arm/ModuleEntryPoint.S              | 124 +++++
 .../PrePi/Arm/ModuleEntryPoint.asm            | 142 +++++
 .../BeagleBoardPkg/PrePi/LzmaDecompress.h     |  97 ++++
 .../BeagleBoardPkg/PrePi/MainUniCore.c        |  33 ++
 .../BeagleBoardPkg/PrePi/PeiUniCore.inf       |  97 ++++
 .../BeagleBoard/BeagleBoardPkg/PrePi/PrePi.c  | 179 +++++++
 .../BeagleBoard/BeagleBoardPkg/PrePi/PrePi.h  |  90 ++++
 .../BeagleBoardPkg/Tools/GNUmakefile          |  14 +
 .../BeagleBoardPkg/Tools/generate_image.c     | 402 ++++++++++++++
 .../BeagleBoard/BeagleBoardPkg/Tools/makefile |  16 +
 .../BeagleBoardPkg/Tools/replace.c            | 140 +++++
 42 files changed, 4752 insertions(+)
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.dec
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.dsc
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.fdf
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/ConfigurationHeader.bin
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/ConfigurationHeader.dat
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_boot_from_ram.inc
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_convert_symbols.sh
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_dummy.axf
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_hw_setup.inc
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_load_symbols.inc
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_symbols_macros.inc
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_unload_symbols.inc
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/trace32_load_symbols.cmm
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/trace32_load_symbols_cygwin.cmm
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Include/BeagleBoard.h
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoard.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.S
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.asm
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardLib.inf
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardMem.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/Clock.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/PadConfiguration.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.inf
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ArchPrePi.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ModuleEntryPoint.S
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ModuleEntryPoint.asm
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/PrePi/LzmaDecompress.h
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/PrePi/MainUniCore.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/PrePi/PeiUniCore.inf
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/PrePi/PrePi.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/PrePi/PrePi.h
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Tools/GNUmakefile
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Tools/generate_image.c
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Tools/makefile
 create mode 100644 Platform/BeagleBoard/BeagleBoardPkg/Tools/replace.c

diff --git a/Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.dec b/Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.dec
new file mode 100644
index 0000000000..a82f8756b5
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.dec
@@ -0,0 +1,30 @@
+#/** @file
+# Beagle board package.
+#
+# Copyright (c) 2009, Apple Inc. All rights reserved.<BR>
+#
+#    SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#**/
+
+[Defines]
+  DEC_SPECIFICATION              = 0x00010005
+  PACKAGE_NAME                   = BeagleBoardPkg
+  PACKAGE_GUID                   = 6eba6648-d853-4eb3-9761-528b82d5ab04
+  PACKAGE_VERSION                = 0.1
+
+################################################################################
+#
+# Include Section - list of Include Paths that are provided by this package.
+#                   Comments are used for Keywords and Module Types.
+#
+# Supported Module Types:
+#  BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER DXE_SAL_DRIVER UEFI_DRIVER UEFI_APPLICATION
+#
+################################################################################
+[Includes.common]
+  Include                        # Root include for the package
+
+[Guids.common]
+  gBeagleBoardTokenSpaceGuid    =  { 0x6834fe45, 0x4aee, 0x4fc6, { 0xbc, 0xb5, 0xff, 0x45, 0xb7, 0xa8, 0x71, 0xe2 } }
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.dsc b/Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.dsc
new file mode 100644
index 0000000000..2d5d6f9977
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.dsc
@@ -0,0 +1,496 @@
+#/** @file
+# Beagle board package.
+#
+# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
+# Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
+#
+#    SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#**/
+
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+  PLATFORM_NAME                  = BeagleBoardPkg
+  PLATFORM_GUID                  = 91fa6c28-33df-46ac-aee6-292d6811ea31
+  PLATFORM_VERSION               = 0.1
+  DSC_SPECIFICATION              = 0x00010005
+  OUTPUT_DIRECTORY               = Build/BeagleBoard
+  SUPPORTED_ARCHITECTURES        = ARM
+  BUILD_TARGETS                  = DEBUG|RELEASE
+  SKUID_IDENTIFIER               = DEFAULT
+  FLASH_DEFINITION               = BeagleBoardPkg/BeagleBoardPkg.fdf
+
+
+[LibraryClasses.common]
+  ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
+  ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf
+  ArmPlatformLib|BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardLib.inf
+  ArmPlatformStackLib|ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf
+  ArmSmcLib|ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
+
+  HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
+  UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
+
+!if $(TARGET) == RELEASE
+  DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
+!else
+  DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
+!endif
+  DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
+
+  MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+
+  BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
+  BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+
+  ResetSystemLib|BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.inf
+
+  PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
+  PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
+  PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
+
+  # These libraries are used by the dynamic EFI Shell commands
+  ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
+  FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+  SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
+
+  PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
+
+  #
+  # Uncomment (and comment out the next line) For RealView Debugger. The Standard IO window
+  # in the debugger will show load and unload commands for symbols. You can cut and paste this
+  # into the command window to load symbols. We should be able to use a script to do this, but
+  # the version of RVD I have does not support scipts accessing system memory.
+  #
+#  PeCoffExtraActionLib|ArmPkg/Library/RvdPeCoffExtraActionLib/RvdPeCoffExtraActionLib.inf
+  PeCoffExtraActionLib|ArmPkg/Library/DebugPeCoffExtraActionLib/DebugPeCoffExtraActionLib.inf
+#  PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
+
+
+  CacheMaintenanceLib|ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf
+  DefaultExceptionHandlerLib|ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandlerLib.inf
+  CpuExceptionHandlerLib|ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf
+  PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf
+
+  SerialPortLib|Omap35xxPkg/Library/SerialPortLib/SerialPortLib.inf
+  SemihostLib|ArmPkg/Library/SemihostLib/SemihostLib.inf
+
+  RealTimeClockLib|Omap35xxPkg/Library/RealTimeClockLib/RealTimeClockLib.inf
+
+  IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
+
+  MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+  UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
+  HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+  UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
+  DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
+  UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
+
+  DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
+  UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
+  UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
+
+#
+# Assume everything is fixed at build
+#
+  PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+
+  UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
+
+  UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
+
+  CpuLib|MdePkg/Library/BaseCpuLib/BaseCpuLib.inf
+
+  TimerLib|Omap35xxPkg/Library/Omap35xxTimerLib/Omap35xxTimerLib.inf
+  OmapLib|Omap35xxPkg/Library/OmapLib/OmapLib.inf
+  OmapDmaLib|Omap35xxPkg/Library/OmapDmaLib/OmapDmaLib.inf
+  DebugAgentTimerLib|Omap35xxPkg/Library/DebugAgentTimerLib/DebugAgentTimerLib.inf
+
+  GdbSerialLib|Omap35xxPkg/Library/GdbSerialLib/GdbSerialLib.inf
+  ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf
+  DebugAgentLib|MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf
+  DmaLib|EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf
+
+  NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
+  FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf
+
+  UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
+  PlatformBootManagerLib|ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+  BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
+  CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
+
+  # UiApp dependencies
+  ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
+  FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
+  DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+
+  CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
+
+  SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
+  AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
+  TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
+  VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
+
+  UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.inf
+
+[LibraryClasses.common.SEC]
+  PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+  ReportStatusCodeLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
+  ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf
+
+  PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
+
+  HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf
+  PrePiHobListPointerLib|ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf
+  MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf
+  PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
+  PlatformPeiLib|ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf
+  MemoryInitPeiLib|BeagleBoardPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf
+
+  # 1/123 faster than Stm or Vstm version
+  BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+
+[LibraryClasses.common.PEI_CORE]
+  PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+  ReportStatusCodeLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
+
+[LibraryClasses.common.DXE_CORE]
+  HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
+  MemoryAllocationLib|MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf
+  DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
+  ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+  ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
+  DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+#  PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
+  PeCoffLib|BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
+
+  PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf
+
+
+[LibraryClasses.common.DXE_DRIVER]
+  ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+  DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+  SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf
+  PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
+  NonDiscoverableDeviceRegistrationLib|MdeModulePkg/Library/NonDiscoverableDeviceRegistrationLib/NonDiscoverableDeviceRegistrationLib.inf
+
+[LibraryClasses.common.UEFI_APPLICATION]
+  ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+  PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
+  HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
+
+[LibraryClasses.common.UEFI_DRIVER]
+  ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+  ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
+  PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
+  DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+
+[LibraryClasses.common.DXE_RUNTIME_DRIVER]
+  HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+  MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+  ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+  CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
+#  PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
+  PeCoffLib|BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
+
+
+[LibraryClasses.ARM]
+  #
+  # It is not possible to prevent the ARM compiler for generic intrinsic functions.
+  # This library provides the instrinsic functions generate by a given compiler.
+  # [LibraryClasses.ARM] and NULL mean link this library into all ARM images.
+  #
+  NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
+
+  # Add support for GCC stack protector
+  NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
+
+[BuildOptions]
+  XCODE:*_*_ARM_PLATFORM_FLAGS == -arch armv7
+  GCC:*_*_ARM_PLATFORM_FLAGS == -march=armv7-a
+  RVCT:*_*_ARM_PLATFORM_FLAGS == --cpu Cortex-A8
+
+  *_*_*_CC_FLAGS = -DDISABLE_NEW_DEPRECATED_INTERFACES
+
+################################################################################
+#
+# Pcd Section - list of all EDK II PCD Entries defined by this Platform
+#
+################################################################################
+
+[PcdsFeatureFlag.common]
+  gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|TRUE
+  gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable|TRUE
+  gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE
+  gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE
+
+  # Use the Vector Table location in CpuDxe. We will not copy the Vector Table at PcdCpuVectorBaseAddress
+  gArmTokenSpaceGuid.PcdRelocateVectorTable|FALSE
+
+  gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob|TRUE
+  gArmTokenSpaceGuid.PcdCpuDxeProduceDebugSupport|FALSE
+
+  gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE
+
+  ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe.
+  #  It could be set FALSE to save size.
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE
+
+[PcdsFixedAtBuild.common]
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor|L"Beagle Board"
+
+  gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1000000
+  gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength|1000000
+  gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|1000000
+  gEfiMdePkgTokenSpaceGuid.PcdSpinLockTimeout|10000000
+  gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue|0xAF
+  gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask|1
+  gEfiMdePkgTokenSpaceGuid.PcdPostCodePropertyMask|0
+  gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|320
+
+# DEBUG_ASSERT_ENABLED       0x01
+# DEBUG_PRINT_ENABLED        0x02
+# DEBUG_CODE_ENABLED         0x04
+# CLEAR_MEMORY_ENABLED       0x08
+# ASSERT_BREAKPOINT_ENABLED  0x10
+# ASSERT_DEADLOOP_ENABLED    0x20
+!if $(TARGET) == RELEASE
+  gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x21
+!else
+  gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2f
+!endif
+
+#  DEBUG_INIT      0x00000001  // Initialization
+#  DEBUG_WARN      0x00000002  // Warnings
+#  DEBUG_LOAD      0x00000004  // Load events
+#  DEBUG_FS        0x00000008  // EFI File system
+#  DEBUG_POOL      0x00000010  // Alloc & Free (pool)
+#  DEBUG_PAGE      0x00000020  // Alloc & Free (page)
+#  DEBUG_INFO      0x00000040  // Informational debug messages
+#  DEBUG_DISPATCH  0x00000080  // PEI/DXE/SMM Dispatchers
+#  DEBUG_VARIABLE  0x00000100  // Variable
+#  DEBUG_BM        0x00000400  // Boot Manager
+#  DEBUG_BLKIO     0x00001000  // BlkIo Driver
+#  DEBUG_NET       0x00004000  // SNP Driver
+#  DEBUG_UNDI      0x00010000  // UNDI Driver
+#  DEBUG_LOADFILE  0x00020000  // LoadFile
+#  DEBUG_EVENT     0x00080000  // Event messages
+#  DEBUG_GCD       0x00100000  // Global Coherency Database changes
+#  DEBUG_CACHE     0x00200000  // Memory range cachability changes
+#  DEBUG_VERBOSE   0x00400000  // Detailed debug messages that may
+#                              // significantly impact boot performance
+#  DEBUG_ERROR     0x80000000  // Error
+  gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000000F
+
+  gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x07
+
+#
+# Optional feature to help prevent EFI memory map fragments
+# Turned on and off via: PcdPrePiProduceMemoryTypeInformationHob
+# Values are in EFI Pages (4K). DXE Core will make sure that
+# at least this much of each type of memory can be allocated
+# from a single memory range. This way you only end up with
+# maximum of two fragements for each type in the memory map
+# (the memory used, and the free memory that was prereserved
+# but not used).
+#
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory|0
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS|0
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType|0
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData|80
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode|40
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesCode|400
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesData|3000
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderCode|10
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderData|0
+
+  gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|4
+
+#
+# Beagle board Specific PCDs
+#
+  gArmTokenSpaceGuid.PcdVFPEnabled|1
+
+  gArmTokenSpaceGuid.PcdSystemMemoryBase|0x80000000
+  gArmTokenSpaceGuid.PcdSystemMemorySize|0x08000000
+
+  # Size of the region used by UEFI in permanent memory (Reserved 16MB)
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x01000000
+
+  gArmTokenSpaceGuid.PcdCpuVectorBaseAddress|0x80008000
+  gArmTokenSpaceGuid.PcdCpuResetAddress|0x80008000
+
+  gEmbeddedTokenSpaceGuid.PcdTimerPeriod|100000
+  gEmbeddedTokenSpaceGuid.PcdEmbeddedPerformanceCounterPeriodInNanoseconds|77
+  gEmbeddedTokenSpaceGuid.PcdEmbeddedPerformanceCounterFrequencyInHz|13000000
+
+  # OMAP Interrupt Controller
+  gEmbeddedTokenSpaceGuid.PcdInterruptBaseAddress|0x48200000
+
+  gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|10
+
+  # GUID of the UEFI Shell
+  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 }
+
+  # GUID of the UI app
+  gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
+
+  gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|FALSE
+
+  #
+  # Make VariableRuntimeDxe work at emulated non-volatile variable mode.
+  #
+  gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable|TRUE
+
+################################################################################
+#
+# Components Section - list of all EDK II Modules needed by this Platform
+#
+################################################################################
+[Components.common]
+
+  #
+  # SEC
+  #
+  BeagleBoardPkg/PrePi/PeiUniCore.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
+  }
+
+  #
+  # DXE
+  #
+  MdeModulePkg/Core/Dxe/DxeMain.inf {
+    <LibraryClasses>
+      PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+      NULL|MdeModulePkg/Library/DxeCrc32GuidedSectionExtractLib/DxeCrc32GuidedSectionExtractLib.inf
+      NULL|BeagleBoardPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf
+  }
+
+  ArmPkg/Drivers/CpuDxe/CpuDxe.inf
+
+  MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
+  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
+  MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
+  MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
+  MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
+  EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf
+
+  MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
+  MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
+  MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
+  MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
+  MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
+#
+# This version uses semi-hosting console
+#  EmbeddedPkg/SimpleTextInOutSerial/SimpleTextInOutSerial.inf {
+#    <LibraryClasses>
+#      SerialPortLib|ArmPkg/Library/SemiHostingSerialPortLib/SemiHostingSerialPortLib.inf
+#  }
+
+  MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf
+  EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
+  EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
+
+  #
+  # Semi-hosting filesystem
+  #
+  ArmPkg/Filesystem/SemihostFs/SemihostFs.inf
+
+  #
+  # FAT filesystem + GPT/MBR partitioning
+  #
+  MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
+  MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
+  MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
+  FatPkg/EnhancedFatDxe/Fat.inf
+
+  #
+  # USB
+  #
+  Omap35xxPkg/PciEmulation/PciEmulation.inf
+  MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf
+
+  MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf {
+    <PcdsFixedAtBuild>
+      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x800fffff
+  }
+
+  MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
+  MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf
+
+  #
+  # Nand Flash
+  #
+  Omap35xxPkg/Flash/Flash.inf
+
+  #
+  # MMC/SD
+  #
+  EmbeddedPkg/Universal/MmcDxe/MmcDxe.inf
+  Omap35xxPkg/MmcHostDxe/MmcHostDxe.inf
+
+  #
+  # I2C
+  #
+  Omap35xxPkg/SmbusDxe/Smbus.inf
+
+  #
+  # SoC Drivers
+  #
+  Omap35xxPkg/Gpio/Gpio.inf
+  Omap35xxPkg/InterruptDxe/InterruptDxe.inf
+  Omap35xxPkg/TimerDxe/TimerDxe.inf
+  Omap35xxPkg/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.inf
+
+  #
+  # Power IC
+  #
+  Omap35xxPkg/TPS65950Dxe/TPS65950.inf
+
+  #
+  # Bds
+  #
+  MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
+  MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+  MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
+  MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
+  MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+  MdeModulePkg/Application/UiApp/UiApp.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+  }
+
+  #
+  # Shell
+  #
+  ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf {
+    <PcdsFixedAtBuild>
+      gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
+  }
+  ShellPkg/Application/Shell/Shell.inf {
+    <LibraryClasses>
+      ShellCommandLib|ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
+      NULL|ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+      HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
+      PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
+      BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf
+
+    <PcdsFixedAtBuild>
+      gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0xFF
+      gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
+      gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000
+  }
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.fdf b/Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.fdf
new file mode 100644
index 0000000000..1d5c0040b5
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/BeagleBoardPkg.fdf
@@ -0,0 +1,308 @@
+# FLASH layout file for Beagle board.
+#
+# Copyright (c) 2009, Apple Inc. All rights reserved.<BR>
+# Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR>
+#
+#    SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+################################################################################
+#
+# FD Section
+# The [FD] Section is made up of the definition statements and a
+# description of what goes into  the Flash Device Image.  Each FD section
+# defines one flash "device" image.  A flash device image may be one of
+# the following: Removable media bootable image (like a boot floppy
+# image,) an Option ROM image (that would be "flashed" into an add-in
+# card,) a System "Flash"  image (that would be burned into a system's
+# flash) or an Update ("Capsule") image that will be used to update and
+# existing system flash.
+#
+################################################################################
+
+
+[FD.BeagleBoard_EFI]
+BaseAddress   = 0x80007DF8|gArmTokenSpaceGuid.PcdFdBaseAddress  #The base address of the FLASH Device.
+Size          = 0x000B0000|gArmTokenSpaceGuid.PcdFdSize         #The size in bytes of the FLASH Device
+ErasePolarity = 1
+BlockSize     = 0x1
+NumBlocks     = 0xB0000
+
+################################################################################
+#
+# Following are lists of FD Region layout which correspond to the locations of different
+# images within the flash device.
+#
+# Regions must be defined in ascending order and may not overlap.
+#
+# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by
+# the pipe "|" character, followed by the size of the region, also in hex with the leading
+# "0x" characters. Like:
+# Offset|Size
+# PcdOffsetCName|PcdSizeCName
+# RegionType <FV, DATA, or FILE>
+#
+################################################################################
+0x00000000|0x00000200
+FILE = BeagleBoardPkg/ConfigurationHeader.bin
+
+0x00000200|0x00000008
+DATA = {
+  0xF8, 0xFD, 0x0A, 0x00,   # image size:   0xB0000 - 0x208 == 0xAFDF8
+  0x00, 0x80, 0x00, 0x80    # entry point:  0x80008000
+}
+
+0x00000208|0x000AFDF8
+gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
+FV = FVMAIN_COMPACT
+
+################################################################################
+#
+# FV Section
+#
+# [FV] section is used to define what components or modules are placed within a flash
+# device file.  This section also defines order the components and modules are positioned
+# within the image.  The [FV] section consists of define statements, set statements and
+# module statements.
+#
+################################################################################
+
+[FV.FvMain]
+BlockSize          = 0x1
+NumBlocks          = 0         # This FV gets compressed so make it just big enough
+FvAlignment        = 8         # FV alignment and FV attributes setting.
+ERASE_POLARITY     = 1
+MEMORY_MAPPED      = TRUE
+STICKY_WRITE       = TRUE
+LOCK_CAP           = TRUE
+LOCK_STATUS        = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP  = TRUE
+WRITE_STATUS       = TRUE
+WRITE_LOCK_CAP     = TRUE
+WRITE_LOCK_STATUS  = TRUE
+READ_DISABLED_CAP  = TRUE
+READ_ENABLED_CAP   = TRUE
+READ_STATUS        = TRUE
+READ_LOCK_CAP      = TRUE
+READ_LOCK_STATUS   = TRUE
+FvNameGuid         = d0dd3e90-343d-4cb3-8f69-772214989282
+
+  INF MdeModulePkg/Core/Dxe/DxeMain.inf
+
+  #
+  # PI DXE Drivers producing Architectural Protocols (EFI Services)
+  #
+  INF ArmPkg/Drivers/CpuDxe/CpuDxe.inf
+
+  INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
+  INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
+  INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
+  INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
+  INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
+  INF EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf
+
+  INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
+  INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
+  INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
+  INF MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
+  INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
+
+  INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf
+  INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
+  INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
+
+!if $(TARGET) == RELEASE
+  #
+  # Semi-hosting filesystem
+  #
+  INF ArmPkg/Filesystem/SemihostFs/SemihostFs.inf
+!endif
+
+  #
+  # Nand Flash
+  #
+  INF Omap35xxPkg/Flash/Flash.inf
+
+  #
+  # MMC/SD
+  #
+  INF EmbeddedPkg/Universal/MmcDxe/MmcDxe.inf
+  INF Omap35xxPkg/MmcHostDxe/MmcHostDxe.inf
+
+  #
+  # I2C
+  #
+  INF Omap35xxPkg/SmbusDxe/Smbus.inf
+
+  #
+  # SoC Drivers
+  #
+  INF Omap35xxPkg/Gpio/Gpio.inf
+  INF Omap35xxPkg/InterruptDxe/InterruptDxe.inf
+  INF Omap35xxPkg/TimerDxe/TimerDxe.inf
+  INF Omap35xxPkg/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.inf
+
+  #
+  # Power IC
+  #
+  INF Omap35xxPkg/TPS65950Dxe/TPS65950.inf
+
+  #
+  # FAT filesystem + GPT/MBR partitioning
+  #
+  INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
+  INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
+  INF FatPkg/EnhancedFatDxe/Fat.inf
+  INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
+
+  #
+  # USB Support
+  #
+
+  INF Omap35xxPkg/PciEmulation/PciEmulation.inf
+  INF MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf
+
+  INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
+  INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
+  INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf
+
+  #
+  # UEFI application (Shell Embedded Boot Loader)
+  #
+  INF ShellPkg/Application/Shell/Shell.inf
+  INF ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf
+
+  #
+  # Bds
+  #
+  INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
+  INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+  INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
+  INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
+  INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+  INF MdeModulePkg/Application/UiApp/UiApp.inf
+
+
+[FV.FVMAIN_COMPACT]
+FvAlignment        = 8
+ERASE_POLARITY     = 1
+MEMORY_MAPPED      = TRUE
+STICKY_WRITE       = TRUE
+LOCK_CAP           = TRUE
+LOCK_STATUS        = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP  = TRUE
+WRITE_STATUS       = TRUE
+WRITE_LOCK_CAP     = TRUE
+WRITE_LOCK_STATUS  = TRUE
+READ_DISABLED_CAP  = TRUE
+READ_ENABLED_CAP   = TRUE
+READ_STATUS        = TRUE
+READ_LOCK_CAP      = TRUE
+READ_LOCK_STATUS   = TRUE
+
+  INF BeagleBoardPkg/PrePi/PeiUniCore.inf
+
+  FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
+    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {
+      SECTION FV_IMAGE = FVMAIN
+    }
+  }
+
+
+################################################################################
+#
+# Rules are use with the [FV] section's module INF type to define
+# how an FFS file is created for a given INF file. The following Rule are the default
+# rules for the different module type. User can add the customized rules to define the
+# content of the FFS file.
+#
+################################################################################
+
+
+############################################################################
+# Example of a DXE_DRIVER FFS file with a Checksum encapsulation section   #
+############################################################################
+#
+#[Rule.Common.DXE_DRIVER]
+#  FILE DRIVER = $(NAMED_GUID) {
+#    DXE_DEPEX    DXE_DEPEX               Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+#    COMPRESS PI_STD {
+#      GUIDED {
+#        PE32     PE32                    $(INF_OUTPUT)/$(MODULE_NAME).efi
+#        UI       STRING="$(MODULE_NAME)" Optional
+#        VERSION  STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
+#      }
+#    }
+#  }
+#
+############################################################################
+
+[Rule.Common.SEC]
+  FILE SEC = $(NAMED_GUID) RELOCS_STRIPPED {
+    TE  TE    Align = 32                $(INF_OUTPUT)/$(MODULE_NAME).efi
+  }
+
+[Rule.Common.PEI_CORE]
+  FILE PEI_CORE = $(NAMED_GUID) {
+    TE     TE                           $(INF_OUTPUT)/$(MODULE_NAME).efi
+    UI     STRING ="$(MODULE_NAME)" Optional
+  }
+
+[Rule.Common.PEIM]
+  FILE PEIM = $(NAMED_GUID) {
+     PEI_DEPEX PEI_DEPEX Optional       $(INF_OUTPUT)/$(MODULE_NAME).depex
+     PE32      PE32                     $(INF_OUTPUT)/$(MODULE_NAME).efi
+     UI       STRING="$(MODULE_NAME)" Optional
+  }
+
+[Rule.Common.DXE_CORE]
+  FILE DXE_CORE = $(NAMED_GUID) {
+    PE32     PE32                       $(INF_OUTPUT)/$(MODULE_NAME).efi
+    UI       STRING="$(MODULE_NAME)" Optional
+  }
+
+
+[Rule.Common.UEFI_DRIVER]
+  FILE DRIVER = $(NAMED_GUID) {
+    DXE_DEPEX    DXE_DEPEX              Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+    PE32         PE32                   $(INF_OUTPUT)/$(MODULE_NAME).efi
+    UI           STRING="$(MODULE_NAME)" Optional
+  }
+
+[Rule.Common.DXE_DRIVER]
+  FILE DRIVER = $(NAMED_GUID) {
+    DXE_DEPEX    DXE_DEPEX              Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+    PE32         PE32                   $(INF_OUTPUT)/$(MODULE_NAME).efi
+    UI           STRING="$(MODULE_NAME)" Optional
+  }
+
+[Rule.Common.DXE_RUNTIME_DRIVER]
+  FILE DRIVER = $(NAMED_GUID) {
+    DXE_DEPEX    DXE_DEPEX              Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+    PE32         PE32                   $(INF_OUTPUT)/$(MODULE_NAME).efi
+    UI           STRING="$(MODULE_NAME)" Optional
+  }
+
+[Rule.Common.UEFI_APPLICATION]
+  FILE APPLICATION = $(NAMED_GUID) {
+    UI     STRING ="$(MODULE_NAME)" Optional
+    PE32   PE32                         $(INF_OUTPUT)/$(MODULE_NAME).efi
+  }
+
+[Rule.Common.UEFI_DRIVER.BINARY]
+  FILE DRIVER = $(NAMED_GUID) {
+    DXE_DEPEX DXE_DEPEX Optional      |.depex
+    PE32      PE32                    |.efi
+    UI        STRING="$(MODULE_NAME)" Optional
+    VERSION   STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
+  }
+
+[Rule.Common.UEFI_APPLICATION.BINARY]
+  FILE APPLICATION = $(NAMED_GUID) {
+    PE32      PE32                    |.efi
+    UI        STRING="$(MODULE_NAME)" Optional
+    VERSION   STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
+  }
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/ConfigurationHeader.bin b/Platform/BeagleBoard/BeagleBoardPkg/ConfigurationHeader.bin
new file mode 100644
index 0000000000000000000000000000000000000000..150b3849fc35f6526f51ce32b3ab30c9555b284f
GIT binary patch
literal 512
zcmZ3$z`zgy#K^$eBiJ=0#M93`n1SH~P$C9d63BM;2y*m=iv0%yG-;}G4<0yhfRT}b
z;V&ZtYXi_^W*`pWVq)e3GDLxFb07o*9v@B^n`Z+f11DGxD)mK>0cZpm90HjKW&uec
n;)04d0%?%hf({p$jG$u2j?CSqq{_&^_=p9s97s7x?@$B)<?bO_

literal 0
HcmV?d00001

diff --git a/Platform/BeagleBoard/BeagleBoardPkg/ConfigurationHeader.dat b/Platform/BeagleBoard/BeagleBoardPkg/ConfigurationHeader.dat
new file mode 100644
index 0000000000..5f6897e306
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/ConfigurationHeader.dat
@@ -0,0 +1,41 @@
+PRM_CLKSRC_CTRL=0x00000080
+PRM_CLKSEL=0x00000003
+CM_CLKSEL1_EMU=0x03020A50
+CM_CLKSEL_CORE=0x0000030A
+CM_CLKSEL_WKUP=0x00000015
+CM_CLKEN_PLL_DPLL3=0x00370037
+CM_AUTOIDLE_PLL_DPLL3=0x00000000
+CM_CLKSEL1_PLL=0x094C0C00
+CM_CLKEN_PLL_DPLL4=0x00370037
+CM_AUTOIDLE_PLL_DPLL4=0x00000000
+CM_CLKSEL2_PLL=0x0001B00C
+CM_CLKSEL3_PLL=0x00000009
+CM_CLKEN_PLL_MPU=0x00000037
+CM_AUTOIDLE_PLL_MPU=0x00000000
+CM_CLKSEL1_PLL_MPU=0x0011F40C
+CM_CLKSEL2_PLL_MPU=0x00000001
+CM_CLKSTCTRL_MPU=0x00000000
+SDRC_SYSCONFIG_LSB=0x0000
+SDRC_CS_CFG_LSB=0x0001
+SDRC_SHARING_LSB=0x0100
+SDRC_ERR_TYPE_LSB=0x0000
+SDRC_DLLA_CTRL=0x0000000A
+SDRC_POWER=0x00000081
+MEMORY_TYPE_CS0=0x0003
+SDRC_MCFG_0=0x02D04011
+SDRC_MR_0_LSB=0x0032
+SDRC_EMR1_0_LSB=0x0000
+SDRC_EMR2_0_LSB=0x0000
+SDRC_EMR3_0_LSB=0x0000
+SDRC_ACTIM_CTRLA_0=0xBA9DC4C6
+SDRC_ACTIM_CTRLB_0=0x00012522
+SDRC_RFRCTRL_0=0x0004E201
+MEMORY_TYPE_CS1=0x0003
+SDRC_MCFG_1=0x02D04011
+SDRC_MR_1_LSB=0x0032
+SDRC_EMR1_1_LSB=0x0000
+SDRC_EMR2_1_LSB=0x0000
+SDRC_EMR3_1_LSB=0x0000
+SDRC_ACTIM_CTRLA_1=0xBA9DC4C6
+SDRC_ACTIM_CTRLB_1=0x00012522
+SDRC_RFRCTRL_1=0x0004E201
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_boot_from_ram.inc b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_boot_from_ram.inc
new file mode 100644
index 0000000000..7bc96ab8d2
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_boot_from_ram.inc
@@ -0,0 +1,15 @@
+//
+// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+//
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+error = continue
+unload
+error = abort
+
+setreg @CP15_CONTROL = 0x0005107E
+setreg @pc=0x80008208
+setreg @cpsr=0x000000D3
+dis/D
+readfile,raw,nowarn "ZZZZZZ/FV/BEAGLEBOARD_EFI.fd"=0x80008000
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_convert_symbols.sh b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_convert_symbols.sh
new file mode 100644
index 0000000000..b1a819382c
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_convert_symbols.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+#
+# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+#  
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+
+IN=`/usr/bin/cygpath -u $1`
+OUT=`/usr/bin/cygpath -u $2`
+
+/usr/bin/sed -e "s/\/cygdrive\/\(.\)/load\/a\/ni\/np \"\1:/g" \
+             -e 's:\\:/:g' \
+             -e "s/^/load\/a\/ni\/np \"/g" \
+             -e "s/dll /dll\" \&/g" \
+              $IN | /usr/bin/sort.exe --key=3 --output=$OUT
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_dummy.axf b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_dummy.axf
new file mode 100644
index 0000000000000000000000000000000000000000..17fabaa6cc649d520848f087954c0729043bf001
GIT binary patch
literal 7984
zcmbVRZERcDd44ZRnY3iPwCQ$+=LU4Zwq6p;vganAF|?8`#nvjvj3mcis+FS1D~S!i
za7o%$YS@%3e<XnuV++;~#4x)Jn1AGlhIK=`)_{sSZLqnmfx2l2Yyc^Wm}0l6gBfc(
zY~`Nk-g~I)TV_dn;Hz_<^M0Q9ea|_U*JlQXp42o=RP)F-F;Q9M+J{Bn#N!d^*ezkq
zZ<Ey$AnTon@NAP;7G=%lWvRSamHC&dTK-QKyX4v0?}>DNK>lfYWA*T&CZW3b-hrU^
zUZwWhDv{UmNKd6My?CN{#w+z;czE%od}Z7JG@CD;?VhjoU@See1M48;>$%$S_PkQ1
z{HT|vEA@w(J8I}_TSV@9W&7I~&HnoGKJ*^|zF_v(m;bZbyt@W|YQ5XvCjSY{YrWT(
z>Ay&|&bc+gtBp<2`ONMOKc~I>So}w^;-D=9KTTUc@CG4!x7ob24s!-{`Kpx~b<-aC
zs5=C#LEnZCSL%V_Ttj585u(i?)`Br@P&fUavE{sSec2a&wXwDbwyI~VUinN-!n2J|
zkr&tX{6$sU{PJP~G=Fe*(ckm!x<B}>x>ugAd4rW%kMvc2uoEo9M%eV#To>`e{_Ssn
z0(Q7g)4yn?_DK!C!awP~)bK?w!M{o^AeS0z(f>8#rT9GgO3gctN3I}VRt(HOSgB)u
zW=y19sSR-rn3KzxE0-IJrUlE3zTgWD($pNs0ePXtL%ha;gBU+xOWASt%tc2K@d#IH
zt9p>bTbCB^X;}Z+>&vaYag7c+Gd{?<Cs?hk9FWd=;&stV?W<TzM-}V9*e?t9wZTfQ
zvj_NAr8W*5VdU+L;0gD_);RR%@s#n*SInGrEL3U>t6yJsJ{n}H-zQhi+;e>YyoeL~
zP(b&f+t;(*T7NI&KD+3RE+EgZBL02V4vE%K%a72ffV|r1kaG1e8T;}1+AAVmzTm5n
zy@Kay<Yw-J9IpZoYfi`?ELY9?LG1|Y<(Gn*yLV+t4sU<^9n?th)}ci+URaa=GU5Vx
zZA+!@%YU!&W7b6(^$q-#ZBv`CgaXmZ`aq?!eznMESzx`>w~NqokvXpW7A`gd3vV_y
zs{FiseOc>$Yf0p2y#q22%V_;$G8*#bE1K_eMf(WOjV|oXG0fwb*evo^<6()`$0Qp1
z7#`H7rj4KX;5_Q|%V-Vp_in;i!0$KvqllMm4g;^2{tZ6JXd++Mdf!;8V&8Vk5ya+C
zy|4k9N_}-0`GwD#ys_kyOV;`?!*BWbhBp5aaJ1fuHFi`gP%~QpL9@A;ap_uLsr@-)
z0$J8Pb;0f(E&LO#Z5Z`l_Q>q4zeA4Ie${O5l`v{#>+FAg6FzJ~p1H@oa%q{l{2*j`
z_RtpU8g?q7EvQKW--kfkh`f-`7lwa06Ugg>4{L%~8i6qL9j$Mas~y3fD`uSiu#MXF
z3UqAy-)6HPwIz1#ExGD$8Q84-d)Ao*+o*fF%X1DfzQeur!(TV=T6-s2|NCDzH<MrO
zF%7nZ!B=otRzhLi1*p%v%sct_h7aoTd^n?La>h(Jku!`^zNjbVaH$y1O@^meh$4B$
z1h&=L(+M3sqqW|-#kH(A#9rh!YC0N1JU1gqceLoaMbrprM?m{gi$>Wz{HMME^fGpW
z^UaHS#x4Ng=s$8{om;`Od3G{3e8yq8w~Q+aeG|<aH!_LDqvAWYZo^vfi(d<P0^Wcx
z&=FV_@CO2c)q&1HS71$G-EYchEg8SZ{~I#?wlXVrep{J<1pXi2kQ=j|DvNo86Yu7X
zjj@kRJO}(3#zUdg2Sai&bP9iQ&ziJ(&^BV+A3F207CJo?I`jPypeS88%9d{OQ1?w>
zj)yus`@68|sAn3_QrQ~!y{yf7LZ=5hZ$M99ml<=)$t-e!F6y*n8->8B(a`A|$~N;v
znO?|HcZ;n*bP8+m^mg{&2uT;bRf83O(`At$WT=C(*P!D*dieE%=c4z5?|et-bA9Jl
z&G|#eXF@Z5oj2b2&UfDoo$l)j9p}0z^V-=5)?%)g{(KGdjLSiL?O}{Lf5V<%@pHv5
z>LkxC@c7W%q7t#^Z)1KO<7q1{=R61BFvF0x8C4E<f8Mg)Z_ZmpMeA=v+eV#uMnOA?
z9_zp0IqyB^o8$UJ&wtunc<2mLBztV$o8ZlBChtq07rig|E|T}cs`LJHfw|S8<9#9H
zXy}9r*(rp~kT7Jqz6I<vuC)~dM{YPzU;g-<;BC{?&y=@hlb9b;vIj%Yr$c8thnV0q
zmQL!Q2Ty=JuDE;?^UR4eF2t|lxd|F$uJA1ztD3zHOyBI9-LGmkj5*p|R=Ta+%z64(
z@=Bdt(|wyqtx*sM=GN9}j>#9r{4s0(yyu*E&WDm`3anjX`9Z#G;A37Pk6mPLMWB_2
z^vEBy;5$vOPs(aSGuIn%V4VH3$AQV;>%wUVCjUtXCjTiHo^#=w4ovxfb70CZxiHTH
zt6BbXk2*2;nG<t=IWhN=6LSwaG53nX^rzQ>=@0jd)ij*`$c+P&&OKu_%Rknw6SH0w
zru;PrraWuaYL@=5IWXz0SttEX2PU0$tLVh6QzvF!Ix%a|iCKdR)4zxVQy**5YIgix
zn0r~#@lqwXU6^;O)jaYcHAL@|cbbFfSuX+fUi`W|j9xX;M-@O%{8{4i3O{~>wVKj5
zSH_u(S?ascqORCu{c+Eb{-rkbCD6I&Nx#;H&U)m0JGz_y>n{2C!vE~z|5xC2*}9`>
z&rN6ixF3R=<xkxu@5ba;_Y(EBqpSO=9lc#V)m=sYc64=Tk^bK<|K1DJU+z!d(Z7ql
zTR-*n{}%eX5LeY$UvAtkA3P71-z6Vz{@-`$e*{?Fja=^&E;{{J_u{+7TiuWEM(26M
z`-t=*=;!_%H?ikE^F#YQkKS)So^Inm&#QoKKhcJ+?pgZhroR_<=ZF5Pdzt#&_2AY=
zesxE;vrjtD%P6{bbhkb?ro6h_Dc>%?>P{!!aK&fVg}(sI`+JY=&tJLdUkC05{V|*V
z9S1##dj2C12zCp4-f2EXT(<JF!K29$VD)}LoUk$9mx)WjTfomod=XgLBfbi(&M)G>
z16Jof@jn93l`a2>zXd!G%=aVWe*wM$%z7by3-~6mqE~^JfO%e%-T+p=9f*GgtbP{|
zcY3Y!^1jW#30S?qll};>Iv<G-0^c}m?HA&4VD&yhT(q&z)^`b5op+@F4KU9y?l<CZ
z0QWoacY%3coV4k;fz^98`T0>n?RVl|0IU5?9E9Q5?fZN^@Md83?o0Y3Himk67<iux
zj{$Q(EC2Gq>OFV^>hBz|dJm?)F9EClN&L6KYJU;`1F+gZlwSbmeu=2{0jv5a{b#_c
z-iiMUSe<{=#~0RHkY^+Pp^laJiy-K`fYtj2*MGpq<KSP9uSCayt?wT=vryj>$w(wF
zktF_g8+tsQj2Gjg?;X?AMk+Cu)Q{`wu~a^nESwk{cye&;z~In<zC)*Xj*TRYRK8dk
zOO`U3neK#i7xj}xNhZ1r(%roS|KiyxJ-wq)j2p#L9<y7wZq39~*$1f4=|)yhyG3RS
zt(ihGnNCemy{WTMe2!m9b~@<h#IDu^K1~!L4*@+h5i@;qx-*fB8>Yqwy)=p~1-6M6
zp3JARDUwe{Ci7`LgbyqN_Tu?GO->Y)T6!5zr*nxF*Hcs3c-jpWza6YZyjau?7(=iM
z7I?tabUd3(>jvYqb*l|x&!=QxDV0w46^lk{qEyrikx1Y0q1fO^-|^j%Ly_n}q;K!g
zu3eF1dxv)JjErD3I504<Gje+HXynMqz{oR?M^2B7ero@x`Yreb;K8BD;gM+H{(;EA
zzP>$?;en_3M54n3BYPqPeftKF?~+)oRM2BcZ{oRFVp>l;m&#6I(oAtIW;>tG#gmwH
zpqNpltaBz?N~c{@&+A6cjB_l;mBfvy<FVs<R@V)&4H(6ko-G<P5ajSAa$=6+6FCDz
z<iwg>p_r~RFELv)<V=XV)w6UH6DT$ZnW!*bDkgI$vJ%Uu<HgCGk%{GVg`%}`hq?!;
z4n2cbp!7^?8gf>Y7`kjOR#=&g6;7n!0tg1Cv13*YSe~u8Unu5`_>^utoJ+*h9GfvR
zOAdfRo6?Ksq!o-rE|Wp=K&#Pm!7!Jail?2nhL6UEQW-OxrZZScAs<iBgo*RIkvDP)
zM#?>3oW=o?bW#w}NpmH|QXv*kCJjpq*KUT+(5F&4gw}~-Qzh(C%t3f$@WAlsp@Bn+
zqm`;cYRZvx#fJ4{Q6jNeQlE^M(nylI>0-%L0qH@l6pJ$_jKs9iE4vD?sgdPGE;|X8
z`I4cd7GlX<X(Fu`WZ3jC5*dvHMk4#-1>HTTf~DfYSfT<4Ge}V+^6X$FVsYU7#nElv
z+vs|cA#_&5I6Rcf;xK$HJp9c5(Le0&34hw$(&5KHzVpvIWiXq^C*u7`A!@#`7dM`H
z=;rX5WBAaH(dklVBD{ac{zo4rPd<ecqOBq^zuShl=ibNhzVFE3Q2#K_`KO-PH8!lL
zbu4|ylh5q1EXPkyhTn%0_Z`9I4h+YJ51W6F^6#^Q(w)>NN>i~(Bc9QvyD*a}#wXAh
z4YSYYikM~jV(plowh2(hSGV2NS+<^~Rk+*y!fz5~#`^s>>fr-%Qx|nomugBEzPsD+
z>DC>)35LcM6MDtRuTGBFN+I7@716;T#+a{Xs@=r5#4sLQ(SlbjQy+g<Y{P@soL2iO
zJ{qLSWH)7t@1QW%YRB*rxT%F!{Cga8N`~Y-_<ri(Q?yTF&S`fH|L;B2hVTCXPO>ME

literal 0
HcmV?d00001

diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_hw_setup.inc b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_hw_setup.inc
new file mode 100644
index 0000000000..4c410f56b7
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_hw_setup.inc
@@ -0,0 +1,61 @@
+//
+// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+//
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+
+error = continue
+unload
+error = abort
+
+setreg @CP15_CONTROL = 0x0005107E
+setreg @cpsr=0x000000D3
+
+; General clock settings.
+setmem /32 0x48307270=0x00000080
+setmem /32 0x48306D40=0x00000003
+setmem /32 0x48005140=0x03020A50
+
+;Clock configuration
+setmem /32 0x48004A40=0x0000030A
+setmem /32 0x48004C40=0x00000015
+
+;DPLL3 (Core) settings
+setmem /32 0x48004D00=0x00370037
+setmem /32 0x48004D30=0x00000000
+setmem /32 0x48004D40=0x094C0C00
+
+;DPLL4 (Peripheral) settings
+setmem /32 0x48004D00=0x00370037
+setmem /32 0x48004D30=0x00000000
+setmem /32 0x48004D44=0x0001B00C
+setmem /32 0x48004D48=0x00000009
+
+;DPLL1 (MPU) settings
+setmem /32 0x48004904=0x00000037
+setmem /32 0x48004934=0x00000000
+setmem /32 0x48004940=0x0011F40C
+setmem /32 0x48004944=0x00000001
+setmem /32 0x48004948=0x00000000
+
+;RAM setup.
+setmem /16 0x6D000010=0x0000
+setmem /16 0x6D000040=0x0001
+setmem /16 0x6D000044=0x0100
+setmem /16 0x6D000048=0x0000
+setmem /32 0x6D000060=0x0000000A
+setmem /32 0x6D000070=0x00000081
+setmem /16 0x6D000040=0x0003
+setmem /32 0x6D000080=0x02D04011
+setmem /16 0x6D000084=0x0032
+setmem /16 0x6D00008C=0x0000
+setmem /32 0x6D00009C=0xBA9DC4C6
+setmem /32 0x6D0000A0=0x00012522
+setmem /32 0x6D0000A4=0x0004E201
+setmem /16 0x6D000040=0x0003
+setmem /32 0x6D0000B0=0x02D04011
+setmem /16 0x6D0000B4=0x0032
+setmem /16 0x6D0000BC=0x0000
+setmem /32 0x6D0000C4=0xBA9DC4C6
+setmem /32 0x6D0000C8=0x00012522
+setmem /32 0x6D0000D4=0x0004E201
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_load_symbols.inc b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_load_symbols.inc
new file mode 100644
index 0000000000..c3a04c34c0
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_load_symbols.inc
@@ -0,0 +1,17 @@
+//
+// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+//
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+
+include 'ZZZZZZ/rvi_symbols_macros.inc'
+
+macro write_symbols_file("ZZZZZZ/rvi_symbols.tmp", 0x00000000, 0x10000000)
+
+host "bash -o igncr ZZZZZZ/rvi_convert_symbols.sh ZZZZZZ/rvi_symbols.tmp ZZZZZZ/rvi_symbols.inc"
+include 'ZZZZZZ/rvi_symbols.inc'
+load /NI /NP 'ZZZZZZ/rvi_dummy.axf' ;.constdata
+unload rvi_dummy.axf
+delfile rvi_dummy.axf
+
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_symbols_macros.inc b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_symbols_macros.inc
new file mode 100644
index 0000000000..4ea3ae1a13
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_symbols_macros.inc
@@ -0,0 +1,188 @@
+//
+// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+//
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+
+define /R int compare_guid(guid1, guid2)
+    unsigned char *guid1;
+    unsigned char *guid2;
+{
+    return strncmp(guid1, guid2, 16);
+}
+.
+
+define /R unsigned char * find_system_table(mem_start, mem_size)
+    unsigned char *mem_start;
+    unsigned long mem_size;
+{
+    unsigned char *mem_ptr;
+
+    mem_ptr = mem_start + mem_size;
+
+    do
+    {
+        mem_ptr -= 0x400000; // 4 MB
+
+        if (strncmp(mem_ptr, "IBI SYST", 8) == 0)
+        {
+            return *(unsigned long *)(mem_ptr + 8); // EfiSystemTableBase
+        }
+
+    } while (mem_ptr > mem_start);
+
+    return 0;
+}
+.
+
+define /R unsigned char * find_debug_info_table_header(system_table)
+    unsigned char *system_table;
+{
+    unsigned long configuration_table_entries;
+    unsigned char *configuration_table;
+    unsigned long index;
+    unsigned char debug_table_guid[16];
+
+    // Fill in the debug table's guid
+    debug_table_guid[ 0] = 0x77;
+    debug_table_guid[ 1] = 0x2E;
+    debug_table_guid[ 2] = 0x15;
+    debug_table_guid[ 3] = 0x49;
+    debug_table_guid[ 4] = 0xDA;
+    debug_table_guid[ 5] = 0x1A;
+    debug_table_guid[ 6] = 0x64;
+    debug_table_guid[ 7] = 0x47;
+    debug_table_guid[ 8] = 0xB7;
+    debug_table_guid[ 9] = 0xA2;
+    debug_table_guid[10] = 0x7A;
+    debug_table_guid[11] = 0xFE;
+    debug_table_guid[12] = 0xFE;
+    debug_table_guid[13] = 0xD9;
+    debug_table_guid[14] = 0x5E;
+    debug_table_guid[15] = 0x8B;
+
+    configuration_table_entries = *(unsigned long *)(system_table + 64);
+    configuration_table         = *(unsigned long *)(system_table + 68);
+
+    for (index = 0; index < configuration_table_entries; index++)
+    {
+        if (compare_guid(configuration_table, debug_table_guid) == 0)
+        {
+            return *(unsigned long *)(configuration_table + 16);
+        }
+
+        configuration_table += 20;
+    }
+
+    return 0;
+}
+.
+
+define /R int valid_pe_header(header)
+        unsigned char *header;
+{
+    if ((header[0x00] == 'M') &&
+        (header[0x01] == 'Z') &&
+        (header[0x80] == 'P') &&
+        (header[0x81] == 'E'))
+    {
+        return 1;
+    }
+
+    return 0;
+}
+.
+
+define /R unsigned long pe_headersize(header)
+        unsigned char *header;
+{
+    unsigned long *size;
+
+    size = header + 0x00AC;
+
+    return *size;
+}
+.
+
+define /R unsigned char *pe_filename(header)
+        unsigned char *header;
+{
+    unsigned long *debugOffset;
+    unsigned char *stringOffset;
+
+    if (valid_pe_header(header))
+    {
+        debugOffset  = header + 0x0128;
+        stringOffset = header + *debugOffset + 0x002C;
+
+        return stringOffset;
+    }
+
+    return 0;
+}
+.
+
+define /R int char_is_valid(c)
+        unsigned char c;
+{
+    if (c >= 32 && c < 127)
+    	return 1;
+
+    return 0;
+}
+.
+
+define /R write_symbols_file(filename, mem_start, mem_size)
+    unsigned char *filename;
+    unsigned char *mem_start;
+    unsigned long mem_size;
+{
+    unsigned char *system_table;
+    unsigned char *debug_info_table_header;
+    unsigned char *debug_info_table;
+    unsigned long debug_info_table_size;
+    unsigned long index;
+    unsigned char *debug_image_info;
+    unsigned char *loaded_image_protocol;
+    unsigned char *image_base;
+    unsigned char *debug_filename;
+    unsigned long header_size;
+    int           status;
+
+    system_table = find_system_table(mem_start, mem_size);
+    if (system_table == 0)
+    {
+        return;
+    }
+
+    status = fopen(88, filename, "w");
+
+    debug_info_table_header = find_debug_info_table_header(system_table);
+
+    debug_info_table      = *(unsigned long *)(debug_info_table_header + 8);
+    debug_info_table_size = *(unsigned long *)(debug_info_table_header + 4);
+
+    for (index = 0; index < (debug_info_table_size * 4); index += 4)
+    {
+        debug_image_info = *(unsigned long *)(debug_info_table + index);
+
+        if (debug_image_info == 0)
+        {
+            break;
+        }
+
+        loaded_image_protocol = *(unsigned long *)(debug_image_info + 4);
+
+        image_base = *(unsigned long *)(loaded_image_protocol + 32);
+
+        debug_filename = pe_filename(image_base);
+        header_size    = pe_headersize(image_base);
+
+        $fprintf 88, "%s 0x%08x\n", debug_filename, image_base + header_size$;
+    }
+
+
+    fclose(88);
+}
+.
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_unload_symbols.inc b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_unload_symbols.inc
new file mode 100644
index 0000000000..cade1f9acf
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/rvi_unload_symbols.inc
@@ -0,0 +1,112 @@
+//
+// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+//
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+
+error = continue
+
+unload
+
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+delfile 1
+
+error = abort
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/trace32_load_symbols.cmm b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/trace32_load_symbols.cmm
new file mode 100644
index 0000000000..83fd991db6
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/trace32_load_symbols.cmm
@@ -0,0 +1,205 @@
+//
+// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+//  
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+
+  ENTRY &ram_start &ram_size
+  
+  ;If system is running then stop the execution so we can load symbols.
+  break
+  
+  ;Reset all windows
+  WINPAGE.RESET
+  
+  ;Create AREA to display the symbols we are loading.
+  AREA.Reset
+  AREA.Create SYMBOL 300. 100.
+  AREA.View SYMBOL
+  AREA.Select SYMBOL
+  SYS.Option BE OFF
+ 
+  ;Added based on suggestion from Lauterbach support.
+  MMU.TABLEWALK ON
+  MMU.ON
+
+  ;Load symbols.
+  GOSUB load_symbols &ram_start &ram_size
+
+  ;Open some windows and enable semihosting.
+  TOOLBAR ON
+  STATUSBAR ON
+  WINPAGE.RESET
+   
+  WINCLEAR
+  WINPOS 0.0 17.0 72. 13. 0. 0. W000
+  SYStem
+   
+  WINPOS 0.0 0.0 110. 55. 13. 1. W001
+  WINTABS 10. 10. 25. 62.
+  Data.List
+   
+  WINPAGE.SELECT P000
+
+  //Enable semihosting
+  System.Option.BigEndian OFF
+
+  tronchip.set swi on		// ARM9/10/11 variant
+
+  // configure and open semihosting channel
+  winpos 50% 50% 50% 50%
+  term.heapinfo 0 0x20000 0x30000 0x20000
+  term.method armswi
+  term.mode string
+  term.gate
+
+  WINPOS 115.0 0. 70. 35. 0. 1. W002
+  Var.Local %HEX
+  
+  WINPOS 115.10 45. 48. 9. 0. 0. W003
+  Register
+    
+  END
+
+find_system_table:
+  ENTRY &mem_start &mem_size
+  &mem_ptr=&mem_start+&mem_size
+  RPT    
+  (
+    &mem_ptr=&mem_ptr-0x400000  // 4 MB
+    &word1=Data.LONG(D:&mem_ptr)
+    &word2=Data.LONG(D:&mem_ptr+0x04)
+    IF &word1==0x20494249
+    (
+      IF &word2==0x54535953
+      (
+        &result=Data.LONG(D:&mem_ptr+0x08)
+        RETURN &result
+      )
+    )
+  )
+  WHILE &mem_ptr>&mem_start
+  &result=0
+  RETURN &result
+
+compare_guid:
+  ENTRY &guid
+  IF Data.LONG(D:&guid)==0x49152E77
+  (
+    IF Data.LONG(D:&guid+0x04)==0x47641ADA
+    (
+      IF Data.LONG(D:&guid+0x08)==0xFE7AA2B7
+      (
+        IF Data.LONG(D:&guid+0x0C)==0x8B5ED9FE
+        (
+          RETURN 0
+        )
+      )
+    )
+  )
+  RETURN 1  
+
+find_debug_info_table_header:
+  ENTRY &system_table
+  &config_table_entries=Data.LONG(D:&system_table+0x40)
+  &config_table_pointer=Data.LONG(D:&system_table+0x44)
+  RPT &config_table_entries
+  (
+    GOSUB compare_guid &config_table_pointer
+    ENTRY &result
+    IF &result==0
+    (
+      &result=Data.LONG(D:&config_table_pointer+0x10)
+      RETURN &result
+    )  
+    &config_table_pointer=&config_table_pointer+0x14
+  )
+  RETURN 0;
+
+valid_pe_header:
+  ENTRY &header
+  IF Data.BYTE(D:&header+0x00)==0x4D
+  (
+    IF Data.BYTE(D:&header+0x01)==0x5A
+    (
+      IF Data.BYTE(D:&header+0x80)==0x50
+      (
+        IF Data.BYTE(D:&header+0x81)==0x45
+        (
+          RETURN 1
+        )
+      )
+    )
+  )
+  RETURN 0
+
+get_file_string:
+  ENTRY &stringOffset
+
+  local &string
+
+  &more_string=data.string(d:&stringOffset)
+
+  if (string.len("&more_string")>=128.)
+  (
+    &string="&string"+"&more_string"
+    &stringOffset=&stringOffset+string.len("&more_string")
+
+    //Get remaining file string
+    GOSUB get_file_string &stringOffset
+    ENTRY &more_string
+    &string="&string"+"&more_string"
+  )
+  else
+  (
+    &string="&string"+"&more_string"
+    &more_string=""
+  )
+  RETURN &string
+ 
+load_symbol_file:
+  ENTRY &header &load_address
+  GOSUB valid_pe_header &header
+  ENTRY &result
+ 
+  IF &result==1
+  (
+    &debugOffset=Data.LONG(D:&header+0x0128)
+    &stringOffset=&header+&debugOffset+0x002C
+    
+    GOSUB get_file_string &stringOffset
+    ENTRY &filestring
+        
+    PRINT "&filestring 0x" &load_address
+    TDIAG Data.load.elf &filestring &load_address /nocode /noclear
+  )
+  RETURN
+
+pe_headersize:
+  ENTRY &header;
+  RETURN Data.LONG(D:&header+0x00AC)
+
+load_symbols:
+  ENTRY &mem_start &mem_size
+  GOSUB find_system_table &mem_start &mem_size
+  ENTRY &system_table
+  GOSUB find_debug_info_table_header &system_table
+  ENTRY &debug_info_table_header
+  &debug_info_table=Data.LONG(D:&debug_info_table_header+0x08)
+  &debug_info_table_size=Data.LONG(D:&debug_info_table_header+0x04)
+  &index=0
+  RPT &debug_info_table_size
+  (
+    &debug_image_info=Data.LONG(D:&debug_info_table+&index)
+    IF &debug_image_info==0
+      RETURN        
+    &loaded_image_protocol=Data.LONG(D:&debug_image_info+0x04);
+    &image_base=Data.LONG(D:&loaded_image_protocol+0x20);
+    GOSUB pe_headersize &image_base
+    ENTRY &header_size
+    &image_load_address=&image_base+&header_size
+    GOSUB load_symbol_file &image_base &image_load_address
+    &index=&index+0x4
+  )
+    
+  RETURN
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/trace32_load_symbols_cygwin.cmm b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/trace32_load_symbols_cygwin.cmm
new file mode 100644
index 0000000000..87045e8769
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Debugger_scripts/trace32_load_symbols_cygwin.cmm
@@ -0,0 +1,182 @@
+//
+// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+//  
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+
+  ENTRY &ram_start &ram_size
+
+  ;If system is running then stop the execution so we can load symbols.
+  break
+  
+  ;Reset all windows
+  WINPAGE.RESET
+  
+  AREA.Reset
+  AREA.Create SYMBOL 300. 100.
+  AREA.View SYMBOL
+  AREA.Select SYMBOL
+  SYS.Option BE OFF
+ 
+  ; Added based on suggestion from Lauterbach support.
+  MMU.TABLEWALK ON
+  MMU.ON
+
+  GOSUB load_symbols &ram_start &ram_size
+
+  ;Open some windows.
+  WINPOS 83.125 29.063 48. 9. 0. 0. W003
+  Register
+
+  WINPOS 83.25 10. 48. 9. 0. 1. W002
+  Var.Local
+  
+  END
+
+find_system_table:
+  ENTRY &mem_start &mem_size
+  &mem_ptr=&mem_start+&mem_size
+  RPT    
+  (
+    &mem_ptr=&mem_ptr-0x400000  // 4 MB
+    &word1=Data.LONG(D:&mem_ptr)
+    &word2=Data.LONG(D:&mem_ptr+0x04)
+    IF &word1==0x20494249
+    (
+      IF &word2==0x54535953
+      (
+        &result=Data.LONG(D:&mem_ptr+0x08)
+        RETURN &result
+      )
+    )
+  )
+  WHILE &mem_ptr>&mem_start
+  &result=0
+  RETURN &result
+
+compare_guid:
+  ENTRY &guid
+  IF Data.LONG(D:&guid)==0x49152E77
+  (
+    IF Data.LONG(D:&guid+0x04)==0x47641ADA
+    (
+      IF Data.LONG(D:&guid+0x08)==0xFE7AA2B7
+      (
+        IF Data.LONG(D:&guid+0x0C)==0x8B5ED9FE
+        (
+          RETURN 0
+        )
+      )
+    )
+  )
+  RETURN 1  
+
+find_debug_info_table_header:
+  ENTRY &system_table
+  &config_table_entries=Data.LONG(D:&system_table+0x40)
+  &config_table_pointer=Data.LONG(D:&system_table+0x44)
+  RPT &config_table_entries
+  (
+    GOSUB compare_guid &config_table_pointer
+    ENTRY &result
+    IF &result==0
+    (
+      &result=Data.LONG(D:&config_table_pointer+0x10)
+      RETURN &result
+    )  
+    &config_table_pointer=&config_table_pointer+0x14
+  )
+  RETURN 0;
+
+valid_pe_header:
+  ENTRY &header
+  IF Data.BYTE(D:&header+0x00)==0x4D
+  (
+    IF Data.BYTE(D:&header+0x01)==0x5A
+    (
+      IF Data.BYTE(D:&header+0x80)==0x50
+      (
+        IF Data.BYTE(D:&header+0x81)==0x45
+        (
+          RETURN 1
+        )
+      )
+    )
+  )
+  RETURN 0
+
+get_file_string:
+  ENTRY &stringOffset
+
+  local &string
+  
+  &more_string=data.string(d:&stringOffset)
+
+  if (string.len("&more_string")>=128.)
+  (
+    &string="&string"+"&more_string"
+    &stringOffset=&stringOffset+string.len("&more_string")
+
+    //Get remaining file string
+    GOSUB get_file_string &stringOffset
+    ENTRY &more_string
+    &string="&string"+"&more_string"
+  )
+  else
+  (
+    &string="&string"+"&more_string"
+    &more_string=""
+  )
+  RETURN &string
+ 
+load_symbol_file:
+  ENTRY &header &load_address
+  GOSUB valid_pe_header &header
+  ENTRY &result
+ 
+  IF &result==1
+  (
+    &debugOffset=Data.LONG(D:&header+0x0128)
+    &stringOffset=&header+&debugOffset+0x002C
+    
+    &stringOffset=&stringOffset+11.
+
+    GOSUB get_file_string &stringOffset
+    ENTRY &filestring
+  
+    &filestring="c:"+"&filestring"
+
+    PRINT "&filestring 0x" &load_address
+    Data.load.elf &filestring &load_address /nocode /noclear
+  )
+  RETURN
+
+pe_headersize:
+  ENTRY &header;
+  RETURN Data.LONG(D:&header+0x00AC)
+
+load_symbols:
+  ENTRY &mem_start &mem_size
+  GOSUB find_system_table &mem_start &mem_size
+  ENTRY &system_table
+  GOSUB find_debug_info_table_header &system_table
+  ENTRY &debug_info_table_header
+  &debug_info_table=Data.LONG(D:&debug_info_table_header+0x08)
+  &debug_info_table_size=Data.LONG(D:&debug_info_table_header+0x04)
+  &index=0
+  RPT &debug_info_table_size
+  (
+    &debug_image_info=Data.LONG(D:&debug_info_table+&index)
+    IF &debug_image_info==0
+      RETURN        
+    &loaded_image_protocol=Data.LONG(D:&debug_image_info+0x04);
+    &image_base=Data.LONG(D:&loaded_image_protocol+0x20);
+    GOSUB pe_headersize &image_base
+    ENTRY &header_size
+    &image_load_address=&image_base+&header_size
+    GOSUB load_symbol_file &image_base &image_load_address
+    &index=&index+0x4
+  )
+    
+  RETURN
+  
\ No newline at end of file
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Include/BeagleBoard.h b/Platform/BeagleBoard/BeagleBoardPkg/Include/BeagleBoard.h
new file mode 100644
index 0000000000..860685b764
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Include/BeagleBoard.h
@@ -0,0 +1,173 @@
+/** @file
+*  Header defining the BeagleBoard constants (Base addresses, sizes, flags)
+*
+*  Copyright (c) 2011, ARM Limited. All rights reserved.
+*
+*  SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#ifndef __BEAGLEBOARD_PLATFORM_H__
+#define __BEAGLEBOARD_PLATFORM_H__
+
+// DDR attributes
+#define DDR_ATTRIBUTES_CACHED                ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK
+#define DDR_ATTRIBUTES_UNCACHED              ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED
+
+// SoC registers. L3 interconnects
+#define SOC_REGISTERS_L3_PHYSICAL_BASE       0x68000000
+#define SOC_REGISTERS_L3_PHYSICAL_LENGTH     0x08000000
+#define SOC_REGISTERS_L3_ATTRIBUTES          ARM_MEMORY_REGION_ATTRIBUTE_DEVICE
+
+// SoC registers. L4 interconnects
+#define SOC_REGISTERS_L4_PHYSICAL_BASE       0x48000000
+#define SOC_REGISTERS_L4_PHYSICAL_LENGTH     0x08000000
+#define SOC_REGISTERS_L4_ATTRIBUTES          ARM_MEMORY_REGION_ATTRIBUTE_DEVICE
+
+
+#if 0
+/*******************************************
+// Platform Memory Map
+*******************************************/
+
+// Can be NOR, DOC, DRAM, SRAM
+#define ARM_EB_REMAP_BASE                     0x00000000
+#define ARM_EB_REMAP_SZ                       0x04000000
+
+// Motherboard Peripheral and On-chip peripheral
+#define ARM_EB_SMB_MB_ON_CHIP_PERIPH_BASE     0x10000000
+#define ARM_EB_SMB_MB_ON_CHIP_PERIPH_SZ       0x00100000
+#define ARM_EB_BOARD_PERIPH_BASE              0x10000000
+//#define ARM_EB_CHIP_PERIPH_BASE             0x10020000
+
+// SMC
+#define ARM_EB_SMC_BASE                       0x40000000
+#define ARM_EB_SMC_SZ                         0x20000000
+
+// NOR Flash 1
+#define ARM_EB_SMB_NOR_BASE                   0x40000000
+#define ARM_EB_SMB_NOR_SZ                     0x04000000 /* 64 MB */
+// DOC Flash
+#define ARM_EB_SMB_DOC_BASE                   0x44000000
+#define ARM_EB_SMB_DOC_SZ                     0x04000000 /* 64 MB */
+// SRAM
+#define ARM_EB_SMB_SRAM_BASE                  0x48000000
+#define ARM_EB_SMB_SRAM_SZ                    0x02000000 /* 32 MB */
+// USB, Ethernet, VRAM
+#define ARM_EB_SMB_PERIPH_BASE                0x4E000000
+//#define ARM_EB_SMB_PERIPH_VRAM              0x4C000000
+#define ARM_EB_SMB_PERIPH_SZ                  0x02000000 /* 32 MB */
+
+// DRAM
+#define ARM_EB_DRAM_BASE                      0x70000000
+#define ARM_EB_DRAM_SZ                        0x10000000
+
+// Logic Tile
+#define ARM_EB_LOGIC_TILE_BASE                0xC0000000
+#define ARM_EB_LOGIC_TILE_SZ                  0x40000000
+
+/*******************************************
+// Motherboard peripherals
+*******************************************/
+
+// Define MotherBoard SYS flags offsets (from ARM_EB_BOARD_PERIPH_BASE)
+#define ARM_EB_SYS_FLAGS_REG                  (ARM_EB_BOARD_PERIPH_BASE + 0x00030)
+#define ARM_EB_SYS_FLAGS_SET_REG              (ARM_EB_BOARD_PERIPH_BASE + 0x00030)
+#define ARM_EB_SYS_FLAGS_CLR_REG              (ARM_EB_BOARD_PERIPH_BASE + 0x00034)
+#define ARM_EB_SYS_FLAGS_NV_REG               (ARM_EB_BOARD_PERIPH_BASE + 0x00038)
+#define ARM_EB_SYS_FLAGS_NV_SET_REG           (ARM_EB_BOARD_PERIPH_BASE + 0x00038)
+#define ARM_EB_SYS_FLAGS_NV_CLR_REG           (ARM_EB_BOARD_PERIPH_BASE + 0x0003C)
+#define ARM_EB_SYS_CLCD                       (ARM_EB_BOARD_PERIPH_BASE + 0x00050)
+#define ARM_EB_SYS_PROCID0_REG                (ARM_EB_BOARD_PERIPH_BASE + 0x00084)
+#define ARM_EB_SYS_PROCID1_REG                (ARM_EB_BOARD_PERIPH_BASE + 0x00088)
+#define ARM_EB_SYS_CFGDATA_REG                (ARM_EB_BOARD_PERIPH_BASE + 0x000A0)
+#define ARM_EB_SYS_CFGCTRL_REG                (ARM_EB_BOARD_PERIPH_BASE + 0x000A4)
+#define ARM_EB_SYS_CFGSTAT_REG                (ARM_EB_BOARD_PERIPH_BASE + 0x000A8)
+
+// SP810 Controller
+#define SP810_CTRL_BASE                       (ARM_EB_BOARD_PERIPH_BASE + 0x01000)
+
+// SYSTRCL Register
+#define ARM_EB_SYSCTRL                        0x10001000
+
+// Uart0
+#define PL011_CONSOLE_UART_BASE               (ARM_EB_BOARD_PERIPH_BASE + 0x09000)
+#define PL011_CONSOLE_UART_SPEED              115200
+
+// SP804 Timer Bases
+#define SP804_TIMER0_BASE                     (ARM_EB_BOARD_PERIPH_BASE + 0x11000)
+#define SP804_TIMER1_BASE                     (ARM_EB_BOARD_PERIPH_BASE + 0x11020)
+#define SP804_TIMER2_BASE                     (ARM_EB_BOARD_PERIPH_BASE + 0x12000)
+#define SP804_TIMER3_BASE                     (ARM_EB_BOARD_PERIPH_BASE + 0x12020)
+
+// PL301 RTC
+#define PL031_RTC_BASE                        (ARM_EB_BOARD_PERIPH_BASE + 0x17000)
+
+// Dynamic Memory Controller Base
+#define ARM_EB_DMC_BASE                       0x10018000
+
+// Static Memory Controller Base
+#define ARM_EB_SMC_CTRL_BASE                  0x10080000
+
+#define PL111_CLCD_BASE                       0x10020000
+//TODO: FIXME ... Reserved the memory in UEFI !!! Otherwise risk of corruption
+#define PL111_CLCD_VRAM_BASE                  0x78000000
+
+#define ARM_EB_SYS_OSCCLK4                    0x1000001C
+
+
+/*// System Configuration Controller register Base addresses
+//#define ARM_EB_SYS_CFG_CTRL_BASE                0x100E2000
+#define ARM_EB_SYS_CFGRW0_REG                   0x100E2000
+#define ARM_EB_SYS_CFGRW1_REG                   0x100E2004
+#define ARM_EB_SYS_CFGRW2_REG                   0x100E2008
+
+#define ARM_EB_CFGRW1_REMAP_NOR0                0
+#define ARM_EB_CFGRW1_REMAP_NOR1                (1 << 28)
+#define ARM_EB_CFGRW1_REMAP_EXT_AXI             (1 << 29)
+#define ARM_EB_CFGRW1_REMAP_DRAM                (1 << 30)
+
+// PL301 Fast AXI Base Address
+#define ARM_EB_FAXI_BASE                        0x100E9000
+
+// L2x0 Cache Controller Base Address
+//#define ARM_EB_L2x0_CTLR_BASE                   0x1E00A000*/
+
+
+// PL031 RTC - Other settings
+#define PL031_PPM_ACCURACY                      300000000
+
+/*******************************************
+// Interrupt Map
+*******************************************/
+
+// Timer Interrupts
+#define TIMER01_INTERRUPT_NUM                34
+#define TIMER23_INTERRUPT_NUM                35
+
+
+/*******************************************
+// EFI Memory Map in Permanent Memory (DRAM)
+*******************************************/
+
+// This region is allocated at the bottom of the DRAM. It will be used
+// for fixed address allocations such as Vector Table
+#define ARM_EB_EFI_FIX_ADDRESS_REGION_SZ        SIZE_8MB
+
+// This region is the memory declared to PEI as permanent memory for PEI
+// and DXE. EFI stacks and heaps will be declared in this region.
+#define ARM_EB_EFI_MEMORY_REGION_SZ             0x1000000
+#endif
+
+typedef enum {
+  REVISION_XM,
+  REVISION_UNKNOWN0,
+  REVISION_UNKNOWN1,
+  REVISION_UNKNOWN2,
+  REVISION_UNKNOWN3,
+  REVISION_C4,
+  REVISION_C123,
+  REVISION_AB,
+} BEAGLEBOARD_REVISION;
+
+#endif
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoard.c b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoard.c
new file mode 100644
index 0000000000..70a5107974
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoard.c
@@ -0,0 +1,115 @@
+/** @file
+*
+*  Copyright (c) 2011-2012, ARM Limited. All rights reserved.
+*
+*  SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#include <Library/IoLib.h>
+#include <Library/ArmPlatformLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+
+#include <Omap3530/Omap3530.h>
+#include <BeagleBoard.h>
+
+VOID
+PadConfiguration (
+  BEAGLEBOARD_REVISION Revision
+  );
+
+VOID
+ClockInit (
+  VOID
+  );
+
+/**
+  Detect board revision
+
+  @return Board revision
+**/
+BEAGLEBOARD_REVISION
+BeagleBoardGetRevision (
+  VOID
+  )
+{
+  UINT32 OldPinDir;
+  UINT32 Revision;
+
+  // Read GPIO 171, 172, 173
+  OldPinDir = MmioRead32 (GPIO6_BASE + GPIO_OE);
+  MmioWrite32(GPIO6_BASE + GPIO_OE, (OldPinDir | BIT11 | BIT12 | BIT13));
+  Revision = MmioRead32 (GPIO6_BASE + GPIO_DATAIN);
+
+  // Restore I/O settings
+  MmioWrite32 (GPIO6_BASE + GPIO_OE, OldPinDir);
+
+  return (BEAGLEBOARD_REVISION)((Revision >> 11) & 0x7);
+}
+
+/**
+  Return the current Boot Mode
+
+  This function returns the boot reason on the platform
+
+**/
+EFI_BOOT_MODE
+ArmPlatformGetBootMode (
+  VOID
+  )
+{
+  return BOOT_WITH_FULL_CONFIGURATION;
+}
+
+/**
+  Initialize controllers that must setup at the early stage
+
+  Some peripherals must be initialized in Secure World.
+  For example, some L2x0 requires to be initialized in Secure World
+
+**/
+RETURN_STATUS
+ArmPlatformInitialize (
+  IN  UINTN                     MpId
+  )
+{
+  BEAGLEBOARD_REVISION Revision;
+
+  Revision = BeagleBoardGetRevision();
+
+  // Set up Pin muxing.
+  PadConfiguration (Revision);
+
+  // Set up system clocking
+  ClockInit ();
+
+  // Turn off the functional clock for Timer 3
+  MmioAnd32 (CM_FCLKEN_PER, 0xFFFFFFFF ^ CM_ICLKEN_PER_EN_GPT3_ENABLE );
+  ArmDataSynchronizationBarrier ();
+
+  // Clear IRQs
+  MmioWrite32 (INTCPS_CONTROL, INTCPS_CONTROL_NEWIRQAGR);
+  ArmDataSynchronizationBarrier ();
+
+  return RETURN_SUCCESS;
+}
+
+VOID
+ArmPlatformGetPlatformPpiList (
+  OUT UINTN                   *PpiListSize,
+  OUT EFI_PEI_PPI_DESCRIPTOR  **PpiList
+  )
+{
+  *PpiListSize = 0;
+  *PpiList = NULL;
+}
+
+UINTN
+ArmPlatformGetCorePosition (
+  IN UINTN MpId
+  )
+{
+  return 1;
+}
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.S b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.S
new file mode 100644
index 0000000000..313763a5eb
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.S
@@ -0,0 +1,41 @@
+#
+#  Copyright (c) 2012-2013, ARM Limited. All rights reserved.
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#
+
+#include <AsmMacroIoLib.h>
+#include <AutoGen.h>
+
+.text
+.align 2
+
+GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
+GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)
+GCC_ASM_EXPORT(ArmPlatformPeiBootAction)
+
+GCC_ASM_IMPORT(ArmReadMpidr)
+
+//UINTN
+//ArmPlatformIsPrimaryCore (
+//  IN UINTN MpId
+//  );
+ASM_PFX(ArmPlatformIsPrimaryCore):
+  // BeagleBoard has a single core. We must always return 1.
+  mov   r0, #1
+  bx    lr
+
+ASM_PFX(ArmPlatformPeiBootAction):
+  bx    lr
+
+//UINTN
+//ArmPlatformGetPrimaryCoreMpId (
+//  VOID
+//  );
+ASM_PFX(ArmPlatformGetPrimaryCoreMpId):
+  // The BeagleBoard is a uniprocessor platform. The MPIDR of primary core is
+  // always the MPIDR of the calling CPU.
+  b   ASM_PFX(ArmReadMpidr)
+
+ASM_FUNCTION_REMOVE_IF_UNREFERENCED
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.asm b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.asm
new file mode 100644
index 0000000000..884f567cef
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.asm
@@ -0,0 +1,47 @@
+//
+//  Copyright (c) 2012-2013, ARM Limited. All rights reserved.
+//
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+//
+
+#include <AsmMacroIoLib.h>
+#include <Base.h>
+
+#include <AutoGen.h>
+
+  INCLUDE AsmMacroIoLib.inc
+
+  EXPORT    ArmPlatformPeiBootAction
+  EXPORT    ArmPlatformIsPrimaryCore
+  EXPORT    ArmPlatformGetPrimaryCoreMpId
+
+  IMPORT    ArmReadMpidr
+
+  AREA BeagleBoardHelper, CODE, READONLY
+
+//UINTN
+//ArmPlatformIsPrimaryCore (
+//  IN UINTN MpId
+//  );
+ArmPlatformIsPrimaryCore FUNCTION
+  // BeagleBoard has a single core. We must always return 1.
+  mov   r0, #1
+  bx    lr
+  ENDFUNC
+
+ArmPlatformPeiBootAction FUNCTION
+  bx    lr
+  ENDFUNC
+
+//UINTN
+//ArmPlatformGetPrimaryCoreMpId (
+//  VOID
+//  );
+ArmPlatformGetPrimaryCoreMpId FUNCTION
+  // The BeagleBoard is a uniprocessor platform. The MPIDR of primary core is
+  // always the MPIDR of the calling CPU.
+  b     ArmReadMpidr
+  ENDFUNC
+
+  END
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardLib.inf b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardLib.inf
new file mode 100644
index 0000000000..53f75a3ccc
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardLib.inf
@@ -0,0 +1,48 @@
+#/* @file
+#  Copyright (c) 2011-2013, ARM Limited. All rights reserved.
+#  Copyright (c) 2016, Linaro Ltd. All rights reserved.
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#*/
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = BeagleBoardLib
+  FILE_GUID                      = 736343a0-1d96-11e0-aaaa-0002a5d5c51b
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = ArmPlatformLib
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  EmbeddedPkg/EmbeddedPkg.dec
+  ArmPkg/ArmPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
+  Omap35xxPkg/Omap35xxPkg.dec
+  BeagleBoardPkg/BeagleBoardPkg.dec
+
+[LibraryClasses]
+  IoLib
+  ArmLib
+  MemoryAllocationLib
+
+[Sources.common]
+  BeagleBoardHelper.asm  | RVCT
+  BeagleBoardHelper.S    | GCC
+  BeagleBoard.c
+  BeagleBoardMem.c
+  PadConfiguration.c
+  Clock.c
+  BeagleBoardHelper.S    | GCC
+  BeagleBoardHelper.asm  | RVCT
+
+[FixedPcd]
+  gArmTokenSpaceGuid.PcdFdBaseAddress
+  gArmTokenSpaceGuid.PcdFdSize
+
+  gArmTokenSpaceGuid.PcdSystemMemoryBase
+  gArmTokenSpaceGuid.PcdSystemMemorySize
+
+  gEmbeddedTokenSpaceGuid.PcdInterruptBaseAddress
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardMem.c b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardMem.c
new file mode 100644
index 0000000000..3bf67d452d
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardMem.c
@@ -0,0 +1,74 @@
+/** @file
+*
+*  Copyright (c) 2011, ARM Limited. All rights reserved.
+*
+*  SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#include <Library/ArmPlatformLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/IoLib.h>
+
+#include <BeagleBoard.h>
+
+#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS          4
+
+/**
+  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
+
+**/
+VOID
+ArmPlatformGetVirtualMemoryMap (
+  IN ARM_MEMORY_REGION_DESCRIPTOR** VirtualMemoryMap
+  )
+{
+  ARM_MEMORY_REGION_ATTRIBUTES  CacheAttributes;
+  UINTN                         Index = 0;
+  ARM_MEMORY_REGION_DESCRIPTOR  *VirtualMemoryTable;
+
+  ASSERT(VirtualMemoryMap != NULL);
+
+  VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR*)AllocatePages(EFI_SIZE_TO_PAGES (sizeof(ARM_MEMORY_REGION_DESCRIPTOR) * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS));
+  if (VirtualMemoryTable == NULL) {
+    return;
+  }
+
+  CacheAttributes = DDR_ATTRIBUTES_CACHED;
+
+  // ReMap (Either NOR Flash or DRAM)
+  VirtualMemoryTable[Index].PhysicalBase = PcdGet64 (PcdSystemMemoryBase);
+  VirtualMemoryTable[Index].VirtualBase  = PcdGet64 (PcdSystemMemoryBase);
+  VirtualMemoryTable[Index].Length       = PcdGet64 (PcdSystemMemorySize);
+  VirtualMemoryTable[Index].Attributes   = CacheAttributes;
+
+  // SOC Registers. L3 interconnects
+  VirtualMemoryTable[++Index].PhysicalBase = SOC_REGISTERS_L3_PHYSICAL_BASE;
+  VirtualMemoryTable[Index].VirtualBase  = SOC_REGISTERS_L3_PHYSICAL_BASE;
+  VirtualMemoryTable[Index].Length       = SOC_REGISTERS_L3_PHYSICAL_LENGTH;
+  VirtualMemoryTable[Index].Attributes   = SOC_REGISTERS_L3_ATTRIBUTES;
+
+  // SOC Registers. L4 interconnects
+  VirtualMemoryTable[++Index].PhysicalBase = SOC_REGISTERS_L4_PHYSICAL_BASE;
+  VirtualMemoryTable[Index].VirtualBase  = SOC_REGISTERS_L4_PHYSICAL_BASE;
+  VirtualMemoryTable[Index].Length       = SOC_REGISTERS_L4_PHYSICAL_LENGTH;
+  VirtualMemoryTable[Index].Attributes   = SOC_REGISTERS_L4_ATTRIBUTES;
+
+  // End of Table
+  VirtualMemoryTable[++Index].PhysicalBase = 0;
+  VirtualMemoryTable[Index].VirtualBase  = 0;
+  VirtualMemoryTable[Index].Length       = 0;
+  VirtualMemoryTable[Index].Attributes   = (ARM_MEMORY_REGION_ATTRIBUTES)0;
+
+  ASSERT((Index + 1) == MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
+
+  *VirtualMemoryMap = VirtualMemoryTable;
+}
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/Clock.c b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/Clock.c
new file mode 100644
index 0000000000..f7bf6e15e3
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/Clock.c
@@ -0,0 +1,63 @@
+/** @file
+
+  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/IoLib.h>
+#include <Library/DebugLib.h>
+
+#include <Omap3530/Omap3530.h>
+
+VOID
+ClockInit (
+  VOID
+  )
+{
+  //DPLL1 - DPLL4 are configured part of Configuration header which OMAP3 ROM parses.
+
+  // Enable PLL5 and set to 120 MHz as a reference clock.
+  MmioWrite32 (CM_CLKSEL4_PLL, CM_CLKSEL_PLL_MULT(120) | CM_CLKSEL_PLL_DIV(13));
+  MmioWrite32 (CM_CLKSEL5_PLL, CM_CLKSEL_DIV_120M(1));
+  MmioWrite32 (CM_CLKEN2_PLL, CM_CLKEN_FREQSEL_075_100 | CM_CLKEN_ENABLE);
+
+  // Turn on functional & interface clocks to the USBHOST power domain
+  MmioOr32(CM_FCLKEN_USBHOST, CM_FCLKEN_USBHOST_EN_USBHOST2_ENABLE
+                              | CM_FCLKEN_USBHOST_EN_USBHOST1_ENABLE);
+  MmioOr32(CM_ICLKEN_USBHOST, CM_ICLKEN_USBHOST_EN_USBHOST_ENABLE);
+
+  // Turn on functional & interface clocks to the USBTLL block.
+  MmioOr32(CM_FCLKEN3_CORE, CM_FCLKEN3_CORE_EN_USBTLL_ENABLE);
+  MmioOr32(CM_ICLKEN3_CORE, CM_ICLKEN3_CORE_EN_USBTLL_ENABLE);
+
+  // Turn on functional & interface clocks to MMC1 and I2C1 modules.
+  MmioOr32(CM_FCLKEN1_CORE, CM_FCLKEN1_CORE_EN_MMC1_ENABLE
+                            | CM_FCLKEN1_CORE_EN_I2C1_ENABLE);
+  MmioOr32(CM_ICLKEN1_CORE, CM_ICLKEN1_CORE_EN_MMC1_ENABLE
+                            | CM_ICLKEN1_CORE_EN_I2C1_ENABLE);
+
+  // Turn on functional & interface clocks to various Peripherals.
+  MmioOr32(CM_FCLKEN_PER, CM_FCLKEN_PER_EN_UART3_ENABLE
+                          | CM_FCLKEN_PER_EN_GPT4_ENABLE
+                          | CM_FCLKEN_PER_EN_GPIO2_ENABLE
+                          | CM_FCLKEN_PER_EN_GPIO3_ENABLE
+                          | CM_FCLKEN_PER_EN_GPIO4_ENABLE
+                          | CM_FCLKEN_PER_EN_GPIO5_ENABLE
+                          | CM_FCLKEN_PER_EN_GPIO6_ENABLE);
+  MmioOr32(CM_ICLKEN_PER, CM_ICLKEN_PER_EN_UART3_ENABLE
+                          | CM_ICLKEN_PER_EN_GPT3_ENABLE
+                          | CM_ICLKEN_PER_EN_GPT4_ENABLE
+                          | CM_ICLKEN_PER_EN_GPIO2_ENABLE
+                          | CM_ICLKEN_PER_EN_GPIO3_ENABLE
+                          | CM_ICLKEN_PER_EN_GPIO4_ENABLE
+                          | CM_ICLKEN_PER_EN_GPIO5_ENABLE
+                          | CM_ICLKEN_PER_EN_GPIO6_ENABLE);
+
+  // Turn on functional & inteface clocks to various wakeup modules.
+  MmioOr32(CM_FCLKEN_WKUP, CM_FCLKEN_WKUP_EN_GPIO1_ENABLE
+                           | CM_FCLKEN_WKUP_EN_WDT2_ENABLE);
+  MmioOr32(CM_ICLKEN_WKUP, CM_ICLKEN_WKUP_EN_GPIO1_ENABLE
+                           | CM_ICLKEN_WKUP_EN_WDT2_ENABLE);
+}
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/PadConfiguration.c b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/PadConfiguration.c
new file mode 100644
index 0000000000..396cf67c0e
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/BeagleBoardLib/PadConfiguration.c
@@ -0,0 +1,316 @@
+/** @file
+
+  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <PiPei.h>
+#include <Library/IoLib.h>
+#include <Library/DebugLib.h>
+#include <Omap3530/Omap3530.h>
+#include <BeagleBoard.h>
+
+#define NUM_PINS_SHARED 232
+#define NUM_PINS_ABC 6
+#define NUM_PINS_XM 12
+
+PAD_CONFIGURATION PadConfigurationTableShared[] = {
+  //Pin,           MuxMode,    PullConfig,                      InputEnable
+  { SDRC_D0,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D1,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D2,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D3,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D4,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D5,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D6,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D7,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D8,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D9,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D10,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D11,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D12,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D13,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D14,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D15,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D16,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D17,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D18,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D19,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D20,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D21,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D22,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D23,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D24,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D25,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D26,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D27,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D28,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D29,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D30,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_D31,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_CLK,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_DQS0,     MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_CKE0,     MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { SDRC_CKE1,     MUXMODE7,   PULL_DISABLED,                INPUT  },
+  { SDRC_DQS1,     MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_DQS2,     MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { SDRC_DQS3,     MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_A1,       MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_A2,       MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_A3,       MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_A4,       MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_A5,       MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_A6,       MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_A7,       MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_A8,       MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_A9,       MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_A10,      MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_D0,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D1,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D2,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D3,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D4,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D5,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D6,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D7,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D8,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D9,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D10,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D11,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D12,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D13,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D14,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_D15,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_NCS0,     MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_NCS1,     MUXMODE0,   PULL_UP_SELECTED,             OUTPUT },
+  { GPMC_NCS2,     MUXMODE0,   PULL_UP_SELECTED,             OUTPUT },
+  { GPMC_NCS3,     MUXMODE0,   PULL_UP_SELECTED,             OUTPUT },
+  { GPMC_NCS4,     MUXMODE0,   PULL_UP_SELECTED,             OUTPUT },
+  { GPMC_NCS5,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_NCS6,     MUXMODE1,   PULL_DISABLED,                INPUT  },
+  { GPMC_NCS7,     MUXMODE1,   PULL_UP_SELECTED,             INPUT  },
+  { GPMC_CLK,      MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_NADV_ALE, MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_NOE,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_NWE,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_NBE0_CLE, MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { GPMC_NBE1,     MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_NWP,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { GPMC_WAIT0,    MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { GPMC_WAIT1,    MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { GPMC_WAIT2,    MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { GPMC_WAIT3,    MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { DSS_PCLK,      MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_HSYNC,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_PSYNC,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_ACBIAS,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA0,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA1,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA2,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA3,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA4,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA5,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA6,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA7,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA8,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA9,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA10,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA11,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA12,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA13,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA14,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA15,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA16,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA17,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { CAM_HS,        MUXMODE0,   PULL_UP_SELECTED,             INPUT },
+  { CAM_VS,        MUXMODE0,   PULL_UP_SELECTED,             INPUT },
+  { CAM_XCLKA,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { CAM_PCLK,      MUXMODE0,   PULL_UP_SELECTED,             INPUT },
+  { CAM_FLD,       MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { CAM_D0,        MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D1,        MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D2,        MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D3,        MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D4,        MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D5,        MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D6,        MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D7,        MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D8,        MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D9,        MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D10,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_D11,       MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CAM_XCLKB,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { CAM_WEN,       MUXMODE4,   PULL_DISABLED,                INPUT  },
+  { CAM_STROBE,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { CSI2_DX0,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CSI2_DY0,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CSI2_DX1,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { CSI2_DY1,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { MCBSP2_FSX,    MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { MCBSP2_CLKX,   MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { MCBSP2_DR,     MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { MCBSP2_DX,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { MMC1_CLK,      MUXMODE0,   PULL_UP_SELECTED,             OUTPUT },
+  { MMC1_CMD,      MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { MMC1_DAT0,     MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { MMC1_DAT1,     MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { MMC1_DAT2,     MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { MMC1_DAT3,     MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { MMC1_DAT4,     MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { MMC1_DAT5,     MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { MMC1_DAT6,     MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { MMC1_DAT7,     MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { MMC2_CLK,      MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MMC2_CMD,      MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MMC2_DAT0,     MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MMC2_DAT1,     MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MMC2_DAT2,     MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MMC2_DAT3,     MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MMC2_DAT4,     MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MMC2_DAT5,     MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MMC2_DAT6,     MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MMC2_DAT7,     MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MCBSP3_DX,     MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { MCBSP3_DR,     MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { MCBSP3_CLKX,   MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { MCBSP3_FSX,    MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { UART2_CTS,     MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { UART2_RTS,     MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { UART2_TX,      MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { UART2_RX,      MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { UART1_TX,      MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { UART1_RTS,     MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { UART1_CTS,     MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { UART1_RX,      MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { MCBSP4_CLKX,   MUXMODE1,   PULL_DISABLED,                INPUT  },
+  { MCBSP4_DR,     MUXMODE1,   PULL_DISABLED,                INPUT  },
+  { MCBSP4_DX,     MUXMODE1,   PULL_DISABLED,                INPUT  },
+  { MCBSP4_FSX,    MUXMODE1,   PULL_DISABLED,                INPUT  },
+  { MCBSP1_CLKR,   MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { MCBSP1_FSR,    MUXMODE4,   PULL_UP_SELECTED,             OUTPUT },
+  { MCBSP1_DX,     MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { MCBSP1_DR,     MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { MCBSP1_CLKS,   MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { MCBSP1_FSX,    MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { MCBSP1_CLKX,   MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { UART3_CTS_RCTX,MUXMODE0,   PULL_UP_SELECTED,                 INPUT  },
+  { UART3_RTS_SD,  MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { UART3_RX_IRRX, MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { UART3_TX_IRTX, MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { HSUSB0_CLK,    MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { HSUSB0_STP,    MUXMODE0,   PULL_UP_SELECTED,             OUTPUT },
+  { HSUSB0_DIR,    MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { HSUSB0_NXT,    MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { HSUSB0_DATA0,  MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { HSUSB0_DATA1,  MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { HSUSB0_DATA2,  MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { HSUSB0_DATA3,  MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { HSUSB0_DATA4,  MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { HSUSB0_DATA5,  MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { HSUSB0_DATA6,  MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { HSUSB0_DATA7,  MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { I2C1_SCL,      MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { I2C1_SDA,      MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { I2C2_SCL,      MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { I2C2_SDA,      MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { I2C3_SCL,      MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { I2C3_SDA,      MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { HDQ_SIO,       MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { MCSPI1_CLK,    MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MCSPI1_SIMO,   MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { MCSPI1_SOMI,   MUXMODE0,   PULL_DISABLED,                INPUT  },
+  { MCSPI1_CS0,    MUXMODE0,   PULL_UP_SELECTED,                 INPUT  },
+  { MCSPI1_CS1,    MUXMODE0,   PULL_UP_SELECTED,                 OUTPUT },
+  { MCSPI1_CS2,    MUXMODE4,   PULL_DISABLED,                OUTPUT },
+  { MCSPI1_CS3,    MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { MCSPI2_CLK,    MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { MCSPI2_SIMO,   MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { MCSPI2_SOMI,   MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { MCSPI2_CS0,    MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { MCSPI2_CS1,    MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { SYS_NIRQ,      MUXMODE0,   PULL_UP_SELECTED,             INPUT  },
+  { SYS_CLKOUT2,   MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_CLK,       MUXMODE3,   PULL_UP_SELECTED,             OUTPUT },
+  { ETK_CTL,       MUXMODE3,   PULL_UP_SELECTED,             OUTPUT },
+  { ETK_D0,        MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D1,        MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D2,        MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D3,        MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D4,        MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D5,        MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D6,        MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D7,        MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D8,        MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D9,        MUXMODE4,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D10,       MUXMODE3,   PULL_UP_SELECTED,             OUTPUT },
+  { ETK_D11,       MUXMODE3,   PULL_UP_SELECTED,             OUTPUT },
+  { ETK_D12,       MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D13,       MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D14,       MUXMODE3,   PULL_UP_SELECTED,             INPUT  },
+  { ETK_D15,       MUXMODE3,   PULL_UP_SELECTED,             INPUT  }
+};
+
+PAD_CONFIGURATION PadConfigurationTableAbc[] = {
+  { DSS_DATA18,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA19,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA20,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA21,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA22,    MUXMODE0,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA23,    MUXMODE0,   PULL_DISABLED,                OUTPUT }
+};
+
+PAD_CONFIGURATION PadConfigurationTableXm[] = {
+  { DSS_DATA18,    MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA19,    MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA20,    MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA21,    MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA22,    MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { DSS_DATA23,    MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { SYS_BOOT0,     MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { SYS_BOOT1,     MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { SYS_BOOT3,     MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { SYS_BOOT4,     MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { SYS_BOOT5,     MUXMODE3,   PULL_DISABLED,                OUTPUT },
+  { SYS_BOOT6,     MUXMODE3,   PULL_DISABLED,                OUTPUT }
+};
+
+VOID
+PadConfiguration (
+  BEAGLEBOARD_REVISION Revision
+  )
+{
+  UINTN             Index;
+  UINT16            PadConfiguration;
+  PAD_CONFIGURATION *BoardConfiguration;
+  UINTN             NumPinsToConfigure;
+
+  for (Index = 0; Index < NUM_PINS_SHARED; Index++) {
+    // Set up Pad configuration for particular pin.
+    PadConfiguration =  (PadConfigurationTableShared[Index].MuxMode << MUXMODE_OFFSET);
+    PadConfiguration |= (PadConfigurationTableShared[Index].PullConfig << PULL_CONFIG_OFFSET);
+    PadConfiguration |= (PadConfigurationTableShared[Index].InputEnable << INPUTENABLE_OFFSET);
+
+    // Configure the pin with specific Pad configuration.
+    MmioWrite16(PadConfigurationTableShared[Index].Pin, PadConfiguration);
+  }
+
+  if (Revision == REVISION_XM) {
+    BoardConfiguration = PadConfigurationTableXm;
+    NumPinsToConfigure = NUM_PINS_XM;
+  } else {
+    BoardConfiguration = PadConfigurationTableAbc;
+    NumPinsToConfigure = NUM_PINS_ABC;
+  }
+
+  for (Index = 0; Index < NumPinsToConfigure; Index++) {
+    //Set up Pad configuration for particular pin.
+    PadConfiguration =  (BoardConfiguration[Index].MuxMode << MUXMODE_OFFSET);
+    PadConfiguration |= (BoardConfiguration[Index].PullConfig << PULL_CONFIG_OFFSET);
+    PadConfiguration |= (BoardConfiguration[Index].InputEnable << INPUTENABLE_OFFSET);
+
+    //Configure the pin with specific Pad configuration.
+    MmioWrite16(BoardConfiguration[Index].Pin, PadConfiguration);
+  }
+}
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c b/Platform/BeagleBoard/BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c
new file mode 100644
index 0000000000..cf9dede8a4
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c
@@ -0,0 +1,282 @@
+/** @file
+  PE/COFF Loader Library implementation that wraps a protocol passed up from
+  SEC/PEI via a HOB. This is done to save space.
+
+  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
+  Portions copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <PiDxe.h>
+#include <Library/DebugLib.h>
+#include <Library/HobLib.h>
+
+#include <Protocol/PeCoffLoader.h>
+
+
+PE_COFF_LOADER_PROTOCOL  *gPeCoffLoader = NULL;
+
+
+/**
+  Retrieves information about a PE/COFF image.
+
+  Computes the PeCoffHeaderOffset, IsTeImage, ImageType, ImageAddress, ImageSize,
+  DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders, and
+  DebugDirectoryEntryRva fields of the ImageContext structure.
+  If ImageContext is NULL, then return RETURN_INVALID_PARAMETER.
+  If the PE/COFF image accessed through the ImageRead service in the ImageContext
+  structure is not a supported PE/COFF image type, then return RETURN_UNSUPPORTED.
+  If any errors occur while computing the fields of ImageContext,
+  then the error status is returned in the ImageError field of ImageContext.
+  If the image is a TE image, then SectionAlignment is set to 0.
+  The ImageRead and Handle fields of ImageContext structure must be valid prior
+  to invoking this service.
+
+  @param  ImageContext              Pointer to the image context structure that describes the PE/COFF
+                                    image that needs to be examined by this function.
+
+  @retval RETURN_SUCCESS            The information on the PE/COFF image was collected.
+  @retval RETURN_INVALID_PARAMETER  ImageContext is NULL.
+  @retval RETURN_UNSUPPORTED        The PE/COFF image is not supported.
+
+**/
+RETURN_STATUS
+EFIAPI
+PeCoffLoaderGetImageInfo (
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
+  )
+{
+  return gPeCoffLoader->GetImageInfo (ImageContext);
+}
+
+
+/**
+  Applies relocation fixups to a PE/COFF image that was loaded with PeCoffLoaderLoadImage().
+
+  If the DestinationAddress field of ImageContext is 0, then use the ImageAddress field of
+  ImageContext as the relocation base address.  Otherwise, use the DestinationAddress field
+  of ImageContext as the relocation base address.  The caller must allocate the relocation
+  fixup log buffer and fill in the FixupData field of ImageContext prior to calling this function.
+
+  The ImageRead, Handle, PeCoffHeaderOffset, IsTeImage, Machine, ImageType, ImageAddress,
+  ImageSize, DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders,
+  DebugDirectoryEntryRva, EntryPoint, FixupDataSize, CodeView, PdbPointer, and FixupData of
+  the ImageContext structure must be valid prior to invoking this service.
+
+  If ImageContext is NULL, then ASSERT().
+
+  Note that if the platform does not maintain coherency between the instruction cache(s) and the data
+  cache(s) in hardware, then the caller is responsible for performing cache maintenance operations
+  prior to transferring control to a PE/COFF image that is loaded using this library.
+
+  @param  ImageContext        Pointer to the image context structure that describes the PE/COFF
+                              image that is being relocated.
+
+  @retval RETURN_SUCCESS      The PE/COFF image was relocated.
+                              Extended status information is in the ImageError field of ImageContext.
+  @retval RETURN_LOAD_ERROR   The image in not a valid PE/COFF image.
+                              Extended status information is in the ImageError field of ImageContext.
+  @retval RETURN_UNSUPPORTED  A relocation record type is not supported.
+                              Extended status information is in the ImageError field of ImageContext.
+
+**/
+RETURN_STATUS
+EFIAPI
+PeCoffLoaderRelocateImage (
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
+  )
+{
+  return gPeCoffLoader->RelocateImage (ImageContext);
+}
+
+/**
+  Loads a PE/COFF image into memory.
+
+  Loads the PE/COFF image accessed through the ImageRead service of ImageContext into the buffer
+  specified by the ImageAddress and ImageSize fields of ImageContext.  The caller must allocate
+  the load buffer and fill in the ImageAddress and ImageSize fields prior to calling this function.
+  The EntryPoint, FixupDataSize, CodeView, PdbPointer and HiiResourceData fields of ImageContext are computed.
+  The ImageRead, Handle, PeCoffHeaderOffset, IsTeImage, Machine, ImageType, ImageAddress, ImageSize,
+  DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders, and DebugDirectoryEntryRva
+  fields of the ImageContext structure must be valid prior to invoking this service.
+
+  If ImageContext is NULL, then ASSERT().
+
+  Note that if the platform does not maintain coherency between the instruction cache(s) and the data
+  cache(s) in hardware, then the caller is responsible for performing cache maintenance operations
+  prior to transferring control to a PE/COFF image that is loaded using this library.
+
+  @param  ImageContext              Pointer to the image context structure that describes the PE/COFF
+                                    image that is being loaded.
+
+  @retval RETURN_SUCCESS            The PE/COFF image was loaded into the buffer specified by
+                                    the ImageAddress and ImageSize fields of ImageContext.
+                                    Extended status information is in the ImageError field of ImageContext.
+  @retval RETURN_BUFFER_TOO_SMALL   The caller did not provide a large enough buffer.
+                                    Extended status information is in the ImageError field of ImageContext.
+  @retval RETURN_LOAD_ERROR         The PE/COFF image is an EFI Runtime image with no relocations.
+                                    Extended status information is in the ImageError field of ImageContext.
+  @retval RETURN_INVALID_PARAMETER  The image address is invalid.
+                                    Extended status information is in the ImageError field of ImageContext.
+
+**/
+RETURN_STATUS
+EFIAPI
+PeCoffLoaderLoadImage (
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
+  )
+{
+  return gPeCoffLoader->LoadImage (ImageContext);
+}
+
+
+
+/**
+  Reads contents of a PE/COFF image from a buffer in system memory.
+
+  This is the default implementation of a PE_COFF_LOADER_READ_FILE function
+  that assumes FileHandle pointer to the beginning of a PE/COFF image.
+  This function reads contents of the PE/COFF image that starts at the system memory
+  address specified by FileHandle. The read operation copies ReadSize bytes from the
+  PE/COFF image starting at byte offset FileOffset into the buffer specified by Buffer.
+  The size of the buffer actually read is returned in ReadSize.
+
+  If FileHandle is NULL, then ASSERT().
+  If ReadSize is NULL, then ASSERT().
+  If Buffer is NULL, then ASSERT().
+
+  @param  FileHandle        Pointer to base of the input stream
+  @param  FileOffset        Offset into the PE/COFF image to begin the read operation.
+  @param  ReadSize          On input, the size in bytes of the requested read operation.
+                            On output, the number of bytes actually read.
+  @param  Buffer            Output buffer that contains the data read from the PE/COFF image.
+
+  @retval RETURN_SUCCESS    Data is read from FileOffset from the Handle into
+                            the buffer.
+**/
+RETURN_STATUS
+EFIAPI
+PeCoffLoaderImageReadFromMemory (
+  IN     VOID    *FileHandle,
+  IN     UINTN   FileOffset,
+  IN OUT UINTN   *ReadSize,
+  OUT    VOID    *Buffer
+  )
+{
+  return gPeCoffLoader->ReadFromMemory (
+                          FileHandle,
+                          FileOffset,
+                          ReadSize,
+                          Buffer
+                          );
+
+}
+
+
+
+/**
+  Reapply fixups on a fixed up PE32/PE32+ image to allow virutal calling at EFI
+  runtime.
+
+  This function reapplies relocation fixups to the PE/COFF image specified by ImageBase
+  and ImageSize so the image will execute correctly when the PE/COFF image is mapped
+  to the address specified by VirtualImageBase. RelocationData must be identical
+  to the FiuxupData buffer from the PE_COFF_LOADER_IMAGE_CONTEXT structure
+  after this PE/COFF image was relocated with PeCoffLoaderRelocateImage().
+
+  Note that if the platform does not maintain coherency between the instruction cache(s) and the data
+  cache(s) in hardware, then the caller is responsible for performing cache maintenance operations
+  prior to transferring control to a PE/COFF image that is loaded using this library.
+
+  @param  ImageBase          Base address of a PE/COFF image that has been loaded
+                             and relocated into system memory.
+  @param  VirtImageBase      The request virtual address that the PE/COFF image is to
+                             be fixed up for.
+  @param  ImageSize          The size, in bytes, of the PE/COFF image.
+  @param  RelocationData     A pointer to the relocation data that was collected when the PE/COFF
+                             image was relocated using PeCoffLoaderRelocateImage().
+
+**/
+VOID
+EFIAPI
+PeCoffLoaderRelocateImageForRuntime (
+  IN  PHYSICAL_ADDRESS        ImageBase,
+  IN  PHYSICAL_ADDRESS        VirtImageBase,
+  IN  UINTN                   ImageSize,
+  IN  VOID                    *RelocationData
+  )
+{
+  return gPeCoffLoader->RelocateImageForRuntime (
+                          ImageBase,
+                          VirtImageBase,
+                          ImageSize,
+                          RelocationData
+                          );
+}
+
+
+/**
+  Unloads a loaded PE/COFF image from memory and releases its taken resource.
+  Releases any environment specific resources that were allocated when the image
+  specified by ImageContext was loaded using PeCoffLoaderLoadImage().
+
+  For NT32 emulator, the PE/COFF image loaded by system needs to release.
+  For real platform, the PE/COFF image loaded by Core doesn't needs to be unloaded,
+  this function can simply return RETURN_SUCCESS.
+
+  If ImageContext is NULL, then ASSERT().
+
+  @param  ImageContext              Pointer to the image context structure that describes the PE/COFF
+                                    image to be unloaded.
+
+  @retval RETURN_SUCCESS            The PE/COFF image was unloaded successfully.
+**/
+RETURN_STATUS
+EFIAPI
+PeCoffLoaderUnloadImage (
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
+  )
+{
+  return gPeCoffLoader->UnloadImage (ImageContext);
+}
+
+typedef struct {
+  EFI_HOB_GUID_TYPE             Hob;
+  VOID                          *Interface;
+} PROTOCOL_HOB;
+
+
+/**
+  The constructor function caches the pointer of DXE Services Table.
+
+  The constructor function caches the pointer of DXE Services Table.
+  It will ASSERT() if that operation fails.
+  It will ASSERT() if the pointer of DXE Services Table is NULL.
+  It will always return EFI_SUCCESS.
+
+  @param  ImageHandle   The firmware allocated handle for the EFI image.
+  @param  SystemTable   A pointer to the EFI System Table.
+
+  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.
+
+**/
+EFI_STATUS
+EFIAPI
+DxeHobPeCoffLibConstructor (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  PROTOCOL_HOB   *Hob;
+
+  Hob = GetFirstGuidHob (&gPeCoffLoaderProtocolGuid);
+  if (Hob == NULL) {
+    return EFI_NOT_FOUND;
+  }
+
+  gPeCoffLoader = Hob->Interface;
+  return EFI_SUCCESS;
+}
+
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf b/Platform/BeagleBoard/BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
new file mode 100644
index 0000000000..654bd8c874
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
@@ -0,0 +1,39 @@
+#/** @file
+#  PE/COFF Loader Library implementation that wraps a protocol passed up from
+#  SEC/PEI via a HOB. This is done to save space.
+#
+#  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
+#  Portions copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = DxeHobPeCoffLib
+  FILE_GUID                      = 671C6FD7-99FB-4EE3-B640-4B1D463BC3B5
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = PeCoffLib
+  CONSTRUCTOR                    = DxeHobPeCoffLibConstructor
+
+
+#
+#  VALID_ARCHITECTURES           = IA32 X64 EBC ARM
+#
+
+[Sources.common]
+  DxeHobPeCoff.c
+
+
+[Packages]
+  MdePkg/MdePkg.dec
+  EmbeddedPkg/EmbeddedPkg.dec
+
+[LibraryClasses]
+  DebugLib
+  HobLib
+
+[Protocols]
+  gPeCoffLoaderProtocolGuid
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.c b/Platform/BeagleBoard/BeagleBoardPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.c
new file mode 100644
index 0000000000..5c4211827a
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.c
@@ -0,0 +1,44 @@
+/** @file
+  LZMA Decompress GUIDed Section Extraction Library.
+  It wraps Lzma decompress interfaces to GUIDed Section Extraction interfaces
+  and registers them into GUIDed handler table.
+
+  Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <PiDxe.h>
+#include <Library/HobLib.h>
+#include <Library/ExtractGuidedSectionLib.h>
+
+#include <Guid/ExtractSection.h>
+#include <Guid/LzmaDecompress.h>
+
+
+/**
+  Register LzmaDecompress and LzmaDecompressGetInfo handlers with LzmaCustomerDecompressGuid.
+
+  @retval  RETURN_SUCCESS            Register successfully.
+  @retval  RETURN_OUT_OF_RESOURCES   No enough memory to store this handler.
+**/
+EFI_STATUS
+EFIAPI
+LzmaDecompressLibConstructor (
+  )
+{
+  EXTRACT_SECTION_HOB   *Hob;
+
+  Hob = GetFirstGuidHob (&gLzmaCustomDecompressGuid);
+  if (Hob == NULL) {
+    return EFI_NOT_FOUND;
+  }
+
+  // Locate Guided Hob
+
+  return ExtractGuidedSectionRegisterHandlers (
+          &gLzmaCustomDecompressGuid,
+          Hob->Data.SectionGetInfo,
+          Hob->Data.SectionExtraction
+          );
+}
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf b/Platform/BeagleBoard/BeagleBoardPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf
new file mode 100644
index 0000000000..0bad5eeed1
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf
@@ -0,0 +1,45 @@
+#/** @file
+#  LzmaCustomDecompressLib produces LZMA custom decompression algorithm.
+#
+#  It is based on the LZMA SDK 4.65.
+#  LZMA SDK 4.65 was placed in the public domain on 2009-02-03.
+#  It was released on the http://www.7-zip.org/sdk.html website.
+#
+#  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = LzmaDecompressLib
+  FILE_GUID                      = 35194660-7421-44ad-9636-e44885f092d1
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = NULL
+  CONSTRUCTOR                    = LzmaDecompressLibConstructor
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64 EBC
+#
+
+[Sources.common]
+  LzmaHobCustomDecompressLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  EmbeddedPkg/EmbeddedPkg.dec
+
+[Guids]
+  gLzmaCustomDecompressGuid  ## PRODUCED  ## GUID specifies LZMA custom decompress algorithm.
+
+[LibraryClasses]
+  DebugLib
+  HobLib
+  ExtractGuidedSectionLib
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.c b/Platform/BeagleBoard/BeagleBoardPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.c
new file mode 100644
index 0000000000..1e7a63e4be
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.c
@@ -0,0 +1,192 @@
+/** @file
+*
+*  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
+*
+*  SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#include <PiPei.h>
+
+#include <Library/ArmMmuLib.h>
+#include <Library/ArmPlatformLib.h>
+#include <Library/DebugLib.h>
+#include <Library/HobLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PcdLib.h>
+
+VOID
+BuildMemoryTypeInformationHob (
+  VOID
+  );
+
+STATIC
+VOID
+InitMmu (
+  IN ARM_MEMORY_REGION_DESCRIPTOR  *MemoryTable
+  )
+{
+
+  VOID                          *TranslationTableBase;
+  UINTN                         TranslationTableSize;
+  RETURN_STATUS                 Status;
+
+  //Note: Because we called PeiServicesInstallPeiMemory() before to call InitMmu() the MMU Page Table resides in
+  //      DRAM (even at the top of DRAM as it is the first permanent memory allocation)
+  Status = ArmConfigureMmu (MemoryTable, &TranslationTableBase, &TranslationTableSize);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((EFI_D_ERROR, "Error: Failed to enable MMU\n"));
+  }
+}
+
+/*++
+
+Routine Description:
+
+
+
+Arguments:
+
+  FileHandle  - Handle of the file being invoked.
+  PeiServices - Describes the list of possible PEI Services.
+
+Returns:
+
+  Status -  EFI_SUCCESS if the boot mode could be set
+
+--*/
+EFI_STATUS
+EFIAPI
+MemoryPeim (
+  IN EFI_PHYSICAL_ADDRESS               UefiMemoryBase,
+  IN UINT64                             UefiMemorySize
+  )
+{
+  ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable;
+  EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttributes;
+  UINT64                       ResourceLength;
+  EFI_PEI_HOB_POINTERS         NextHob;
+  EFI_PHYSICAL_ADDRESS         FdTop;
+  EFI_PHYSICAL_ADDRESS         SystemMemoryTop;
+  EFI_PHYSICAL_ADDRESS         ResourceTop;
+  BOOLEAN                      Found;
+
+  // Get Virtual Memory Map from the Platform Library
+  ArmPlatformGetVirtualMemoryMap (&MemoryTable);
+
+  // Ensure PcdSystemMemorySize has been set
+  ASSERT (PcdGet64 (PcdSystemMemorySize) != 0);
+
+  //
+  // Now, the permanent memory has been installed, we can call AllocatePages()
+  //
+  ResourceAttributes = (
+      EFI_RESOURCE_ATTRIBUTE_PRESENT |
+      EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
+      EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
+      EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
+      EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
+      EFI_RESOURCE_ATTRIBUTE_TESTED
+  );
+
+  //
+  // Check if the resource for the main system memory has been declared
+  //
+  Found = FALSE;
+  NextHob.Raw = GetHobList ();
+  while ((NextHob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, NextHob.Raw)) != NULL) {
+    if ((NextHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) &&
+        (PcdGet64 (PcdSystemMemoryBase) >= NextHob.ResourceDescriptor->PhysicalStart) &&
+        (NextHob.ResourceDescriptor->PhysicalStart + NextHob.ResourceDescriptor->ResourceLength <= PcdGet64 (PcdSystemMemoryBase) + PcdGet64 (PcdSystemMemorySize)))
+    {
+      Found = TRUE;
+      break;
+    }
+    NextHob.Raw = GET_NEXT_HOB (NextHob);
+  }
+
+  if (!Found) {
+    // Reserved the memory space occupied by the firmware volume
+    BuildResourceDescriptorHob (
+        EFI_RESOURCE_SYSTEM_MEMORY,
+        ResourceAttributes,
+        PcdGet64 (PcdSystemMemoryBase),
+        PcdGet64 (PcdSystemMemorySize)
+    );
+  }
+
+  //
+  // Reserved the memory space occupied by the firmware volume
+  //
+
+  SystemMemoryTop = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdSystemMemoryBase) + (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdSystemMemorySize);
+  FdTop = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFdBaseAddress) + (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFdSize);
+
+  // EDK2 does not have the concept of boot firmware copied into DRAM. To avoid the DXE
+  // core to overwrite this area we must mark the region with the attribute non-present
+  if ((PcdGet64 (PcdFdBaseAddress) >= PcdGet64 (PcdSystemMemoryBase)) && (FdTop <= SystemMemoryTop)) {
+    Found = FALSE;
+
+    // Search for System Memory Hob that contains the firmware
+    NextHob.Raw = GetHobList ();
+    while ((NextHob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, NextHob.Raw)) != NULL) {
+      if ((NextHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) &&
+          (PcdGet64 (PcdFdBaseAddress) >= NextHob.ResourceDescriptor->PhysicalStart) &&
+          (FdTop <= NextHob.ResourceDescriptor->PhysicalStart + NextHob.ResourceDescriptor->ResourceLength))
+      {
+        ResourceAttributes = NextHob.ResourceDescriptor->ResourceAttribute;
+        ResourceLength = NextHob.ResourceDescriptor->ResourceLength;
+        ResourceTop = NextHob.ResourceDescriptor->PhysicalStart + ResourceLength;
+
+        if (PcdGet64 (PcdFdBaseAddress) == NextHob.ResourceDescriptor->PhysicalStart) {
+          if (SystemMemoryTop == FdTop) {
+            NextHob.ResourceDescriptor->ResourceAttribute = ResourceAttributes & ~EFI_RESOURCE_ATTRIBUTE_PRESENT;
+          } else {
+            // Create the System Memory HOB for the firmware with the non-present attribute
+            BuildResourceDescriptorHob (EFI_RESOURCE_SYSTEM_MEMORY,
+                                        ResourceAttributes & ~EFI_RESOURCE_ATTRIBUTE_PRESENT,
+                                        PcdGet64 (PcdFdBaseAddress),
+                                        PcdGet32 (PcdFdSize));
+
+            // Top of the FD is system memory available for UEFI
+            NextHob.ResourceDescriptor->PhysicalStart += PcdGet32(PcdFdSize);
+            NextHob.ResourceDescriptor->ResourceLength -= PcdGet32(PcdFdSize);
+          }
+        } else {
+          // Create the System Memory HOB for the firmware with the non-present attribute
+          BuildResourceDescriptorHob (EFI_RESOURCE_SYSTEM_MEMORY,
+                                      ResourceAttributes & ~EFI_RESOURCE_ATTRIBUTE_PRESENT,
+                                      PcdGet64 (PcdFdBaseAddress),
+                                      PcdGet32 (PcdFdSize));
+
+          // Update the HOB
+          NextHob.ResourceDescriptor->ResourceLength = PcdGet64 (PcdFdBaseAddress) - NextHob.ResourceDescriptor->PhysicalStart;
+
+          // If there is some memory available on the top of the FD then create a HOB
+          if (FdTop < NextHob.ResourceDescriptor->PhysicalStart + ResourceLength) {
+            // Create the System Memory HOB for the remaining region (top of the FD)
+            BuildResourceDescriptorHob (EFI_RESOURCE_SYSTEM_MEMORY,
+                                        ResourceAttributes,
+                                        FdTop,
+                                        ResourceTop - FdTop);
+          }
+        }
+        Found = TRUE;
+        break;
+      }
+      NextHob.Raw = GET_NEXT_HOB (NextHob);
+    }
+
+    ASSERT(Found);
+  }
+
+  // Build Memory Allocation Hob
+  InitMmu (MemoryTable);
+
+  if (FeaturePcdGet (PcdPrePiProduceMemoryTypeInformationHob)) {
+    // Optional feature that helps prevent EFI memory map fragmentation.
+    BuildMemoryTypeInformationHob ();
+  }
+
+  return EFI_SUCCESS;
+}
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf b/Platform/BeagleBoard/BeagleBoardPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf
new file mode 100644
index 0000000000..cbb15eb4c4
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf
@@ -0,0 +1,58 @@
+#/** @file
+#
+#  Copyright (c) 2011-2014, ARM Ltd. All rights reserved.<BR>
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = BeagleBoardMemoryInitPeiLib
+  FILE_GUID                      = e489db0a-d847-4d67-910b-48a833f6fef5
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = MemoryInitPeiLib|SEC PEIM
+
+[Sources]
+  MemoryInitPeiLib.c
+
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  EmbeddedPkg/EmbeddedPkg.dec
+  ArmPkg/ArmPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
+
+[LibraryClasses]
+  DebugLib
+  HobLib
+  ArmMmuLib
+  ArmPlatformLib
+
+[Guids]
+  gEfiMemoryTypeInformationGuid
+
+[FeaturePcd]
+  gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob
+
+[FixedPcd]
+  gArmTokenSpaceGuid.PcdFdBaseAddress
+  gArmTokenSpaceGuid.PcdFdSize
+
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
+
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesCode
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesData
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderCode
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderData
+
+[Pcd]
+  gArmTokenSpaceGuid.PcdSystemMemoryBase
+  gArmTokenSpaceGuid.PcdSystemMemorySize
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.c b/Platform/BeagleBoard/BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.c
new file mode 100644
index 0000000000..f3e0201a6f
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.c
@@ -0,0 +1,149 @@
+/** @file
+  Do a generic Cold Reset for OMAP3550 and BeagleBoard specific Warm reset
+
+  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+  Copyright (c) 2017, Linaro Ltd. All rights reserved.<BR>
+  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+
+#include <Uefi.h>
+
+#include <Library/IoLib.h>
+#include <Library/ResetSystemLib.h>
+
+#include <Omap3530/Omap3530.h>
+
+/**
+  This function causes a system-wide reset (cold reset), in which
+  all circuitry within the system returns to its initial state. This type of
+  reset is asynchronous to system operation and operates without regard to
+  cycle boundaries.
+
+  If this function returns, it means that the system does not support cold
+  reset.
+**/
+VOID
+EFIAPI
+ResetCold (
+  VOID
+  )
+{
+  //Perform cold reset of the system.
+  MmioOr32 (PRM_RSTCTRL, RST_DPLL3);
+  while ((MmioRead32(PRM_RSTST) & GLOBAL_COLD_RST) != 0x1);
+}
+
+/**
+  This function causes a system-wide initialization (warm reset), in which all
+  processors are set to their initial state. Pending cycles are not corrupted.
+
+  If this function returns, it means that the system does not support warm
+  reset.
+**/
+VOID
+EFIAPI
+ResetWarm (
+  VOID
+  )
+{
+  ResetCold ();
+}
+
+/**
+  This function causes the system to enter a power state equivalent
+  to the ACPI G2/S5 or G3 states.
+
+  If this function returns, it means that the system does not support shut down
+  reset.
+**/
+VOID
+EFIAPI
+ResetShutdown (
+  VOID
+  )
+{
+  // not implemented
+}
+
+/**
+  This function causes the system to enter S3 and then wake up immediately.
+
+  If this function returns, it means that the system does not support S3
+  feature.
+**/
+VOID
+EFIAPI
+EnterS3WithImmediateWake (
+  VOID
+  )
+{
+  // not implemented
+}
+
+/**
+  This function causes a systemwide reset. The exact type of the reset is
+  defined by the EFI_GUID that follows the Null-terminated Unicode string passed
+  into ResetData. If the platform does not recognize the EFI_GUID in ResetData
+  the platform must pick a supported reset type to perform.The platform may
+  optionally log the parameters from any non-normal reset that occurs.
+
+  @param[in]  DataSize   The size, in bytes, of ResetData.
+  @param[in]  ResetData  The data buffer starts with a Null-terminated string,
+                         followed by the EFI_GUID.
+**/
+VOID
+EFIAPI
+ResetPlatformSpecific (
+  IN UINTN   DataSize,
+  IN VOID    *ResetData
+  )
+{
+  ResetCold ();
+}
+
+/**
+  The ResetSystem function resets the entire platform.
+
+  @param[in] ResetType      The type of reset to perform.
+  @param[in] ResetStatus    The status code for the reset.
+  @param[in] DataSize       The size, in bytes, of ResetData.
+  @param[in] ResetData      For a ResetType of EfiResetCold, EfiResetWarm, or EfiResetShutdown
+                            the data buffer starts with a Null-terminated string, optionally
+                            followed by additional binary data. The string is a description
+                            that the caller may use to further indicate the reason for the
+                            system reset.
+**/
+VOID
+EFIAPI
+ResetSystem (
+  IN EFI_RESET_TYPE               ResetType,
+  IN EFI_STATUS                   ResetStatus,
+  IN UINTN                        DataSize,
+  IN VOID                         *ResetData OPTIONAL
+  )
+{
+  switch (ResetType) {
+  case EfiResetWarm:
+    ResetWarm ();
+    break;
+
+  case EfiResetCold:
+    ResetCold ();
+    break;
+
+  case EfiResetShutdown:
+    ResetShutdown ();
+    return;
+
+  case EfiResetPlatformSpecific:
+    ResetPlatformSpecific (DataSize, ResetData);
+    return;
+
+  default:
+    return;
+  }
+}
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.inf b/Platform/BeagleBoard/BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.inf
new file mode 100644
index 0000000000..3f50b21c18
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.inf
@@ -0,0 +1,37 @@
+#/** @file
+# Reset System lib to make it easy to port new platforms
+#
+# Copyright (c) 2008, Apple Inc. All rights reserved.<BR>
+# Copyright (c) 2017, Linaro Ltd. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = BeagleBoardResetSystemLib
+  FILE_GUID                      = 781371a2-3fdd-41d4-96a1-7b34cbc9e895
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = ResetSystemLib
+
+
+[Sources.common]
+  ResetSystemLib.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  Omap35xxPkg/Omap35xxPkg.dec
+
+[Pcd.common]
+  gArmTokenSpaceGuid.PcdCpuResetAddress
+
+[LibraryClasses]
+  IoLib
+
+[Pcd]
+  gArmTokenSpaceGuid.PcdFvBaseAddress
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ArchPrePi.c b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ArchPrePi.c
new file mode 100644
index 0000000000..250b622f45
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ArchPrePi.c
@@ -0,0 +1,23 @@
+/** @file
+*
+*  Copyright (c) 2011 - 2013, ARM Limited. All rights reserved.
+*
+*  SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#include "PrePi.h"
+
+VOID
+ArchInitialize (
+  VOID
+  )
+{
+  // Enable program flow prediction, if supported.
+  ArmEnableBranchPrediction ();
+
+  if (FixedPcdGet32 (PcdVFPEnabled)) {
+    ArmEnableVFP ();
+  }
+}
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ModuleEntryPoint.S b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ModuleEntryPoint.S
new file mode 100644
index 0000000000..ff7e3a4548
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ModuleEntryPoint.S
@@ -0,0 +1,124 @@
+//
+//  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
+//
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+//
+
+#include <AsmMacroIoLib.h>
+
+#include <Chipset/ArmV7.h>
+
+ASM_FUNC(_ModuleEntryPoint)
+  // Do early platform specific actions
+  bl    ASM_PFX(ArmPlatformPeiBootAction)
+
+  // Get ID of this CPU in Multicore system
+  bl    ASM_PFX(ArmReadMpidr)
+  // Keep a copy of the MpId register value
+  mov   r8, r0
+
+_SetSVCMode:
+  // Enter SVC mode, Disable FIQ and IRQ
+  mov     r1, #(CPSR_MODE_SVC | CPSR_IRQ | CPSR_FIQ)
+  msr     CPSR_c, r1
+
+// Check if we can install the stack at the top of the System Memory or if we need
+// to install the stacks at the bottom of the Firmware Device (case the FD is located
+// at the top of the DRAM)
+_SystemMemoryEndInit:
+  ADRL  (r1, mSystemMemoryEnd)
+  ldrd  r2, r3, [r1]
+  teq   r3, #0
+  moveq r1, r2
+  mvnne r1, #0
+
+_SetupStackPosition:
+  // r1 = SystemMemoryTop
+
+  // Calculate Top of the Firmware Device
+  MOV32 (r2, FixedPcdGet32(PcdFdBaseAddress))
+  MOV32 (r3, FixedPcdGet32(PcdFdSize) - 1)
+  add   r3, r3, r2      // r3 = FdTop = PcdFdBaseAddress + PcdFdSize
+
+  // UEFI Memory Size (stacks are allocated in this region)
+  MOV32 (r4, FixedPcdGet32(PcdSystemMemoryUefiRegionSize))
+
+  //
+  // Reserve the memory for the UEFI region (contain stacks on its top)
+  //
+
+  // Calculate how much space there is between the top of the Firmware and the Top of the System Memory
+  subs  r0, r1, r3      // r0 = SystemMemoryTop - FdTop
+  bmi   _SetupStack     // Jump if negative (FdTop > SystemMemoryTop). Case when the PrePi is in XIP memory outside of the DRAM
+  cmp   r0, r4
+  bge   _SetupStack
+
+  // Case the top of stacks is the FdBaseAddress
+  mov   r1, r2
+
+_SetupStack:
+  // r1 contains the top of the stack (and the UEFI Memory)
+
+  // Because the 'push' instruction is equivalent to 'stmdb' (decrement before), we need to increment
+  // one to the top of the stack. We check if incrementing one does not overflow (case of DRAM at the
+  // top of the memory space)
+  adds  r9, r1, #1
+  bcs   _SetupOverflowStack
+
+_SetupAlignedStack:
+  mov   r1, r9
+  b     _GetBaseUefiMemory
+
+_SetupOverflowStack:
+  // Case memory at the top of the address space. Ensure the top of the stack is EFI_PAGE_SIZE
+  // aligned (4KB)
+  MOV32 (r9, ~EFI_PAGE_MASK & 0xFFFFFFFF)
+  and   r1, r1, r9
+
+_GetBaseUefiMemory:
+  // Calculate the Base of the UEFI Memory
+  sub   r9, r1, r4
+
+_GetStackBase:
+  // r1 = The top of the Mpcore Stacks
+  // Stack for the primary core = PrimaryCoreStack
+  MOV32 (r2, FixedPcdGet32(PcdCPUCorePrimaryStackSize))
+  sub   r10, r1, r2
+
+  // Stack for the secondary core = Number of Cores - 1
+  MOV32 (r1, (FixedPcdGet32(PcdCoreCount) - 1) * FixedPcdGet32(PcdCPUCoreSecondaryStackSize))
+  sub   r10, r10, r1
+
+  // r10 = The base of the MpCore Stacks (primary stack & secondary stacks)
+  mov   r0, r10
+  mov   r1, r8
+  //ArmPlatformStackSet(StackBase, MpId, PrimaryStackSize, SecondaryStackSize)
+  MOV32 (r2, FixedPcdGet32(PcdCPUCorePrimaryStackSize))
+  MOV32 (r3, FixedPcdGet32(PcdCPUCoreSecondaryStackSize))
+  bl    ASM_PFX(ArmPlatformStackSet)
+
+  // Is it the Primary Core ?
+  mov   r0, r8
+  bl    ASM_PFX(ArmPlatformIsPrimaryCore)
+  cmp   r0, #1
+  bne   _PrepareArguments
+
+_PrepareArguments:
+  mov   r0, r8
+  mov   r1, r9
+  mov   r2, r10
+  mov   r3, sp
+
+  // Move sec startup address into a data register
+  // Ensure we're jumping to FV version of the code (not boot remapped alias)
+  ldr   r4, =ASM_PFX(CEntryPoint)
+
+  // Jump to PrePiCore C code
+  //    r0 = MpId
+  //    r1 = UefiMemoryBase
+  //    r2 = StacksBase
+  blx   r4
+
+_NeverReturn:
+  b _NeverReturn
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ModuleEntryPoint.asm b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ModuleEntryPoint.asm
new file mode 100644
index 0000000000..3da7892051
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/Arm/ModuleEntryPoint.asm
@@ -0,0 +1,142 @@
+//
+//  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
+//
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+//
+
+#include <AutoGen.h>
+#include <Chipset/ArmV7.h>
+
+  INCLUDE AsmMacroIoLib.inc
+
+  IMPORT  CEntryPoint
+  IMPORT  ArmPlatformIsPrimaryCore
+  IMPORT  ArmReadMpidr
+  IMPORT  ArmPlatformPeiBootAction
+  IMPORT  ArmPlatformStackSet
+  IMPORT  mSystemMemoryEnd
+
+  EXPORT  _ModuleEntryPoint
+
+  PRESERVE8
+  AREA    PrePiCoreEntryPoint, CODE, READONLY
+
+StartupAddr        DCD      CEntryPoint
+
+_ModuleEntryPoint
+  // Do early platform specific actions
+  bl    ArmPlatformPeiBootAction
+
+  // Get ID of this CPU in Multicore system
+  bl    ArmReadMpidr
+  // Keep a copy of the MpId register value
+  mov   r8, r0
+
+_SetSVCMode
+  // Enter SVC mode, Disable FIQ and IRQ
+  mov     r1, #(CPSR_MODE_SVC :OR: CPSR_IRQ :OR: CPSR_FIQ)
+  msr     CPSR_c, r1
+
+// Check if we can install the stack at the top of the System Memory or if we need
+// to install the stacks at the bottom of the Firmware Device (case the FD is located
+// at the top of the DRAM)
+_SystemMemoryEndInit
+  adrll r1, mSystemMemoryEnd
+  ldrd  r2, r3, [r1]
+  teq   r3, #0
+  moveq r1, r2
+  mvnne r1, #0
+
+_SetupStackPosition
+  // r1 = SystemMemoryTop
+
+  // Calculate Top of the Firmware Device
+  mov32 r2, FixedPcdGet32(PcdFdBaseAddress)
+  mov32 r3, FixedPcdGet32(PcdFdSize)
+  sub   r3, r3, #1
+  add   r3, r3, r2      // r3 = FdTop = PcdFdBaseAddress + PcdFdSize
+
+  // UEFI Memory Size (stacks are allocated in this region)
+  mov32 r4, FixedPcdGet32(PcdSystemMemoryUefiRegionSize)
+
+  //
+  // Reserve the memory for the UEFI region (contain stacks on its top)
+  //
+
+  // Calculate how much space there is between the top of the Firmware and the Top of the System Memory
+  subs  r0, r1, r3      // r0 = SystemMemoryTop - FdTop
+  bmi   _SetupStack     // Jump if negative (FdTop > SystemMemoryTop). Case when the PrePi is in XIP memory outside of the DRAM
+  cmp   r0, r4
+  bge   _SetupStack
+
+  // Case the top of stacks is the FdBaseAddress
+  mov   r1, r2
+
+_SetupStack
+  // r1 contains the top of the stack (and the UEFI Memory)
+
+  // Because the 'push' instruction is equivalent to 'stmdb' (decrement before), we need to increment
+  // one to the top of the stack. We check if incrementing one does not overflow (case of DRAM at the
+  // top of the memory space)
+  adds  r9, r1, #1
+  bcs   _SetupOverflowStack
+
+_SetupAlignedStack
+  mov   r1, r9
+  b     _GetBaseUefiMemory
+
+_SetupOverflowStack
+  // Case memory at the top of the address space. Ensure the top of the stack is EFI_PAGE_SIZE
+  // aligned (4KB)
+  mov32 r9, EFI_PAGE_MASK
+  and   r9, r9, r1
+  sub   r1, r1, r9
+
+_GetBaseUefiMemory
+  // Calculate the Base of the UEFI Memory
+  sub   r9, r1, r4
+
+_GetStackBase
+  // r1 = The top of the Mpcore Stacks
+  // Stack for the primary core = PrimaryCoreStack
+  mov32 r2, FixedPcdGet32(PcdCPUCorePrimaryStackSize)
+  sub   r10, r1, r2
+
+  // Stack for the secondary core = Number of Cores - 1
+  mov32 r1, (FixedPcdGet32(PcdCoreCount) - 1) * FixedPcdGet32(PcdCPUCoreSecondaryStackSize)
+  sub   r10, r10, r1
+
+  // r10 = The base of the MpCore Stacks (primary stack & secondary stacks)
+  mov   r0, r10
+  mov   r1, r8
+  //ArmPlatformStackSet(StackBase, MpId, PrimaryStackSize, SecondaryStackSize)
+  mov32 r2, FixedPcdGet32(PcdCPUCorePrimaryStackSize)
+  mov32 r3, FixedPcdGet32(PcdCPUCoreSecondaryStackSize)
+  bl    ArmPlatformStackSet
+
+  // Is it the Primary Core ?
+  mov   r0, r8
+  bl    ArmPlatformIsPrimaryCore
+  cmp   r0, #1
+  bne   _PrepareArguments
+
+_PrepareArguments
+  mov   r0, r8
+  mov   r1, r9
+  mov   r2, r10
+
+  // Move sec startup address into a data register
+  // Ensure we're jumping to FV version of the code (not boot remapped alias)
+  ldr   r4, StartupAddr
+
+  // Jump to PrePiCore C code
+  //    r0 = MpId
+  //    r1 = UefiMemoryBase
+  //    r2 = StacksBase
+  blx   r4
+
+_NeverReturn
+  b _NeverReturn
+
+  END
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/PrePi/LzmaDecompress.h b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/LzmaDecompress.h
new file mode 100644
index 0000000000..cc99ce99ac
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/LzmaDecompress.h
@@ -0,0 +1,97 @@
+/** @file
+  LZMA Decompress Library header file
+
+  Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef __LZMA_DECOMPRESS_H___
+#define __LZMA_DECOMPRESS_H___
+
+/**
+  Examines a GUIDed section and returns the size of the decoded buffer and the
+  size of an scratch buffer required to actually decode the data in a GUIDed section.
+
+  Examines a GUIDed section specified by InputSection.
+  If GUID for InputSection does not match the GUID that this handler supports,
+  then RETURN_UNSUPPORTED is returned.
+  If the required information can not be retrieved from InputSection,
+  then RETURN_INVALID_PARAMETER is returned.
+  If the GUID of InputSection does match the GUID that this handler supports,
+  then the size required to hold the decoded buffer is returned in OututBufferSize,
+  the size of an optional scratch buffer is returned in ScratchSize, and the Attributes field
+  from EFI_GUID_DEFINED_SECTION header of InputSection is returned in SectionAttribute.
+
+  If InputSection is NULL, then ASSERT().
+  If OutputBufferSize is NULL, then ASSERT().
+  If ScratchBufferSize is NULL, then ASSERT().
+  If SectionAttribute is NULL, then ASSERT().
+
+
+  @param[in]  InputSection       A pointer to a GUIDed section of an FFS formatted file.
+  @param[out] OutputBufferSize   A pointer to the size, in bytes, of an output buffer required
+                                 if the buffer specified by InputSection were decoded.
+  @param[out] ScratchBufferSize  A pointer to the size, in bytes, required as scratch space
+                                 if the buffer specified by InputSection were decoded.
+  @param[out] SectionAttribute   A pointer to the attributes of the GUIDed section. See the Attributes
+                                 field of EFI_GUID_DEFINED_SECTION in the PI Specification.
+
+  @retval  RETURN_SUCCESS            The information about InputSection was returned.
+  @retval  RETURN_UNSUPPORTED        The section specified by InputSection does not match the GUID this handler supports.
+  @retval  RETURN_INVALID_PARAMETER  The information can not be retrieved from the section specified by InputSection.
+
+**/
+RETURN_STATUS
+EFIAPI
+LzmaGuidedSectionGetInfo (
+  IN  CONST VOID  *InputSection,
+  OUT UINT32      *OutputBufferSize,
+  OUT UINT32      *ScratchBufferSize,
+  OUT UINT16      *SectionAttribute
+  );
+
+/**
+  Decompress a LZAM compressed GUIDed section into a caller allocated output buffer.
+
+  Decodes the GUIDed section specified by InputSection.
+  If GUID for InputSection does not match the GUID that this handler supports, then RETURN_UNSUPPORTED is returned.
+  If the data in InputSection can not be decoded, then RETURN_INVALID_PARAMETER is returned.
+  If the GUID of InputSection does match the GUID that this handler supports, then InputSection
+  is decoded into the buffer specified by OutputBuffer and the authentication status of this
+  decode operation is returned in AuthenticationStatus.  If the decoded buffer is identical to the
+  data in InputSection, then OutputBuffer is set to point at the data in InputSection.  Otherwise,
+  the decoded data will be placed in caller allocated buffer specified by OutputBuffer.
+
+  If InputSection is NULL, then ASSERT().
+  If OutputBuffer is NULL, then ASSERT().
+  If ScratchBuffer is NULL and this decode operation requires a scratch buffer, then ASSERT().
+  If AuthenticationStatus is NULL, then ASSERT().
+
+
+  @param[in]  InputSection  A pointer to a GUIDed section of an FFS formatted file.
+  @param[out] OutputBuffer  A pointer to a buffer that contains the result of a decode operation.
+  @param[out] ScratchBuffer A caller allocated buffer that may be required by this function
+                            as a scratch buffer to perform the decode operation.
+  @param[out] AuthenticationStatus
+                            A pointer to the authentication status of the decoded output buffer.
+                            See the definition of authentication status in the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI
+                            section of the PI Specification. EFI_AUTH_STATUS_PLATFORM_OVERRIDE must
+                            never be set by this handler.
+
+  @retval  RETURN_SUCCESS            The buffer specified by InputSection was decoded.
+  @retval  RETURN_UNSUPPORTED        The section specified by InputSection does not match the GUID this handler supports.
+  @retval  RETURN_INVALID_PARAMETER  The section specified by InputSection can not be decoded.
+
+**/
+RETURN_STATUS
+EFIAPI
+LzmaGuidedSectionExtraction (
+  IN CONST  VOID    *InputSection,
+  OUT       VOID    **OutputBuffer,
+  OUT       VOID    *ScratchBuffer,        OPTIONAL
+  OUT       UINT32  *AuthenticationStatus
+  );
+
+#endif // __LZMADECOMPRESS_H__
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/PrePi/MainUniCore.c b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/MainUniCore.c
new file mode 100644
index 0000000000..7b4bdf7dfd
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/MainUniCore.c
@@ -0,0 +1,33 @@
+/** @file
+*
+*  Copyright (c) 2011, ARM Limited. All rights reserved.
+*  Copyright (c) 2017, Linaro, Ltd. All rights reserved.
+*
+*  SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#include "PrePi.h"
+
+VOID
+PrimaryMain (
+  IN  UINTN                     UefiMemoryBase,
+  IN  UINTN                     StacksBase,
+  IN  UINT64                    StartTimeStamp
+  )
+{
+  PrePiMain (UefiMemoryBase, StacksBase, StartTimeStamp);
+
+  // We must never return
+  ASSERT(FALSE);
+}
+
+VOID
+SecondaryMain (
+  IN  UINTN                     MpId
+  )
+{
+  // We must never get into this function on UniCore system
+  ASSERT(FALSE);
+}
+
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/PrePi/PeiUniCore.inf b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/PeiUniCore.inf
new file mode 100644
index 0000000000..a4bf25b595
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/PeiUniCore.inf
@@ -0,0 +1,97 @@
+#/** @file
+#
+#  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
+#  Copyright (c) 2011-2017, ARM Ltd. All rights reserved.<BR>
+#  Copyright (c) 2017, Linaro, Ltd. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = BeagleBoardPrePiUniCore
+  FILE_GUID                      = 8a5dc3de-fe31-4ad9-9c93-dd73626932e7
+  MODULE_TYPE                    = SEC
+  VERSION_STRING                 = 1.0
+
+[Sources]
+  PrePi.c
+  MainUniCore.c
+
+[Sources.ARM]
+  Arm/ArchPrePi.c
+  Arm/ModuleEntryPoint.S   | GCC
+  Arm/ModuleEntryPoint.asm | RVCT
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
+  EmbeddedPkg/EmbeddedPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  ArmLib
+  ArmPlatformLib
+  ArmPlatformStackLib
+  BaseLib
+  DebugLib
+  DebugAgentLib
+  ExtractGuidedSectionLib
+  HobLib
+  IoLib
+  MemoryAllocationLib
+  MemoryInitPeiLib
+  PeCoffGetEntryPointLib
+  PlatformPeiLib
+  PrePiHobListPointerLib
+  PrePiLib
+  SerialPortLib
+  TimerLib
+
+[Ppis]
+  gArmMpCoreInfoPpiGuid
+
+[Guids]
+  gArmMpCoreInfoGuid
+  gEfiFirmwarePerformanceGuid
+
+[FeaturePcd]
+  gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores
+
+[Pcd]
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
+
+[FixedPcd]
+  gArmTokenSpaceGuid.PcdVFPEnabled
+
+  gArmTokenSpaceGuid.PcdFdBaseAddress
+  gArmTokenSpaceGuid.PcdFdSize
+
+  gArmTokenSpaceGuid.PcdFvBaseAddress
+  gArmTokenSpaceGuid.PcdFvSize
+
+  gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize
+  gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize
+
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
+
+  gArmPlatformTokenSpaceGuid.PcdCoreCount
+
+  gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize
+
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesCode
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesData
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderCode
+  gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderData
+
+[Pcd]
+  gArmTokenSpaceGuid.PcdSystemMemoryBase
+  gArmTokenSpaceGuid.PcdSystemMemorySize
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/PrePi/PrePi.c b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/PrePi.c
new file mode 100644
index 0000000000..5c2fb4007e
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/PrePi.c
@@ -0,0 +1,179 @@
+/** @file
+*
+*  Copyright (c) 2011-2017, ARM Limited. All rights reserved.
+*  Copyright (c) 2017, Linaro, Ltd. All rights reserved.
+*
+*  SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#include <PiPei.h>
+
+#include <Library/DebugAgentLib.h>
+#include <Library/PrePiLib.h>
+#include <Library/PrintLib.h>
+#include <Library/PeCoffGetEntryPointLib.h>
+#include <Library/PrePiHobListPointerLib.h>
+#include <Library/TimerLib.h>
+#include <Library/PerformanceLib.h>
+
+#include <Ppi/GuidedSectionExtraction.h>
+#include <Ppi/ArmMpCoreInfo.h>
+#include <Ppi/SecPerformance.h>
+#include <Guid/LzmaDecompress.h>
+
+#include "PrePi.h"
+#include "LzmaDecompress.h"
+
+#define IS_XIP() (((UINT64)FixedPcdGet64 (PcdFdBaseAddress) > mSystemMemoryEnd) || \
+                  ((FixedPcdGet64 (PcdFdBaseAddress) + FixedPcdGet32 (PcdFdSize)) < FixedPcdGet64 (PcdSystemMemoryBase)))
+
+UINT64 mSystemMemoryEnd = FixedPcdGet64(PcdSystemMemoryBase) +
+                          FixedPcdGet64(PcdSystemMemorySize) - 1;
+
+EFI_STATUS
+GetPlatformPpi (
+  IN  EFI_GUID  *PpiGuid,
+  OUT VOID      **Ppi
+  )
+{
+  UINTN                   PpiListSize;
+  UINTN                   PpiListCount;
+  EFI_PEI_PPI_DESCRIPTOR  *PpiList;
+  UINTN                   Index;
+
+  PpiListSize = 0;
+  ArmPlatformGetPlatformPpiList (&PpiListSize, &PpiList);
+  PpiListCount = PpiListSize / sizeof(EFI_PEI_PPI_DESCRIPTOR);
+  for (Index = 0; Index < PpiListCount; Index++, PpiList++) {
+    if (CompareGuid (PpiList->Guid, PpiGuid) == TRUE) {
+      *Ppi = PpiList->Ppi;
+      return EFI_SUCCESS;
+    }
+  }
+
+  return EFI_NOT_FOUND;
+}
+
+VOID
+PrePiMain (
+  IN  UINTN                     UefiMemoryBase,
+  IN  UINTN                     StacksBase,
+  IN  UINT64                    StartTimeStamp
+  )
+{
+  EFI_HOB_HANDOFF_INFO_TABLE*   HobList;
+  EFI_STATUS                    Status;
+  CHAR8                         Buffer[100];
+  UINTN                         CharCount;
+  UINTN                         StacksSize;
+  FIRMWARE_SEC_PERFORMANCE      Performance;
+
+  // If ensure the FD is either part of the System Memory or totally outside of the System Memory (XIP)
+  ASSERT (IS_XIP() ||
+          ((FixedPcdGet64 (PcdFdBaseAddress) >= FixedPcdGet64 (PcdSystemMemoryBase)) &&
+           ((UINT64)(FixedPcdGet64 (PcdFdBaseAddress) + FixedPcdGet32 (PcdFdSize)) <= (UINT64)mSystemMemoryEnd)));
+
+  // Initialize the architecture specific bits
+  ArchInitialize ();
+
+  // Initialize the Serial Port
+  SerialPortInitialize ();
+  CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"UEFI firmware (version %s built at %a on %a)\n\r",
+    (CHAR16*)PcdGetPtr(PcdFirmwareVersionString), __TIME__, __DATE__);
+  SerialPortWrite ((UINT8 *) Buffer, CharCount);
+
+  // Initialize the Debug Agent for Source Level Debugging
+  InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL);
+  SaveAndSetDebugTimerInterrupt (TRUE);
+
+  // Declare the PI/UEFI memory region
+  HobList = HobConstructor (
+    (VOID*)UefiMemoryBase,
+    FixedPcdGet32 (PcdSystemMemoryUefiRegionSize),
+    (VOID*)UefiMemoryBase,
+    (VOID*)StacksBase  // The top of the UEFI Memory is reserved for the stacks
+    );
+  PrePeiSetHobList (HobList);
+
+  // Initialize MMU and Memory HOBs (Resource Descriptor HOBs)
+  Status = MemoryPeim (UefiMemoryBase, FixedPcdGet32 (PcdSystemMemoryUefiRegionSize));
+  ASSERT_EFI_ERROR (Status);
+
+  StacksSize = PcdGet32 (PcdCPUCorePrimaryStackSize);
+  BuildStackHob (StacksBase, StacksSize);
+
+  //TODO: Call CpuPei as a library
+  BuildCpuHob (ArmGetPhysicalAddressBits (), PcdGet8 (PcdPrePiCpuIoSize));
+
+  // Store timer value logged at the beginning of firmware image execution
+  Performance.ResetEnd = GetTimeInNanoSecond (StartTimeStamp);
+
+  // Build SEC Performance Data Hob
+  BuildGuidDataHob (&gEfiFirmwarePerformanceGuid, &Performance, sizeof (Performance));
+
+  // Set the Boot Mode
+  SetBootMode (ArmPlatformGetBootMode ());
+
+  // Initialize Platform HOBs (CpuHob and FvHob)
+  Status = PlatformPeim ();
+  ASSERT_EFI_ERROR (Status);
+
+  // Now, the HOB List has been initialized, we can register performance information
+  PERF_START (NULL, "PEI", NULL, StartTimeStamp);
+
+  // SEC phase needs to run library constructors by hand.
+  ProcessLibraryConstructorList ();
+
+  // Build HOBs to pass up our version of stuff the DXE Core needs to save space
+  BuildPeCoffLoaderHob ();
+  BuildExtractSectionHob (
+    &gLzmaCustomDecompressGuid,
+    LzmaGuidedSectionGetInfo,
+    LzmaGuidedSectionExtraction
+    );
+
+  // Assume the FV that contains the SEC (our code) also contains a compressed FV.
+  Status = DecompressFirstFv ();
+  ASSERT_EFI_ERROR (Status);
+
+  // Load the DXE Core and transfer control to it
+  Status = LoadDxeCoreFromFv (NULL, 0);
+  ASSERT_EFI_ERROR (Status);
+}
+
+VOID
+CEntryPoint (
+  IN  UINTN                     MpId,
+  IN  UINTN                     UefiMemoryBase,
+  IN  UINTN                     StacksBase
+  )
+{
+  UINT64   StartTimeStamp;
+
+  // Initialize the platform specific controllers
+  ArmPlatformInitialize (MpId);
+
+  if (PerformanceMeasurementEnabled ()) {
+    // Initialize the Timer Library to setup the Timer HW controller
+    TimerConstructor ();
+    // We cannot call yet the PerformanceLib because the HOB List has not been initialized
+    StartTimeStamp = GetPerformanceCounter ();
+  } else {
+    StartTimeStamp = 0;
+  }
+
+  // Data Cache enabled on Primary core when MMU is enabled.
+  ArmDisableDataCache ();
+  // Invalidate Data cache
+  ArmInvalidateDataCache ();
+  // Invalidate instruction cache
+  ArmInvalidateInstructionCache ();
+  // Enable Instruction Caches on all cores.
+  ArmEnableInstructionCache ();
+
+  PrimaryMain (UefiMemoryBase, StacksBase, StartTimeStamp);
+
+  // DXE Core should always load and never return
+  ASSERT (FALSE);
+}
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/PrePi/PrePi.h b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/PrePi.h
new file mode 100644
index 0000000000..b64dd764a4
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/PrePi/PrePi.h
@@ -0,0 +1,90 @@
+/** @file
+*
+*  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
+*
+*  SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#ifndef _PREPI_H_
+#define _PREPI_H_
+
+#include <PiPei.h>
+
+#include <Library/PcdLib.h>
+#include <Library/ArmLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/HobLib.h>
+#include <Library/SerialPortLib.h>
+#include <Library/ArmPlatformLib.h>
+
+#define SerialPrint(txt)  SerialPortWrite (txt, AsciiStrLen(txt)+1);
+
+extern UINT64 mSystemMemoryEnd;
+
+RETURN_STATUS
+EFIAPI
+TimerConstructor (
+  VOID
+  );
+
+VOID
+PrePiMain (
+  IN  UINTN                     UefiMemoryBase,
+  IN  UINTN                     StacksBase,
+  IN  UINT64                    StartTimeStamp
+  );
+
+EFI_STATUS
+EFIAPI
+MemoryPeim (
+  IN EFI_PHYSICAL_ADDRESS       UefiMemoryBase,
+  IN UINT64                     UefiMemorySize
+  );
+
+EFI_STATUS
+EFIAPI
+PlatformPeim (
+  VOID
+  );
+
+VOID
+PrimaryMain (
+  IN  UINTN                     UefiMemoryBase,
+  IN  UINTN                     StacksBase,
+  IN  UINT64                    StartTimeStamp
+  );
+
+VOID
+SecondaryMain (
+  IN  UINTN                     MpId
+  );
+
+// Either implemented by PrePiLib or by MemoryInitPei
+VOID
+BuildMemoryTypeInformationHob (
+  VOID
+  );
+
+EFI_STATUS
+GetPlatformPpi (
+  IN  EFI_GUID  *PpiGuid,
+  OUT VOID      **Ppi
+  );
+
+// Initialize the Architecture specific controllers
+VOID
+ArchInitialize (
+  VOID
+  );
+
+VOID
+EFIAPI
+ProcessLibraryConstructorList (
+  VOID
+  );
+
+#endif /* _PREPI_H_ */
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Tools/GNUmakefile b/Platform/BeagleBoard/BeagleBoardPkg/Tools/GNUmakefile
new file mode 100644
index 0000000000..8be6182bf3
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Tools/GNUmakefile
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+#  
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+CC     = gcc
+CFLAGS = -g
+
+generate_image: generate_image.c
+		$(CC) $(CCFLAGS) $(LDFLAGS) -o generate_image generate_image.c
+
+clean:
+	rm -f generate_image generate_image.exe
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Tools/generate_image.c b/Platform/BeagleBoard/BeagleBoardPkg/Tools/generate_image.c
new file mode 100644
index 0000000000..fd93a0b472
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Tools/generate_image.c
@@ -0,0 +1,402 @@
+/** @file
+ The data structures in this code come from:
+ OMAP35x Applications Processor Technical Reference Manual chapter 25
+ OMAP34xx Multimedia Device Technical Reference Manual chapter 26.4.8.
+
+ You should use the OMAP35x manual when possible. Some things, like SectionKey,
+ are not defined in the OMAP35x manual and you have to use the OMAP34xx manual
+ to find the data.
+
+  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+
+
+//TOC structure as defined by OMAP35XX TRM.
+typedef struct {
+  unsigned int  Start;
+  unsigned int  Size;
+  unsigned int  Reserved1;
+  unsigned int  Reserved2;
+  unsigned int  Reserved3;
+  unsigned char Filename[12];
+} TOC_DATA;
+
+//NOTE: OMAP3430 TRM has CHSETTINGS and CHRAM structures.
+typedef struct {
+  unsigned int   SectionKey;
+  unsigned char  Valid;
+  unsigned char  Version;
+  unsigned short Reserved;
+  unsigned int   Flags;
+  unsigned int   PRM_CLKSRC_CTRL;
+  unsigned int   PRM_CLKSEL;
+  unsigned int   CM_CLKSEL1_EMU;
+  unsigned int   CM_CLKSEL_CORE;
+  unsigned int   CM_CLKSEL_WKUP;
+  unsigned int   CM_CLKEN_PLL_DPLL3;
+  unsigned int   CM_AUTOIDLE_PLL_DPLL3;
+  unsigned int   CM_CLKSEL1_PLL;
+  unsigned int   CM_CLKEN_PLL_DPLL4;
+  unsigned int   CM_AUTOIDLE_PLL_DPLL4;
+  unsigned int   CM_CLKSEL2_PLL;
+  unsigned int   CM_CLKSEL3_PLL;
+  unsigned int   CM_CLKEN_PLL_MPU;
+  unsigned int   CM_AUTOIDLE_PLL_MPU;
+  unsigned int   CM_CLKSEL1_PLL_MPU;
+  unsigned int   CM_CLKSEL2_PLL_MPU;
+  unsigned int   CM_CLKSTCTRL_MPU;
+} CHSETTINGS_DATA;
+
+typedef struct {
+  unsigned int   SectionKey;
+  unsigned char  Valid;
+  unsigned char  Reserved1;
+  unsigned char  Reserved2;
+  unsigned char  Reserved3;
+  unsigned short SDRC_SYSCONFIG_LSB;
+  unsigned short SDRC_CS_CFG_LSB;
+  unsigned short SDRC_SHARING_LSB;
+  unsigned short SDRC_ERR_TYPE_LSB;
+  unsigned int   SDRC_DLLA_CTRL;
+  unsigned short Reserved4;
+  unsigned short Reserved5;
+  unsigned int   SDRC_POWER;
+  unsigned short MEMORY_TYPE_CS0;
+  unsigned short Reserved6;
+  unsigned int   SDRC_MCFG_0;
+  unsigned short SDRC_MR_0_LSB;
+  unsigned short SDRC_EMR1_0_LSB;
+  unsigned short SDRC_EMR2_0_LSB;
+  unsigned short SDRC_EMR3_0_LSB;
+  unsigned int   SDRC_ACTIM_CTRLA_0;
+  unsigned int   SDRC_ACTIM_CTRLB_0;
+  unsigned int   SDRC_RFRCTRL_0;
+  unsigned short MEMORY_TYPE_CS1;
+  unsigned short Reserved7;
+  unsigned int   SDRC_MCFG_1;
+  unsigned short SDRC_MR_1_LSB;
+  unsigned short SDRC_EMR1_1_LSB;
+  unsigned short SDRC_EMR2_1_LSB;
+  unsigned short SDRC_EMR3_1_LSB;
+  unsigned int   SDRC_ACTIM_CTRLA_1;
+  unsigned int   SDRC_ACTIM_CTRLB_1;
+  unsigned int   SDRC_RFRCTRL_1;
+  unsigned int   Reserved8;
+  unsigned short Flags;
+  unsigned short Reserved9;
+} CHRAM_DATA;
+
+#define CHSETTINGS_START      0xA0
+#define CHSETTINGS_SIZE       0x50
+#define CHRAM_START           0xF0
+#define CHRAM_SIZE            0x5C
+#define CLOSING_TOC_ITEM_SIZE 4
+
+unsigned char gConfigurationHeader[512];
+unsigned int  gImageExecutionAddress;
+char          *gInputImageFile = NULL;
+char          *gOutputImageFile = NULL;
+char          *gDataFile = NULL;
+
+static
+void
+PrintUsage (
+  void
+  )
+{
+  printf("Usage..\n");
+}
+
+static
+void
+PopulateCHSETTINGSData (
+  FILE            *DataFile,
+  CHSETTINGS_DATA *CHSETTINGSData
+  )
+{
+  unsigned int Value;
+
+  CHSETTINGSData->SectionKey            = 0xC0C0C0C1;
+  CHSETTINGSData->Valid                 = 0x1;
+  CHSETTINGSData->Version               = 0x1;
+  CHSETTINGSData->Reserved              = 0x00;
+  CHSETTINGSData->Flags                 = 0x050001FD;
+
+  //General clock settings.
+  fscanf(DataFile, "PRM_CLKSRC_CTRL=0x%08x\n", &Value);
+  CHSETTINGSData->PRM_CLKSRC_CTRL = Value;
+  fscanf(DataFile, "PRM_CLKSEL=0x%08x\n", &Value);
+  CHSETTINGSData->PRM_CLKSEL = Value;
+  fscanf(DataFile, "CM_CLKSEL1_EMU=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKSEL1_EMU = Value;
+
+  //Clock configuration
+  fscanf(DataFile, "CM_CLKSEL_CORE=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKSEL_CORE = Value;
+  fscanf(DataFile, "CM_CLKSEL_WKUP=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKSEL_WKUP = Value;
+
+  //DPLL3 (Core) settings
+  fscanf(DataFile, "CM_CLKEN_PLL_DPLL3=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKEN_PLL_DPLL3 = Value;
+  fscanf(DataFile, "CM_AUTOIDLE_PLL_DPLL3=0x%08x\n", &Value);
+  CHSETTINGSData->CM_AUTOIDLE_PLL_DPLL3 = Value;
+  fscanf(DataFile, "CM_CLKSEL1_PLL=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKSEL1_PLL = Value;
+
+  //DPLL4 (Peripheral) settings
+  fscanf(DataFile, "CM_CLKEN_PLL_DPLL4=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKEN_PLL_DPLL4 = Value;
+  fscanf(DataFile, "CM_AUTOIDLE_PLL_DPLL4=0x%08x\n", &Value);
+  CHSETTINGSData->CM_AUTOIDLE_PLL_DPLL4 = Value;
+  fscanf(DataFile, "CM_CLKSEL2_PLL=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKSEL2_PLL = Value;
+  fscanf(DataFile, "CM_CLKSEL3_PLL=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKSEL3_PLL = Value;
+
+  //DPLL1 (MPU) settings
+  fscanf(DataFile, "CM_CLKEN_PLL_MPU=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKEN_PLL_MPU = Value;
+  fscanf(DataFile, "CM_AUTOIDLE_PLL_MPU=0x%08x\n", &Value);
+  CHSETTINGSData->CM_AUTOIDLE_PLL_MPU = Value;
+  fscanf(DataFile, "CM_CLKSEL1_PLL_MPU=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKSEL1_PLL_MPU = Value;
+  fscanf(DataFile, "CM_CLKSEL2_PLL_MPU=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKSEL2_PLL_MPU = Value;
+  fscanf(DataFile, "CM_CLKSTCTRL_MPU=0x%08x\n", &Value);
+  CHSETTINGSData->CM_CLKSTCTRL_MPU = Value;
+}
+
+static
+void
+PopulateCHRAMData (
+  FILE       *DataFile,
+  CHRAM_DATA *CHRAMData
+  )
+{
+  unsigned int Value;
+
+  CHRAMData->SectionKey         = 0xC0C0C0C2;
+  CHRAMData->Valid              = 0x1;
+
+  fscanf(DataFile, "SDRC_SYSCONFIG_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_SYSCONFIG_LSB = Value;
+  fscanf(DataFile, "SDRC_CS_CFG_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_CS_CFG_LSB    = Value;
+  fscanf(DataFile, "SDRC_SHARING_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_SHARING_LSB   = Value;
+  fscanf(DataFile, "SDRC_ERR_TYPE_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_ERR_TYPE_LSB  = Value;
+  fscanf(DataFile, "SDRC_DLLA_CTRL=0x%08x\n", &Value);
+  CHRAMData->SDRC_DLLA_CTRL     = Value;
+  fscanf(DataFile, "SDRC_POWER=0x%08x\n", &Value);
+  CHRAMData->SDRC_POWER         = Value;
+  fscanf(DataFile, "MEMORY_TYPE_CS0=0x%04x\n", &Value);
+  CHRAMData->MEMORY_TYPE_CS0    = Value;
+  fscanf(DataFile, "SDRC_MCFG_0=0x%08x\n", &Value);
+  CHRAMData->SDRC_MCFG_0        = Value;
+  fscanf(DataFile, "SDRC_MR_0_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_MR_0_LSB      = Value;
+  fscanf(DataFile, "SDRC_EMR1_0_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_EMR1_0_LSB    = Value;
+  fscanf(DataFile, "SDRC_EMR2_0_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_EMR2_0_LSB    = Value;
+  fscanf(DataFile, "SDRC_EMR3_0_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_EMR3_0_LSB    = Value;
+  fscanf(DataFile, "SDRC_ACTIM_CTRLA_0=0x%08x\n", &Value);
+  CHRAMData->SDRC_ACTIM_CTRLA_0 = Value;
+  fscanf(DataFile, "SDRC_ACTIM_CTRLB_0=0x%08x\n", &Value);
+  CHRAMData->SDRC_ACTIM_CTRLB_0 = Value;
+  fscanf(DataFile, "SDRC_RFRCTRL_0=0x%08x\n", &Value);
+  CHRAMData->SDRC_RFRCTRL_0     = Value;
+  fscanf(DataFile, "MEMORY_TYPE_CS1=0x%04x\n", &Value);
+  CHRAMData->MEMORY_TYPE_CS1    = Value;
+  fscanf(DataFile, "SDRC_MCFG_1=0x%08x\n", &Value);
+  CHRAMData->SDRC_MCFG_1        = Value;
+  fscanf(DataFile, "SDRC_MR_1_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_MR_1_LSB      = Value;
+  fscanf(DataFile, "SDRC_EMR1_1_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_EMR1_1_LSB    = Value;
+  fscanf(DataFile, "SDRC_EMR2_1_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_EMR2_1_LSB    = Value;
+  fscanf(DataFile, "SDRC_EMR3_1_LSB=0x%04x\n", &Value);
+  CHRAMData->SDRC_EMR3_1_LSB    = Value;
+  fscanf(DataFile, "SDRC_ACTIM_CTRLA_1=0x%08x\n", &Value);
+  CHRAMData->SDRC_ACTIM_CTRLA_1 = Value;
+  fscanf(DataFile, "SDRC_ACTIM_CTRLB_1=0x%08x\n", &Value);
+  CHRAMData->SDRC_ACTIM_CTRLB_1 = Value;
+  fscanf(DataFile, "SDRC_RFRCTRL_1=0x%08x\n", &Value);
+  CHRAMData->SDRC_RFRCTRL_1     = Value;
+
+  CHRAMData->Flags              = 0x0003;
+}
+
+static
+void
+PrepareConfigurationHeader (
+  void
+  )
+{
+  TOC_DATA        Toc;
+  CHSETTINGS_DATA CHSETTINGSData;
+  CHRAM_DATA      CHRAMData;
+  unsigned int    ConfigurationHdrOffset = 0;
+  FILE            *DataFile;
+
+  // Open data file
+  DataFile = fopen(gDataFile, "rb");
+  if (DataFile == NULL) {
+    fprintf(stderr, "Can't open data file %s.\n", gDataFile);
+    exit(1);
+  }
+
+  //Initialize configuration header.
+  memset(gConfigurationHeader, 0x00, sizeof(gConfigurationHeader));
+
+  //CHSETTINGS TOC
+  memset(&Toc, 0x00, sizeof(TOC_DATA));
+  Toc.Start = CHSETTINGS_START;
+  Toc.Size = CHSETTINGS_SIZE;
+  strcpy((char *)Toc.Filename, (const char *)"CHSETTINGS");
+  memcpy(gConfigurationHeader + ConfigurationHdrOffset, &Toc, sizeof(TOC_DATA));
+
+  //Populate CHSETTINGS Data
+  memset(&CHSETTINGSData, 0x00, sizeof(CHSETTINGS_DATA));
+  PopulateCHSETTINGSData(DataFile, &CHSETTINGSData);
+  memcpy(gConfigurationHeader + Toc.Start, &CHSETTINGSData, Toc.Size);
+
+  //Adjust ConfigurationHdrOffset to point to next TOC
+  ConfigurationHdrOffset += sizeof(TOC_DATA);
+
+  //CHRAM TOC
+  memset(&Toc, 0x00, sizeof(TOC_DATA));
+  Toc.Start = CHRAM_START;
+  Toc.Size = CHRAM_SIZE;
+  strcpy((char *)Toc.Filename, (const char *)"CHRAM");
+  memcpy(gConfigurationHeader + ConfigurationHdrOffset, &Toc, sizeof(TOC_DATA));
+
+  //Populate CHRAM Data
+  memset(&CHRAMData, 0x00, sizeof(CHRAM_DATA));
+  PopulateCHRAMData(DataFile, &CHRAMData);
+  memcpy(gConfigurationHeader + Toc.Start, &CHRAMData, Toc.Size);
+
+  //Adjust ConfigurationHdrOffset to point to next TOC
+  ConfigurationHdrOffset += sizeof(TOC_DATA);
+
+  //Closing TOC item
+  memset(gConfigurationHeader + ConfigurationHdrOffset, 0xFF, CLOSING_TOC_ITEM_SIZE);
+  ConfigurationHdrOffset += CLOSING_TOC_ITEM_SIZE;
+
+  // Close data file
+  fclose(DataFile);
+}
+
+static
+void
+ConstructImage (
+  void
+  )
+{
+  FILE         *InputFile;
+  FILE         *OutputFile;
+  unsigned int InputImageFileSize;
+  struct       stat FileStat;
+  char         Ch;
+  unsigned int i;
+
+  InputFile = fopen(gInputImageFile, "rb");
+  if (InputFile == NULL) {
+    fprintf(stderr, "Can't open input file.\n");
+    exit(0);
+  }
+
+  // Get the size of the input image.
+  fstat(fileno(InputFile), &FileStat);
+  InputImageFileSize = FileStat.st_size;
+
+  OutputFile = fopen(gOutputImageFile, "wb");
+  if (OutputFile == NULL) {
+    fprintf(stderr, "Can't open output file %s.\n", gOutputImageFile);
+    exit(0);
+  }
+
+  // Write Configuration header
+  fwrite(gConfigurationHeader, 1, sizeof(gConfigurationHeader), OutputFile);
+
+  // Write image header (Input image size, execution address)
+  fwrite(&InputImageFileSize, 1, 4, OutputFile);
+  fwrite(&gImageExecutionAddress, 1, 4, OutputFile);
+
+  // Copy input image to the output file.
+  for (i = 0; i < InputImageFileSize; i++) {
+    fread(&Ch, 1, 1, InputFile);
+    fwrite(&Ch, 1, 1, OutputFile);
+  }
+
+  fclose(InputFile);
+  fclose(OutputFile);
+}
+
+
+int
+main (
+  int    argc,
+  char** argv
+  )
+{
+  char          Ch;
+  unsigned char *ptr;
+  int           i;
+  int           TwoArg;
+
+  if (argc == 1) {
+    PrintUsage ();
+    exit(1);
+  }
+
+  for (i=1; i < argc; i++) {
+    if (argv[i][0] == '-') {
+      // TwoArg TRUE -E 0x123, FALSE -E0x1234
+      TwoArg = (argv[i][2] != ' ');
+      switch (argv[i][1]) {
+        case 'E': /* Image execution address */
+          gImageExecutionAddress = strtoul (TwoArg ? argv[i+1] : &argv[i][2], (char **)&ptr, 16);
+          break;
+
+        case 'I': /* Input image file */
+          gInputImageFile = TwoArg ? argv[i+1] : &argv[i][2];
+          break;
+
+        case 'O': /* Output image file */
+          gOutputImageFile = TwoArg ? argv[i+1] : &argv[i][2];
+          break;
+
+        case 'D': /* Data file */
+          gDataFile = TwoArg ? argv[i+1] : &argv[i][2];
+          break;
+
+        default:
+          abort ();
+      }
+    }
+  }
+
+
+  //Prepare configuration header
+  PrepareConfigurationHeader ();
+
+  //Build image with configuration header + image header + image
+  ConstructImage ();
+
+  return 0;
+}
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Tools/makefile b/Platform/BeagleBoard/BeagleBoardPkg/Tools/makefile
new file mode 100644
index 0000000000..42030df5ff
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Tools/makefile
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+#  
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+all: GenerateImage replace
+
+GenerateImage: generate_image.c
+		$(CC) $(CCFLAGS) $(LDFLAGS) -o GenerateImage.exe generate_image.c
+
+replace: replace.c
+		$(CC) $(CCFLAGS) $(LDFLAGS) -o replace.exe replace.c
+
+clean:
+	del GenerateImage.exe generate_image.obj replace.exe replace.obj
diff --git a/Platform/BeagleBoard/BeagleBoardPkg/Tools/replace.c b/Platform/BeagleBoard/BeagleBoardPkg/Tools/replace.c
new file mode 100644
index 0000000000..6a1dad4408
--- /dev/null
+++ b/Platform/BeagleBoard/BeagleBoardPkg/Tools/replace.c
@@ -0,0 +1,140 @@
+//
+// Quick hack to work around not having sed, or any other reasonable
+// way to edit a file from a script on Windows......
+//
+// Copyright (c) 2010, Apple Inc. All rights reserved.<BR>
+//
+//  SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#define TRUE  1
+#define FALSE 0
+
+typedef struct {
+  char  *Match;
+  int   MatchSize;
+  char  *Replace;
+} MATCH_PAIR;
+
+void
+Usage (char *Name)
+{
+  printf ("\n%s OldFile NewFile MatchString ReplaceString [MatchString2 ReplaceString2]*\n", Name);
+  printf ("    OldFile - Must be arg[1] File to search for MatchStrings\n");
+  printf ("    NewFile - Must be arg[2] File where MatchString has been replaced with ReplaceString\n");
+  printf ("    MatchString & ReplaceString. Required arguments.\n");
+  printf ("    More MatchString/ReplaceString pairs are supported.\n");
+}
+
+//
+// argv[1] - Old File
+// argv[2] - New File
+// argv[3+n] - Match String
+// argv[4+n] - Replace string
+int
+main (int argc, char **argv)
+{
+  FILE *In, *Out;
+  char *Key, *Replace;
+  int  c, i, n, Len, MaxLenKey = 0, MinLenKey = INT_MAX;
+  unsigned long  InFileSize, InFilePos;
+  MATCH_PAIR *Match;
+  int MaxMatch;
+  int ReadCount;
+  int Found;
+
+  if (argc < 5) {
+    fprintf (stderr, "Need at least two files and one Match/Replacement string pair\n");
+    Usage (argv[0]);
+    return -1;
+  } else if ((argc % 2) == 0) {
+    fprintf (stderr, "Match and Replace string must come in pairs\n");
+    return -4;
+  }
+
+  In  = fopen (argv[1], "r");
+  fseek (In, 0, SEEK_END);
+  InFileSize = ftell (In);
+  if (InFileSize == 0) {
+    fprintf (stderr, "Could not open %s\n", argv[1]);
+    return -6;
+  }
+  fseek (In, 0, SEEK_SET);
+
+
+  Out = fopen (argv[2], "w+");
+  if ((In == NULL) || (Out == NULL)) {
+    fprintf (stderr, "Could not open %s\n", argv[2]);
+    return -2;
+  }
+
+  MaxMatch = (argc - 2)/2;
+  Match = calloc (MaxMatch, sizeof (MATCH_PAIR));
+  if (Match == NULL) {
+    return -7;
+  }
+
+  for (n=0; n < MaxMatch; n++) {
+    Match[n].Match   = argv[3 + n*2];
+    Match[n].MatchSize = strlen (argv[3 + n*2]);
+    Match[n].Replace = argv[3 + n*2 + 1];
+    if (Match[n].MatchSize > MaxLenKey) {
+      // Max size of match/replace string pair
+      MaxLenKey = Match[n].MatchSize;
+    }
+    if (Match[n].MatchSize < MinLenKey) {
+      MinLenKey = Match[n].MatchSize;
+    }
+  }
+
+  Key = malloc (MaxLenKey);
+  if (Key == NULL) {
+    return -5;
+  }
+
+  // Search for a match by reading every possition of the file
+  // into a buffer that is as big as the maximum search key size.
+  // Then we can search the keys for a match. If no match
+  // copy the old file character to the new file. If it is a match
+  // then copy the replacement string into the output file.
+  // This code assumes the file system is smart and caches the
+  // file in a buffer. So all the reads don't really hit the disk.
+  InFilePos = 0;
+  while (InFilePos < (InFileSize - MinLenKey)) {
+    fseek (In, InFilePos, SEEK_SET);
+    ReadCount = fread (Key, 1, MaxLenKey, In);
+    for (i = 0, Found = FALSE;i < MaxMatch; i++) {
+      if (ReadCount >= Match[i].MatchSize) {
+        if (!memcmp (Key, Match[i].Match, Match[i].MatchSize)) {
+          InFilePos += (Match[i].MatchSize - 1);
+          fputs (Match[i].Replace, Out);
+          Found = TRUE;
+          break;
+        }
+      }
+    }
+    if (!Found) {
+      fputc (Key[0], Out);
+    }
+
+    InFilePos++;
+  }
+
+  // We stoped searching when we got to the point that we could no longer match.
+  // So the last few bytes of the file are not copied in the privous loop
+  fseek (In, InFilePos, SEEK_SET);
+  while ((c = fgetc (In)) != EOF) {
+    fputc (c, Out);
+  }
+
+  fclose (In);
+  fclose (Out);
+  free (Key);
+  free (Match);
+  return 0;
+}
+
-- 
2.21.0.windows.1


  parent reply	other threads:[~2019-05-10  3:34 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-10  3:34 [edk2-platforms: Patch 0/8] Add packages from edk2 Michael D Kinney
2019-05-10  3:34 ` [edk2-platforms: Patch 1/8] Silicon/TexasInsturments: Import Omap35xxPkg " Michael D Kinney
2019-05-10 17:56   ` Leif Lindholm
2019-05-10 19:16     ` Michael D Kinney
2019-05-10 19:54       ` Leif Lindholm
2019-05-10  3:34 ` Michael D Kinney [this message]
2019-05-10  3:34 ` [edk2-platforms: Patch 3/8] Silicon/Intel: Import QuarkSocPkg " Michael D Kinney
2019-05-10  3:34 ` [edk2-platforms: Patch 4/8] Platform/QuarkPlatformPkg: Import QuarkPlatformPkg " Michael D Kinney
2019-05-10  3:34 ` [edk2-platforms: Patch 5/8] Platform/Vlv2DeviceRefCodePkg: Import Vlv2DeviceRefCodePkg " Michael D Kinney
2019-05-13  2:52   ` Sun, Zailiang
2019-05-10  3:34 ` [edk2-platforms: Patch 6/8] Platform/Vlv2TbltDevicePkg: Import Vlv2TbltDevicePkg " Michael D Kinney
2019-05-13  2:52   ` Sun, Zailiang
2019-05-10  3:34 ` [edk2-platforms: Patch 7/8] Drivers/OptionRomPkg: Import OptionRomPkg " Michael D Kinney
2019-05-11  1:52   ` Ni, Ray
2019-05-10  3:34 ` [edk2-platforms: Patch 8/8] edk2-platforms: Update Maintainers.txt/Readme.md for imported packages Michael D Kinney
2019-05-10 18:04   ` [edk2-devel] " Leif Lindholm
2019-05-13  2:52   ` Sun, Zailiang
2019-05-10  5:14 ` [edk2-devel] [edk2-platforms: Patch 0/8] Add packages from edk2 Liming Gao
2019-05-10  6:17   ` Michael D Kinney
2019-05-10  7:32     ` Liming Gao
2019-05-10 18:49       ` Kubacki, Michael A
2019-05-11  2:12 ` Ni, Ray
2019-05-13 21:03 ` Steele, Kelly

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190510033435.24112-3-michael.d.kinney@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox