]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Library/BdsLib/BdsHelper.c
ArmPkg/ArmSoftfloatLib: restrict -fno-tree-vrp option to GCC46 and GCC47
[mirror_edk2.git] / ArmPkg / Library / BdsLib / BdsHelper.c
index 88e8fa34533c18069e0be2281463e9b91a51e600..b10fe2074d5340c8de1b4be98bd4f6be7309e85f 100644 (file)
@@ -1,24 +1,23 @@
 /** @file\r
 *\r
-*  Copyright (c) 2011, 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
-*  which accompanies this distribution.  The full text of the license may be found at        \r
-*  http://opensource.org/licenses/bsd-license.php                                            \r
+*  Copyright (c) 2011-2015, ARM Limited. All rights reserved.\r
 *\r
-*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+*  This program and the accompanying materials\r
+*  are licensed and made available under the terms and conditions of the BSD License\r
+*  which accompanies this distribution.  The full text of the license may be found at\r
+*  http://opensource.org/licenses/bsd-license.php\r
+*\r
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 *\r
 **/\r
 \r
 #include "BdsInternal.h"\r
 \r
-#include <Library/DxeServicesTableLib.h>\r
-#include <Library/HobLib.h>\r
-\r
 EFI_STATUS\r
-ShutdownUefiBootServices( VOID )\r
+ShutdownUefiBootServices (\r
+  VOID\r
+  )\r
 {\r
   EFI_STATUS              Status;\r
   UINTN                   MemoryMapSize;\r
@@ -30,6 +29,8 @@ ShutdownUefiBootServices( VOID )
 \r
   MemoryMap = NULL;\r
   MemoryMapSize = 0;\r
+  Pages = 0;\r
+\r
   do {\r
     Status = gBS->GetMemoryMap (\r
                     &MemoryMapSize,\r
@@ -53,170 +54,129 @@ ShutdownUefiBootServices( VOID )
                       &DescriptorSize,\r
                       &DescriptorVersion\r
                       );\r
-      // Don't do anything between the GetMemoryMap() and ExitBootServices()\r
-      if (!EFI_ERROR (Status)) {\r
-        Status = gBS->ExitBootServices (gImageHandle, MapKey);\r
-        if (EFI_ERROR (Status)) {\r
-          FreePages (MemoryMap, Pages);\r
-          MemoryMap = NULL;\r
-          MemoryMapSize = 0;\r
-        }\r
+    }\r
+\r
+    // Don't do anything between the GetMemoryMap() and ExitBootServices()\r
+    if (!EFI_ERROR(Status)) {\r
+      Status = gBS->ExitBootServices (gImageHandle, MapKey);\r
+      if (EFI_ERROR(Status)) {\r
+        FreePages (MemoryMap, Pages);\r
+        MemoryMap = NULL;\r
+        MemoryMapSize = 0;\r
       }\r
     }\r
-  } while (EFI_ERROR (Status));\r
+  } while (EFI_ERROR(Status));\r
 \r
   return Status;\r
 }\r
 \r
-EFI_STATUS\r
-BdsConnectAllDrivers( VOID ) {\r
-    UINTN                     HandleCount, Index;\r
-    EFI_HANDLE                *HandleBuffer;\r
-    EFI_STATUS                Status;\r
-\r
-    do {\r
-        // Locate all the driver handles\r
-        Status = gBS->LocateHandleBuffer (\r
-                    AllHandles,\r
-                    NULL,\r
-                    NULL,\r
-                    &HandleCount,\r
-                    &HandleBuffer\r
-                    );\r
-        if (EFI_ERROR (Status)) {\r
-            break;\r
-        }\r
-\r
-        // Connect every handles\r
-        for (Index = 0; Index < HandleCount; Index++) {\r
-            gBS->ConnectController(HandleBuffer[Index], NULL, NULL, TRUE);\r
-        }\r
-\r
-        if (HandleBuffer != NULL) {\r
-            FreePool (HandleBuffer);\r
-        }\r
-        \r
-        // Check if new handles have been created after the start of the previous handles\r
-        Status = gDS->Dispatch ();\r
-    } while (!EFI_ERROR(Status));\r
-\r
-    return EFI_SUCCESS;\r
-}\r
+/**\r
+  Connect all DXE drivers\r
+\r
+  @retval EFI_SUCCESS           All drivers have been connected\r
+  @retval EFI_NOT_FOUND         No handles match the search.\r
+  @retval EFI_OUT_OF_RESOURCES  There is not resource pool memory to store the matching results.\r
 \r
-STATIC\r
+**/\r
 EFI_STATUS\r
-InsertSystemMemoryResources (\r
-  LIST_ENTRY *ResourceList,\r
-  EFI_HOB_RESOURCE_DESCRIPTOR *ResHob\r
+BdsConnectAllDrivers (\r
+  VOID\r
   )\r
 {\r
-  BDS_SYSTEM_MEMORY_RESOURCE  *NewResource;\r
-  LIST_ENTRY                  *Link;\r
-  LIST_ENTRY                  *NextLink;\r
-  LIST_ENTRY                  AttachedResources;\r
-  BDS_SYSTEM_MEMORY_RESOURCE  *Resource;\r
-  EFI_PHYSICAL_ADDRESS        NewResourceEnd;\r
-\r
-  if (IsListEmpty (ResourceList)) {\r
-    NewResource = AllocateZeroPool (sizeof(BDS_SYSTEM_MEMORY_RESOURCE));\r
-    NewResource->PhysicalStart = ResHob->PhysicalStart;\r
-    NewResource->ResourceLength = ResHob->ResourceLength;\r
-    InsertTailList (ResourceList, &NewResource->Link);\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  InitializeListHead (&AttachedResources);\r
-\r
-  Link = ResourceList->ForwardLink;\r
-  ASSERT (Link != NULL);\r
-  while (Link != ResourceList) {\r
-    Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)Link;\r
-\r
-    // Sanity Check. The resources should not overlapped.\r
-    ASSERT(!((ResHob->PhysicalStart >= Resource->PhysicalStart) && (ResHob->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))));\r
-    ASSERT(!((ResHob->PhysicalStart + ResHob->ResourceLength - 1 >= Resource->PhysicalStart) &&\r
-        ((ResHob->PhysicalStart + ResHob->ResourceLength - 1) < (Resource->PhysicalStart + Resource->ResourceLength))));\r
+  UINTN                     HandleCount, Index;\r
+  EFI_HANDLE                *HandleBuffer;\r
+  EFI_STATUS                Status;\r
 \r
-    // The new resource is attached after this resource descriptor\r
-    if (ResHob->PhysicalStart == Resource->PhysicalStart + Resource->ResourceLength) {\r
-      Resource->ResourceLength =  Resource->ResourceLength + ResHob->ResourceLength;\r
-\r
-      NextLink = RemoveEntryList (&Resource->Link);\r
-      InsertTailList (&AttachedResources, &Resource->Link);\r
-      Link = NextLink;\r
-    }\r
-    // The new resource is attached before this resource descriptor\r
-    else if (ResHob->PhysicalStart + ResHob->ResourceLength == Resource->PhysicalStart) {\r
-      Resource->PhysicalStart = ResHob->PhysicalStart;\r
-      Resource->ResourceLength =  Resource->ResourceLength + ResHob->ResourceLength;\r
-\r
-      NextLink = RemoveEntryList (&Resource->Link);\r
-      InsertTailList (&AttachedResources, &Resource->Link);\r
-      Link = NextLink;\r
-    } else {\r
-      Link = Link->ForwardLink;\r
+  do {\r
+    // Locate all the driver handles\r
+    Status = gBS->LocateHandleBuffer (\r
+                AllHandles,\r
+                NULL,\r
+                NULL,\r
+                &HandleCount,\r
+                &HandleBuffer\r
+                );\r
+    if (EFI_ERROR (Status)) {\r
+      break;\r
     }\r
-  }\r
 \r
-  if (!IsListEmpty (&AttachedResources)) {\r
-    // See if we can merge the attached resource with other resources\r
-\r
-    NewResource = (BDS_SYSTEM_MEMORY_RESOURCE*)GetFirstNode (&AttachedResources);\r
-    Link = RemoveEntryList (&NewResource->Link);\r
-    while (!IsListEmpty (&AttachedResources)) {\r
-      // Merge resources\r
-      Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)Link;\r
+    // Connect every handles\r
+    for (Index = 0; Index < HandleCount; Index++) {\r
+      gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
+    }\r
 \r
-      // Ensure they overlap each other\r
-      ASSERT(\r
-          ((NewResource->PhysicalStart >= Resource->PhysicalStart) && (NewResource->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))) ||\r
-          (((NewResource->PhysicalStart + NewResource->ResourceLength) >= Resource->PhysicalStart) && ((NewResource->PhysicalStart + NewResource->ResourceLength) < (Resource->PhysicalStart + Resource->ResourceLength)))\r
-      );\r
+    if (HandleBuffer != NULL) {\r
+      FreePool (HandleBuffer);\r
+    }\r
 \r
-      NewResourceEnd = MAX (NewResource->PhysicalStart + NewResource->ResourceLength, Resource->PhysicalStart + Resource->ResourceLength);\r
-      NewResource->PhysicalStart = MIN (NewResource->PhysicalStart, Resource->PhysicalStart);\r
-      NewResource->ResourceLength = NewResourceEnd - NewResource->PhysicalStart;\r
+    // Check if new handles have been created after the start of the previous handles\r
+    Status = gDS->Dispatch ();\r
+  } while (!EFI_ERROR(Status));\r
 \r
-      Link = RemoveEntryList (Link);\r
-    }\r
-  } else {\r
-    // None of the Resource of the list is attached to this ResHob. Create a new entry for it\r
-    NewResource = AllocateZeroPool (sizeof(BDS_SYSTEM_MEMORY_RESOURCE));\r
-    NewResource->PhysicalStart = ResHob->PhysicalStart;\r
-    NewResource->ResourceLength = ResHob->ResourceLength;\r
-  }\r
-  InsertTailList (ResourceList, &NewResource->Link);\r
   return EFI_SUCCESS;\r
 }\r
 \r
 EFI_STATUS\r
-GetSystemMemoryResources (\r
-  IN  LIST_ENTRY *ResourceList\r
+GetGlobalEnvironmentVariable (\r
+  IN     CONST CHAR16*   VariableName,\r
+  IN     VOID*           DefaultValue,\r
+  IN OUT UINTN*          Size,\r
+  OUT    VOID**          Value\r
   )\r
 {\r
-  EFI_HOB_RESOURCE_DESCRIPTOR *ResHob;\r
-\r
-  InitializeListHead (ResourceList);\r
+  return GetEnvironmentVariable (VariableName, &gEfiGlobalVariableGuid,\r
+           DefaultValue, Size, Value);\r
+}\r
 \r
-  // Find the first System Memory Resource Descriptor\r
-  ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetFirstHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR);\r
-  while ((ResHob != NULL) && (ResHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY)) {\r
-    ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength));\r
-  }\r
+EFI_STATUS\r
+GetEnvironmentVariable (\r
+  IN     CONST CHAR16*   VariableName,\r
+  IN     EFI_GUID*       VendorGuid,\r
+  IN     VOID*           DefaultValue,\r
+  IN OUT UINTN*          Size,\r
+  OUT    VOID**          Value\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINTN       VariableSize;\r
+\r
+  // Try to get the variable size.\r
+  *Value = NULL;\r
+  VariableSize = 0;\r
+  Status = gRT->GetVariable ((CHAR16 *) VariableName, VendorGuid, NULL, &VariableSize, *Value);\r
+  if (Status == EFI_NOT_FOUND) {\r
+    if ((DefaultValue != NULL) && (Size != NULL) && (*Size != 0)) {\r
+      // If the environment variable does not exist yet then set it with the default value\r
+      Status = gRT->SetVariable (\r
+                    (CHAR16*)VariableName,\r
+                    VendorGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+                    *Size,\r
+                    DefaultValue\r
+                    );\r
+      *Value = AllocateCopyPool (*Size, DefaultValue);\r
+    } else {\r
+      return EFI_NOT_FOUND;\r
+    }\r
+  } else if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    // Get the environment variable value\r
+    *Value = AllocatePool (VariableSize);\r
+    if (*Value == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
 \r
-  // Did not find any\r
-  if (ResHob == NULL) {\r
-    return EFI_NOT_FOUND;\r
-  } else {\r
-    InsertSystemMemoryResources (ResourceList, ResHob);\r
-  }\r
+    Status = gRT->GetVariable ((CHAR16 *)VariableName, VendorGuid, NULL, &VariableSize, *Value);\r
+    if (EFI_ERROR (Status)) {\r
+      FreePool(*Value);\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
 \r
-  ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength));\r
-  while (ResHob != NULL) {\r
-    if (ResHob->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {\r
-      InsertSystemMemoryResources (ResourceList, ResHob);\r
+    if (Size) {\r
+      *Size = VariableSize;\r
     }\r
-    ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength));\r
+  } else {\r
+    *Value = AllocateCopyPool (*Size, DefaultValue);\r
+    return Status;\r
   }\r
 \r
   return EFI_SUCCESS;\r