hikey: Add UEFI sources for reference

UEFI needs to be built outside Android build system.
Please follow the instructions in README.

The sources correspond to:
https://github.com/96boards/edk2/commit/14eae0c12e71fd33c4c0fc51e4475e8db02566cf
https://github.com/96boards/arm-trusted-firmware/commit/e9b4909dcd75fc4ae7041cfb83d28ab9adb7afdf
https://github.com/96boards/l-loader/commit/6b784ad5c4ab00e2b1c6f53cd5f74054e5d00a78
https://git.linaro.org/uefi/uefi-tools.git/commit/abe618f8ab72034fff1ce46c9c006a2c6bd40a7e

Change-Id: Ieeefdb63e673e0c8e64e0a1f02c7bddc63b2c7fb
Signed-off-by: Vishal Bhoj <vishal.bhoj@linaro.org>
diff --git a/uefi/linaro-edk2/BeagleBoardPkg/Library/EblCmdLib/EblCmdLib.c b/uefi/linaro-edk2/BeagleBoardPkg/Library/EblCmdLib/EblCmdLib.c
new file mode 100644
index 0000000..46204a4
--- /dev/null
+++ b/uefi/linaro-edk2/BeagleBoardPkg/Library/EblCmdLib/EblCmdLib.c
@@ -0,0 +1,299 @@
+/** @file

+  Add custom commands for BeagleBoard development.

+

+  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>

+

+  This program and the accompanying materials

+  are licensed and made available under the terms and conditions of the BSD License

+  which accompanies this distribution.  The full text of the license may be found at

+  http://opensource.org/licenses/bsd-license.php

+

+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

+

+**/

+

+#include <PiDxe.h>

+#include <Library/ArmLib.h>

+#include <Library/CacheMaintenanceLib.h>

+#include <Library/EblCmdLib.h>

+#include <Library/BaseLib.h>

+#include <Library/DebugLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+#include <Library/UefiRuntimeServicesTableLib.h>

+#include <Library/MemoryAllocationLib.h>

+#include <Library/UefiLib.h>

+#include <Library/PcdLib.h>

+#include <Library/EfiFileLib.h>

+#include <Library/ArmDisassemblerLib.h>

+#include <Library/PeCoffGetEntryPointLib.h>

+#include <Library/PerformanceLib.h>

+#include <Library/TimerLib.h>

+

+#include <Guid/DebugImageInfoTable.h>

+

+#include <Protocol/DebugSupport.h>

+#include <Protocol/LoadedImage.h>

+

+/**

+  Simple arm disassembler via a library

+

+  Argv[0] - symboltable

+  Argv[1] - Optional quoted format string

+  Argv[2] - Optional flag

+

+  @param  Argc   Number of command arguments in Argv

+  @param  Argv   Array of strings that represent the parsed command line.

+                 Argv[0] is the command name

+

+  @return EFI_SUCCESS

+

+**/

+EFI_STATUS

+EblSymbolTable (

+  IN UINTN  Argc,

+  IN CHAR8  **Argv

+  )

+{

+  EFI_STATUS                        Status;

+  EFI_DEBUG_IMAGE_INFO_TABLE_HEADER *DebugImageTableHeader = NULL;

+  EFI_DEBUG_IMAGE_INFO              *DebugTable;

+  UINTN                             Entry;

+  CHAR8                             *Format;

+  CHAR8                             *Pdb;

+  UINT32                            PeCoffSizeOfHeaders;

+  UINT32                            ImageBase;

+  BOOLEAN                           Elf;

+

+  // Need to add lots of error checking on the passed in string

+  // Default string is for RealView debugger or gdb depending on toolchain used.

+  if (Argc > 1) {

+    Format = Argv[1];

+  } else {

+#if __GNUC__

+    // Assume gdb

+    Format = "add-symbol-file %a 0x%x";

+#else

+    // Default to RVCT

+    Format = "load /a /ni /np %a &0x%x";

+#endif

+  }

+  Elf = (Argc > 2) ? FALSE : TRUE;

+

+  Status = EfiGetSystemConfigurationTable (&gEfiDebugImageInfoTableGuid, (VOID **)&DebugImageTableHeader);

+  if (EFI_ERROR (Status)) {

+    return Status;

+  }

+

+  DebugTable = DebugImageTableHeader->EfiDebugImageInfoTable;

+  if (DebugTable == NULL) {

+    return EFI_SUCCESS;

+  }

+

+  for (Entry = 0; Entry < DebugImageTableHeader->TableSize; Entry++, DebugTable++) {

+    if (DebugTable->NormalImage != NULL) {

+      if ((DebugTable->NormalImage->ImageInfoType == EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL) && (DebugTable->NormalImage->LoadedImageProtocolInstance != NULL)) {

+        ImageBase = (UINT32)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase;

+        PeCoffSizeOfHeaders = PeCoffGetSizeOfHeaders ((VOID *)(UINTN)ImageBase);

+        Pdb = PeCoffLoaderGetPdbPointer (DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase);

+        if (Pdb != NULL) {

+          if (Elf) {

+            // ELF and Mach-O images don't include the header so the linked address does not include header

+            ImageBase += PeCoffSizeOfHeaders;

+          }

+          AsciiPrint (Format, Pdb, ImageBase);

+          AsciiPrint ("\n");

+        } else {

+        }

+      }

+    }

+  }

+

+  return EFI_SUCCESS;

+}

+

+

+/**

+  Simple arm disassembler via a library

+

+  Argv[0] - disasm

+  Argv[1] - Address to start disassembling from

+  ARgv[2] - Number of instructions to disassembly (optional)

+

+  @param  Argc   Number of command arguments in Argv

+  @param  Argv   Array of strings that represent the parsed command line.

+                 Argv[0] is the command name

+

+  @return EFI_SUCCESS

+

+**/

+EFI_STATUS

+EblDisassembler (

+  IN UINTN  Argc,

+  IN CHAR8  **Argv

+  )

+{

+  UINT8   *Ptr, *CurrentAddress;

+  UINT32  Address;

+  UINT32  Count;

+  CHAR8   Buffer[80];

+  UINT32  ItBlock;

+

+  if (Argc < 2) {

+    return EFI_INVALID_PARAMETER;

+  }

+

+  Address = AsciiStrHexToUintn (Argv[1]);

+  Count   = (Argc > 2) ? (UINT32)AsciiStrHexToUintn (Argv[2]) : 20;

+

+  Ptr = (UINT8 *)(UINTN)Address;

+  ItBlock = 0;

+  do {

+    CurrentAddress = Ptr;

+    DisassembleInstruction (&Ptr, TRUE, TRUE, &ItBlock, Buffer, sizeof (Buffer));

+    AsciiPrint ("0x%08x: %a\n", CurrentAddress, Buffer);

+  } while (Count-- > 0);

+

+

+  return EFI_SUCCESS;

+}

+

+

+CHAR8 *

+ImageHandleToPdbFileName (

+  IN  EFI_HANDLE    Handle

+  )

+{

+  EFI_STATUS                  Status;

+  EFI_LOADED_IMAGE_PROTOCOL   *LoadedImage;

+  CHAR8                       *Pdb;

+  CHAR8                       *StripLeading;

+

+  Status = gBS->HandleProtocol (Handle, &gEfiLoadedImageProtocolGuid, (VOID **)&LoadedImage);

+  if (EFI_ERROR (Status)) {

+    return "";

+  }

+

+  Pdb = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);

+  StripLeading = AsciiStrStr (Pdb, "\\ARM\\");

+  if (StripLeading == NULL) {

+    StripLeading = AsciiStrStr (Pdb, "/ARM/");

+    if (StripLeading == NULL) {

+      return Pdb;

+    }

+  }

+  // Hopefully we hacked off the unneeded part

+  return (StripLeading + 5);

+}

+

+

+CHAR8 *mTokenList[] = {

+  "SEC",

+  "PEI",

+  "DXE",

+  "BDS",

+  NULL

+};

+

+/**

+  Simple arm disassembler via a library

+

+  Argv[0] - disasm

+  Argv[1] - Address to start disassembling from

+  ARgv[2] - Number of instructions to disassembly (optional)

+

+  @param  Argc   Number of command arguments in Argv

+  @param  Argv   Array of strings that represent the parsed command line.

+                 Argv[0] is the command name

+

+  @return EFI_SUCCESS

+

+**/

+EFI_STATUS

+EblPerformance (

+  IN UINTN  Argc,

+  IN CHAR8  **Argv

+  )

+{

+  UINTN       Key;

+  CONST VOID  *Handle;

+  CONST CHAR8 *Token, *Module;

+  UINT64      Start, Stop, TimeStamp;

+  UINT64      Delta, TicksPerSecond, Milliseconds, Microseconds;

+  UINTN       Index;

+

+  TicksPerSecond = GetPerformanceCounterProperties (NULL, NULL);

+

+  Key       = 0;

+  do {

+    Key = GetPerformanceMeasurement (Key, (CONST VOID **)&Handle, &Token, &Module, &Start, &Stop);

+    if (Key != 0) {

+      if (AsciiStriCmp ("StartImage:", Token) == 0) {

+        if (Stop == 0) {

+          // The entry for EBL is still running so the stop time will be zero. Skip it

+          AsciiPrint ("   running     %a\n", ImageHandleToPdbFileName ((EFI_HANDLE)Handle));

+        } else {

+          Delta = Stop - Start;

+          Microseconds = DivU64x64Remainder (MultU64x32 (Delta, 1000000), TicksPerSecond, NULL);

+          AsciiPrint ("%10ld us  %a\n", Microseconds, ImageHandleToPdbFileName ((EFI_HANDLE)Handle));

+        }

+      }

+    }

+  } while (Key != 0);

+

+  AsciiPrint ("\n");

+

+  TimeStamp = 0;

+  Key       = 0;

+  do {

+    Key = GetPerformanceMeasurement (Key, (CONST VOID **)&Handle, &Token, &Module, &Start, &Stop);

+    if (Key != 0) {

+      for (Index = 0; mTokenList[Index] != NULL; Index++) {

+        if (AsciiStriCmp (mTokenList[Index], Token) == 0) {

+          Delta = Stop - Start;

+          TimeStamp += Delta;

+          Milliseconds = DivU64x64Remainder (MultU64x32 (Delta, 1000), TicksPerSecond, NULL);

+          AsciiPrint ("%6a %6ld ms\n", Token, Milliseconds);

+          break;

+        }

+      }

+    }

+  } while (Key != 0);

+

+  AsciiPrint ("Total Time = %ld ms\n\n", DivU64x64Remainder (MultU64x32 (TimeStamp, 1000), TicksPerSecond, NULL));

+

+  return EFI_SUCCESS;

+}

+

+

+GLOBAL_REMOVE_IF_UNREFERENCED const EBL_COMMAND_TABLE mLibCmdTemplate[] =

+{

+  {

+    "disasm address [count]",

+    " disassemble count instructions",

+    NULL,

+    EblDisassembler

+  },

+  {

+    "performance",

+    " Display boot performance info",

+    NULL,

+    EblPerformance

+  },

+  {

+    "symboltable [\"format string\"] [PECOFF]",

+    " show symbol table commands for debugger",

+    NULL,

+    EblSymbolTable

+  }

+};

+

+

+VOID

+EblInitializeExternalCmd (

+  VOID

+  )

+{

+  EblAddCommands (mLibCmdTemplate, sizeof (mLibCmdTemplate)/sizeof (EBL_COMMAND_TABLE));

+  return;

+}