]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/Bds/Bds.c
- For writing sin_port, htons() must be used.
[mirror_edk2.git] / ArmPlatformPkg / Bds / Bds.c
index 176311e8a28b48dd445caf5ea602f299e23f8375..11a76de90f139092d4ba046b34858c832b43e937 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 *\r
-*  Copyright (c) 2011, ARM Limited. All rights reserved.\r
+*  Copyright (c) 2011-2012, 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
@@ -181,7 +181,7 @@ InitializeConsole (
   ASSERT_EFI_ERROR (Status);\r
   Status = GetConsoleDevicePathFromVariable (L"ConIn", (CHAR16*)PcdGetPtr(PcdDefaultConInPaths), &ConInDevicePaths);\r
   ASSERT_EFI_ERROR (Status);\r
-  Status = GetConsoleDevicePathFromVariable (L"ConErr", (CHAR16*)PcdGetPtr(PcdDefaultConOutPaths), &ConErrDevicePaths);\r
+  Status = GetConsoleDevicePathFromVariable (L"ErrOut", (CHAR16*)PcdGetPtr(PcdDefaultConOutPaths), &ConErrDevicePaths);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   // Initialize the Consoles\r
@@ -196,6 +196,17 @@ InitializeConsole (
     gST->StdErr = gST->ConOut;\r
   }\r
 \r
+  // Free Memory allocated for reading the UEFI Variables\r
+  if (ConOutDevicePaths) {\r
+    FreePool (ConOutDevicePaths);\r
+  }\r
+  if (ConInDevicePaths) {\r
+    FreePool (ConInDevicePaths);\r
+  }\r
+  if (ConErrDevicePaths) {\r
+    FreePool (ConErrDevicePaths);\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -296,8 +307,8 @@ StartDefaultBootOnTimeout (
   UINTN               BootOrderSize;\r
   UINTN               Index;\r
   CHAR16              BootVariableName[9];\r
-  EFI_STATUS           Status;\r
-  EFI_INPUT_KEY   Key;\r
+  EFI_STATUS          Status;\r
+  EFI_INPUT_KEY       Key;\r
 \r
   Size = sizeof(UINT16);\r
   Timeout = (UINT16)PcdGet16 (PcdPlatformBootTimeOut);\r
@@ -344,6 +355,7 @@ StartDefaultBootOnTimeout (
         }\r
         // In case of success, we should not return from this call.\r
       }\r
+      FreePool (BootOrder);\r
     }\r
   }\r
   return EFI_SUCCESS;\r
@@ -378,6 +390,9 @@ BdsEntry (
 {\r
   UINTN               Size;\r
   EFI_STATUS          Status;\r
+  UINT16             *BootNext;\r
+  UINTN               BootNextSize;\r
+  CHAR16              BootVariableName[9];\r
 \r
   PERF_END   (NULL, "DXE", NULL, 0);\r
 \r
@@ -392,16 +407,38 @@ BdsEntry (
   }\r
 \r
   // If BootNext environment variable is defined then we just load it !\r
-  Status = BdsStartBootOption (L"BootNext");\r
-  if (Status != EFI_NOT_FOUND) {\r
-    // BootNext has not been succeeded launched\r
-    if (EFI_ERROR(Status)) {\r
-      Print(L"Fail to start BootNext.\n");\r
+  BootNextSize = sizeof(UINT16);\r
+  Status = GetEnvironmentVariable (L"BootNext", NULL, &BootNextSize, (VOID**)&BootNext);\r
+  if (!EFI_ERROR(Status)) {\r
+    ASSERT(BootNextSize == sizeof(UINT16));\r
+\r
+    // Generate the requested Boot Entry variable name\r
+    UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", *BootNext);\r
+\r
+    // Set BootCurrent variable\r
+    gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid,\r
+              EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+              BootNextSize, BootNext);\r
+\r
+    FreePool (BootNext);\r
+\r
+    // Start the requested Boot Entry\r
+    Status = BdsStartBootOption (BootVariableName);\r
+    if (Status != EFI_NOT_FOUND) {\r
+      // BootNext has not been succeeded launched\r
+      if (EFI_ERROR(Status)) {\r
+        Print(L"Fail to start BootNext.\n");\r
+      }\r
+\r
+      // Delete the BootNext environment variable\r
+      gRT->SetVariable (L"BootNext", &gEfiGlobalVariableGuid,\r
+          EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+          0, NULL);\r
     }\r
 \r
-    // Delete the BootNext environment variable\r
-    gRT->SetVariable (L"BootNext", &gEfiGlobalVariableGuid,\r
-        EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+    // Clear BootCurrent variable\r
+    gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid,\r
+        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
         0, NULL);\r
   }\r
 \r