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/StdLib/LibC/Main/Main.c b/uefi/linaro-edk2/StdLib/LibC/Main/Main.c
new file mode 100644
index 0000000..b203d15
--- /dev/null
+++ b/uefi/linaro-edk2/StdLib/LibC/Main/Main.c
@@ -0,0 +1,210 @@
+/** @file

+  Establish the program environment and the "main" entry point.

+

+  All of the global data in the gMD structure is initialized to 0, NULL, or

+  SIG_DFL; as appropriate.

+

+  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>

+  This program and the accompanying materials are licensed and made available under

+  the terms and conditions of the BSD License that accompanies this distribution.

+  The full text of the license may be found at

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

+

+  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  <Uefi.h>

+#include  <Library/UefiLib.h>

+#include  <Library/DebugLib.h>

+

+#include  <Library/ShellCEntryLib.h>

+#include  <Library/MemoryAllocationLib.h>

+#include  <Library/TimerLib.h>

+

+#include  <LibConfig.h>

+

+#include  <errno.h>

+#include  <stdio.h>

+#include  <stdlib.h>

+#include  <string.h>

+#include  <time.h>

+#include  <MainData.h>

+#include  <unistd.h>

+

+extern int main( int, char**);

+extern int __sse2_available;

+

+struct  __MainData  *gMD;

+

+/* Worker function to keep GCC happy. */

+void __main()

+{

+  ;

+}

+

+/** Clean up data as required by the exit() function.

+

+**/

+void

+exitCleanup(INTN ExitVal)

+{

+  void (*CleanUp)(void);   // Pointer to Cleanup Function

+  int i;

+

+  if(gMD != NULL) {

+    gMD->ExitValue = (int)ExitVal;

+    CleanUp = gMD->cleanup; // Preserve the pointer to the Cleanup Function

+

+    // Call all registered atexit functions in reverse order

+    i = gMD->num_atexit;

+    if( i > 0) {

+      do {

+        (gMD->atexit_handler[--i])();

+      } while( i > 0);

+  }

+

+    if (CleanUp != NULL) {

+      CleanUp();

+    }

+  }

+}

+

+/* Create mbcs versions of the Argv strings. */

+static

+char **

+ArgvConvert(UINTN Argc, CHAR16 **Argv)

+{

+  ssize_t  AVsz;       /* Size of a single nArgv string, or -1 */

+  UINTN   count;

+  char  **nArgv;

+  char   *string;

+  INTN    nArgvSize;  /* Cumulative size of narrow Argv[i] */

+

+DEBUG_CODE_BEGIN();

+  DEBUG((DEBUG_INIT, "ArgvConvert called with %d arguments.\n", Argc));

+  for(count = 0; count < ((Argc > 5)? 5: Argc); ++count) {

+    DEBUG((DEBUG_INIT, "Argument[%d] = \"%s\".\n", count, Argv[count]));

+  }

+DEBUG_CODE_END();

+

+  nArgvSize = Argc;

+  /* Determine space needed for narrow Argv strings. */

+  for(count = 0; count < Argc; ++count) {

+    AVsz = (ssize_t)wcstombs(NULL, Argv[count], ARG_MAX);

+    if(AVsz < 0) {

+      DEBUG((DEBUG_ERROR, "ABORTING: Argv[%d] contains an unconvertable character.\n", count));

+      exit(EXIT_FAILURE);

+      /* Not Reached */

+    }

+    nArgvSize += AVsz;

+  }

+

+  /* Reserve space for the converted strings. */

+  gMD->NCmdLine = (char *)AllocateZeroPool(nArgvSize+1);

+  if(gMD->NCmdLine == NULL) {

+    DEBUG((DEBUG_ERROR, "ABORTING: Insufficient memory.\n"));

+    exit(EXIT_FAILURE);

+    /* Not Reached */

+  }

+

+  /* Convert Argument Strings. */

+  nArgv   = gMD->NArgV;

+  string  = gMD->NCmdLine;

+  for(count = 0; count < Argc; ++count) {

+    nArgv[count] = string;

+    AVsz = wcstombs(string, Argv[count], nArgvSize) + 1;

+    DEBUG((DEBUG_INFO, "Cvt[%d] %d \"%s\" --> \"%a\"\n", (INT32)count, (INT32)AVsz, Argv[count], nArgv[count]));

+    string += AVsz;

+    nArgvSize -= AVsz;

+    if(nArgvSize < 0) {

+      DEBUG((DEBUG_ERROR, "ABORTING: Internal Argv[%d] conversion error.\n", count));

+      exit(EXIT_FAILURE);

+      /* Not Reached */

+    }

+  }

+  return gMD->NArgV;

+}

+

+INTN

+EFIAPI

+ShellAppMain (

+  IN UINTN Argc,

+  IN CHAR16 **Argv

+  )

+{

+  struct __filedes   *mfd;

+  char              **nArgv;

+  INTN   ExitVal;

+  int                 i;

+

+  ExitVal = (INTN)RETURN_SUCCESS;

+  gMD = AllocateZeroPool(sizeof(struct __MainData));

+  if( gMD == NULL ) {

+    ExitVal = (INTN)RETURN_OUT_OF_RESOURCES;

+  }

+  else {

+    /* Initialize data */

+    __sse2_available      = 0;

+    _fltused              = 1;

+    errno                 = 0;

+    EFIerrno              = 0;

+

+    gMD->ClocksPerSecond  = 1;

+    gMD->AppStartTime     = (clock_t)((UINT32)time(NULL));

+

+    // Initialize file descriptors

+    mfd = gMD->fdarray;

+    for(i = 0; i < (FOPEN_MAX); ++i) {

+      mfd[i].MyFD = (UINT16)i;

+    }

+

+    DEBUG((DEBUG_INIT, "StdLib: Open Standard IO.\n"));

+    i = open("stdin:", (O_RDONLY | O_TTY_INIT), 0444);

+    if(i == 0) {

+      i = open("stdout:", (O_WRONLY | O_TTY_INIT), 0222);

+      if(i == 1) {

+        i = open("stderr:", O_WRONLY, 0222);

+      }

+    }

+    if(i != 2) {

+      Print(L"ERROR Initializing Standard IO: %a.\n    %r\n",

+            strerror(errno), EFIerrno);

+    }

+

+    /* Create mbcs versions of the Argv strings. */

+    nArgv = ArgvConvert(Argc, Argv);

+    if(nArgv == NULL) {

+      ExitVal = (INTN)RETURN_INVALID_PARAMETER;

+    }

+    else {

+      if( setjmp(gMD->MainExit) == 0) {

+        errno   = 0;    // Clean up any "scratch" values from startup.

+        ExitVal = (INTN)main( (int)Argc, gMD->NArgV);

+        exitCleanup(ExitVal);

+      }

+      /* You reach here if:

+          * normal return from main()

+          * call to _Exit(), either directly or through exit().

+      */

+      ExitVal = (INTN)gMD->ExitValue;

+    }

+

+    if( ExitVal == EXIT_FAILURE) {

+      ExitVal = RETURN_ABORTED;

+    }

+

+    /* Close any open files */

+    for(i = OPEN_MAX - 1; i >= 0; --i) {

+      (void)close(i);   // Close properly handles closing a closed file.

+    }

+

+    /* Free the global MainData structure */

+    if(gMD != NULL) {

+      if(gMD->NCmdLine != NULL) {

+        FreePool( gMD->NCmdLine );

+      }

+      FreePool( gMD );

+  }

+  }

+  return ExitVal;

+}