]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/Bds/Bds.c
MdePkg: fix ARM version of InternalMathSwapBytes64 ()
[mirror_edk2.git] / ArmPlatformPkg / Bds / Bds.c
index 2801fac531b478d9ac895f87baab47e7a017de80..971ab07524d70c22e681adff479c5d6638bc08f9 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 *\r
-*  Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
+*  Copyright (c) 2011-2014, ARM Limited. All rights reserved.\r
 *\r
 *  This program and the accompanying materials\r
 *  are licensed and made available under the terms and conditions of the BSD License\r
@@ -19,9 +19,9 @@
 \r
 #include <Protocol/Bds.h>\r
 \r
-#define EFI_SET_TIMER_TO_SECOND   10000000\r
+#include <Guid/EventGroup.h>\r
 \r
-EFI_HANDLE mImageHandle;\r
+#define EFI_SET_TIMER_TO_SECOND   10000000\r
 \r
 STATIC\r
 EFI_STATUS\r
@@ -220,11 +220,16 @@ DefineDefaultBootEntries (
   EFI_STATUS                          Status;\r
   EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL* EfiDevicePathFromTextProtocol;\r
   EFI_DEVICE_PATH*                    BootDevicePath;\r
+  UINT8*                              OptionalData;\r
+  UINTN                               OptionalDataSize;\r
   ARM_BDS_LOADER_ARGUMENTS*           BootArguments;\r
   ARM_BDS_LOADER_TYPE                 BootType;\r
   EFI_DEVICE_PATH*                    InitrdPath;\r
-  UINTN                               CmdLineSize;\r
   UINTN                               InitrdSize;\r
+  UINTN                               CmdLineSize;\r
+  UINTN                               CmdLineAsciiSize;\r
+  CHAR16*                             DefaultBootArgument;\r
+  CHAR8*                              AsciiDefaultBootArgument;\r
 \r
   //\r
   // If Boot Order does not exist then create a default entry\r
@@ -262,35 +267,85 @@ DefineDefaultBootEntries (
     if (BootDevicePath != NULL) {\r
       BootType = (ARM_BDS_LOADER_TYPE)PcdGet32 (PcdDefaultBootType);\r
 \r
+      // We do not support NULL pointer\r
+      ASSERT (PcdGetPtr (PcdDefaultBootArgument) != NULL);\r
+\r
+      //\r
+      // Logic to handle ASCII or Unicode default parameters\r
+      //\r
+      if (*(CHAR8*)PcdGetPtr (PcdDefaultBootArgument) == '\0') {\r
+        CmdLineSize = 0;\r
+        CmdLineAsciiSize = 0;\r
+        DefaultBootArgument = NULL;\r
+        AsciiDefaultBootArgument = NULL;\r
+      } else if (IsUnicodeString ((CHAR16*)PcdGetPtr (PcdDefaultBootArgument))) {\r
+        // The command line is a Unicode string\r
+        DefaultBootArgument = (CHAR16*)PcdGetPtr (PcdDefaultBootArgument);\r
+        CmdLineSize = StrSize (DefaultBootArgument);\r
+\r
+        // Initialize ASCII variables\r
+        CmdLineAsciiSize = CmdLineSize / 2;\r
+        AsciiDefaultBootArgument = AllocatePool (CmdLineAsciiSize);\r
+        if (AsciiDefaultBootArgument == NULL) {\r
+          return EFI_OUT_OF_RESOURCES;\r
+        }\r
+        UnicodeStrToAsciiStr ((CHAR16*)PcdGetPtr (PcdDefaultBootArgument), AsciiDefaultBootArgument);\r
+      } else {\r
+        // The command line is a ASCII string\r
+        AsciiDefaultBootArgument = (CHAR8*)PcdGetPtr (PcdDefaultBootArgument);\r
+        CmdLineAsciiSize = AsciiStrSize (AsciiDefaultBootArgument);\r
+\r
+        // Initialize ASCII variables\r
+        CmdLineSize = CmdLineAsciiSize * 2;\r
+        DefaultBootArgument = AllocatePool (CmdLineSize);\r
+        if (DefaultBootArgument == NULL) {\r
+          return EFI_OUT_OF_RESOURCES;\r
+        }\r
+        AsciiStrToUnicodeStr (AsciiDefaultBootArgument, DefaultBootArgument);\r
+      }\r
+\r
       if ((BootType == BDS_LOADER_KERNEL_LINUX_ATAG) || (BootType == BDS_LOADER_KERNEL_LINUX_FDT)) {\r
-        CmdLineSize = AsciiStrSize ((CHAR8*)PcdGetPtr(PcdDefaultBootArgument));\r
         InitrdPath = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath ((CHAR16*)PcdGetPtr(PcdDefaultBootInitrdPath));\r
         InitrdSize = GetDevicePathSize (InitrdPath);\r
 \r
-        BootArguments = (ARM_BDS_LOADER_ARGUMENTS*)AllocatePool (sizeof(ARM_BDS_LOADER_ARGUMENTS) + CmdLineSize + InitrdSize);\r
-        BootArguments->LinuxArguments.CmdLineSize = CmdLineSize;\r
+        OptionalDataSize = sizeof(ARM_BDS_LOADER_ARGUMENTS) + CmdLineAsciiSize + InitrdSize;\r
+        BootArguments = (ARM_BDS_LOADER_ARGUMENTS*)AllocatePool (OptionalDataSize);\r
+        if (BootArguments == NULL) {\r
+          return EFI_OUT_OF_RESOURCES;\r
+        }\r
+        BootArguments->LinuxArguments.CmdLineSize = CmdLineAsciiSize;\r
         BootArguments->LinuxArguments.InitrdSize = InitrdSize;\r
 \r
-        CopyMem ((VOID*)(BootArguments + 1), (CHAR8*)PcdGetPtr(PcdDefaultBootArgument), CmdLineSize);\r
-        CopyMem ((VOID*)((UINTN)(BootArguments + 1) + CmdLineSize), InitrdPath, InitrdSize);\r
+        CopyMem ((VOID*)(BootArguments + 1), AsciiDefaultBootArgument, CmdLineAsciiSize);\r
+        CopyMem ((VOID*)((UINTN)(BootArguments + 1) + CmdLineAsciiSize), InitrdPath, InitrdSize);\r
+\r
+        OptionalData = (UINT8*)BootArguments;\r
       } else {\r
-        BootArguments = NULL;\r
+        OptionalData = (UINT8*)DefaultBootArgument;\r
+        OptionalDataSize = CmdLineSize;\r
       }\r
 \r
       BootOptionCreate (LOAD_OPTION_ACTIVE | LOAD_OPTION_CATEGORY_BOOT,\r
         (CHAR16*)PcdGetPtr(PcdDefaultBootDescription),\r
         BootDevicePath,\r
         BootType,\r
-        BootArguments,\r
+        OptionalData,\r
+        OptionalDataSize,\r
         &BdsLoadOption\r
         );\r
       FreePool (BdsLoadOption);\r
+\r
+      if (DefaultBootArgument == (CHAR16*)PcdGetPtr (PcdDefaultBootArgument)) {\r
+        FreePool (AsciiDefaultBootArgument);\r
+      } else if (DefaultBootArgument != NULL) {\r
+        FreePool (DefaultBootArgument);\r
+      }\r
     } else {\r
       Status = EFI_UNSUPPORTED;\r
     }\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -312,8 +367,11 @@ StartDefaultBootOnTimeout (
 \r
   Size = sizeof(UINT16);\r
   Timeout = (UINT16)PcdGet16 (PcdPlatformBootTimeOut);\r
-  TimeoutPtr = &Timeout;\r
-  GetGlobalEnvironmentVariable (L"Timeout", &Timeout, &Size, (VOID**)&TimeoutPtr);\r
+  Status = GetGlobalEnvironmentVariable (L"Timeout", &Timeout, &Size, (VOID**)&TimeoutPtr);\r
+  if (!EFI_ERROR (Status)) {\r
+    Timeout = *TimeoutPtr;\r
+    FreePool (TimeoutPtr);\r
+  }\r
 \r
   if (Timeout != 0xFFFF) {\r
     if (Timeout > 0) {\r
@@ -335,7 +393,7 @@ StartDefaultBootOnTimeout (
       }\r
       // Discard key in the buffer\r
       do {\r
-       Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+        Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
       } while(!EFI_ERROR(Status));\r
       gBS->CloseEvent (WaitList[0]);\r
       Print(L"\n\r");\r
@@ -350,8 +408,8 @@ StartDefaultBootOnTimeout (
         UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOrder[Index]);\r
         Status = BdsStartBootOption (BootVariableName);\r
         if(!EFI_ERROR(Status)){\r
-               // Boot option returned successfully, hence don't need to start next boot option\r
-               break;\r
+          // Boot option returned successfully, hence don't need to start next boot option\r
+          break;\r
         }\r
         // In case of success, we should not return from this call.\r
       }\r
@@ -361,6 +419,24 @@ StartDefaultBootOnTimeout (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  An empty function to pass error checking of CreateEventEx ().\r
+\r
+  @param  Event                 Event whose notification function is being invoked.\r
+  @param  Context               Pointer to the notification function's context,\r
+                                which is implementation-dependent.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EmptyCallbackFunction (\r
+  IN EFI_EVENT                Event,\r
+  IN VOID                     *Context\r
+  )\r
+{\r
+  return;\r
+}\r
+\r
 /**\r
   This function uses policy data from the platform to determine what operating\r
   system or system utility should be loaded and invoked.  This function call\r
@@ -393,6 +469,22 @@ BdsEntry (
   UINT16             *BootNext;\r
   UINTN               BootNextSize;\r
   CHAR16              BootVariableName[9];\r
+  EFI_EVENT           EndOfDxeEvent;\r
+\r
+  //\r
+  // Signal EndOfDxe PI Event\r
+  //\r
+  Status = gBS->CreateEventEx (\r
+      EVT_NOTIFY_SIGNAL,\r
+      TPL_NOTIFY,\r
+      EmptyCallbackFunction,\r
+      NULL,\r
+      &gEfiEndOfDxeEventGroupGuid,\r
+      &EndOfDxeEvent\r
+      );\r
+  if (!EFI_ERROR (Status)) {\r
+    gBS->SignalEvent (EndOfDxeEvent);\r
+  }\r
 \r
   PERF_END   (NULL, "DXE", NULL, 0);\r
 \r
@@ -484,8 +576,6 @@ BdsInitialize (
 {\r
   EFI_STATUS  Status;\r
 \r
-  mImageHandle = ImageHandle;\r
-\r
   Status = gBS->InstallMultipleProtocolInterfaces (\r
                   &ImageHandle,\r
                   &gEfiBdsArchProtocolGuid, &gBdsProtocol,\r