]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPlatformPkg/Bds: Add support to handle Unicode parameters
authorOlivier Martin <olivier.martin@arm.com>
Fri, 11 Apr 2014 10:55:02 +0000 (10:55 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 11 Apr 2014 10:55:02 +0000 (10:55 +0000)
Most UEFI applications expect unicode string parameter.
This change is allows to support Ascii or Unicode strings.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15450 6f19259b-4bc3-4df7-8a09-765794883524

ArmPlatformPkg/Bds/Bds.c
ArmPlatformPkg/Bds/BdsHelper.c
ArmPlatformPkg/Bds/BdsInternal.h

index 2801fac531b478d9ac895f87baab47e7a017de80..76dd5465a2cc9cb142f188b6e27c73305ac66c34 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
@@ -223,8 +223,11 @@ DefineDefaultBootEntries (
   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,17 +265,56 @@ 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
+        BootArguments = (ARM_BDS_LOADER_ARGUMENTS*)AllocatePool (sizeof(ARM_BDS_LOADER_ARGUMENTS) + CmdLineAsciiSize + InitrdSize);\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
       } else {\r
         BootArguments = NULL;\r
       }\r
@@ -285,6 +327,12 @@ DefineDefaultBootEntries (
         &BdsLoadOption\r
         );\r
       FreePool (BdsLoadOption);\r
+\r
+      if (DefaultBootArgument == (CHAR16*)PcdGetPtr (PcdDefaultBootArgument)) {\r
+        FreePool (AsciiDefaultBootArgument);\r
+      } else {\r
+        FreePool (DefaultBootArgument);\r
+      }\r
     } else {\r
       Status = EFI_UNSUPPORTED;\r
     }\r
index 1c233d76c594a36a5ce6202cb4360319118bcd87..b5a3fa91b1cf2b69be9d8ded9ce9422aee07ad7b 100644 (file)
@@ -323,3 +323,18 @@ GetAlignedDevicePath (
   }\r
 }\r
 \r
+BOOLEAN\r
+IsUnicodeString (\r
+  IN VOID* String\r
+  )\r
+{\r
+  // We do not support NULL pointer\r
+  ASSERT (String != NULL);\r
+\r
+  if (*(CHAR16*)String < 0x100) {\r
+    //Note: We could get issue if the string is an empty Ascii string...\r
+    return TRUE;\r
+  } else {\r
+    return FALSE;\r
+  }\r
+}\r
index ad593bbea6bd30a59f56d0aba248b5f3f06fe6d2..d2c1655114e2c2d258e1a2ae261c701a302bdfae 100644 (file)
@@ -243,4 +243,9 @@ BootMenuMain (
   VOID\r
   );\r
 \r
+BOOLEAN\r
+IsUnicodeString (\r
+  IN VOID* String\r
+  );\r
+\r
 #endif /* _BDSINTERNAL_H_ */\r