]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/BdsLib/BdsHelper.c
ArmPkg/BdsLib: Remove Linux loader from BdsLib
[mirror_edk2.git] / ArmPkg / Library / BdsLib / BdsHelper.c
CommitLineData
1e57a462 1/** @file\r
2*\r
c75d3eb6 3* Copyright (c) 2011-2015, ARM Limited. All rights reserved.\r
1e57a462 4*\r
c0b2e477 5* This program and the accompanying materials\r
6* are licensed and made available under the terms and conditions of the BSD License\r
7* which accompanies this distribution. The full text of the license may be found at\r
8* http://opensource.org/licenses/bsd-license.php\r
9*\r
10* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
1e57a462 12*\r
13**/\r
14\r
15#include "BdsInternal.h"\r
16\r
1e57a462 17EFI_STATUS\r
18ShutdownUefiBootServices (\r
19 VOID\r
20 )\r
21{\r
22 EFI_STATUS Status;\r
23 UINTN MemoryMapSize;\r
24 EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
25 UINTN MapKey;\r
26 UINTN DescriptorSize;\r
27 UINT32 DescriptorVersion;\r
28 UINTN Pages;\r
29\r
30 MemoryMap = NULL;\r
31 MemoryMapSize = 0;\r
32 Pages = 0;\r
33\r
34 do {\r
35 Status = gBS->GetMemoryMap (\r
36 &MemoryMapSize,\r
37 MemoryMap,\r
38 &MapKey,\r
39 &DescriptorSize,\r
40 &DescriptorVersion\r
41 );\r
42 if (Status == EFI_BUFFER_TOO_SMALL) {\r
43\r
44 Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1;\r
45 MemoryMap = AllocatePages (Pages);\r
46\r
47 //\r
48 // Get System MemoryMap\r
49 //\r
50 Status = gBS->GetMemoryMap (\r
51 &MemoryMapSize,\r
52 MemoryMap,\r
53 &MapKey,\r
54 &DescriptorSize,\r
55 &DescriptorVersion\r
56 );\r
57 }\r
58\r
59 // Don't do anything between the GetMemoryMap() and ExitBootServices()\r
60 if (!EFI_ERROR(Status)) {\r
61 Status = gBS->ExitBootServices (gImageHandle, MapKey);\r
62 if (EFI_ERROR(Status)) {\r
63 FreePages (MemoryMap, Pages);\r
64 MemoryMap = NULL;\r
65 MemoryMapSize = 0;\r
66 }\r
67 }\r
68 } while (EFI_ERROR(Status));\r
69\r
70 return Status;\r
71}\r
72\r
73/**\r
74 Connect all DXE drivers\r
75\r
76 @retval EFI_SUCCESS All drivers have been connected\r
77 @retval EFI_NOT_FOUND No handles match the search.\r
78 @retval EFI_OUT_OF_RESOURCES There is not resource pool memory to store the matching results.\r
79\r
80**/\r
81EFI_STATUS\r
82BdsConnectAllDrivers (\r
83 VOID\r
84 )\r
85{\r
86 UINTN HandleCount, Index;\r
87 EFI_HANDLE *HandleBuffer;\r
88 EFI_STATUS Status;\r
89\r
90 do {\r
91 // Locate all the driver handles\r
92 Status = gBS->LocateHandleBuffer (\r
93 AllHandles,\r
94 NULL,\r
95 NULL,\r
96 &HandleCount,\r
97 &HandleBuffer\r
98 );\r
99 if (EFI_ERROR (Status)) {\r
100 break;\r
101 }\r
102\r
103 // Connect every handles\r
104 for (Index = 0; Index < HandleCount; Index++) {\r
105 gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
106 }\r
107\r
108 if (HandleBuffer != NULL) {\r
109 FreePool (HandleBuffer);\r
110 }\r
111\r
112 // Check if new handles have been created after the start of the previous handles\r
113 Status = gDS->Dispatch ();\r
114 } while (!EFI_ERROR(Status));\r
115\r
116 return EFI_SUCCESS;\r
117}\r
118\r
c0b2e477 119EFI_STATUS\r
120GetGlobalEnvironmentVariable (\r
121 IN CONST CHAR16* VariableName,\r
122 IN VOID* DefaultValue,\r
123 IN OUT UINTN* Size,\r
124 OUT VOID** Value\r
125 )\r
126{\r
127 return GetEnvironmentVariable (VariableName, &gEfiGlobalVariableGuid,\r
128 DefaultValue, Size, Value);\r
129}\r
130\r
1e57a462 131EFI_STATUS\r
132GetEnvironmentVariable (\r
133 IN CONST CHAR16* VariableName,\r
c0b2e477 134 IN EFI_GUID* VendorGuid,\r
1e57a462 135 IN VOID* DefaultValue,\r
136 IN OUT UINTN* Size,\r
137 OUT VOID** Value\r
138 )\r
139{\r
140 EFI_STATUS Status;\r
141 UINTN VariableSize;\r
142\r
143 // Try to get the variable size.\r
144 *Value = NULL;\r
145 VariableSize = 0;\r
c0b2e477 146 Status = gRT->GetVariable ((CHAR16 *) VariableName, VendorGuid, NULL, &VariableSize, *Value);\r
1e57a462 147 if (Status == EFI_NOT_FOUND) {\r
148 if ((DefaultValue != NULL) && (Size != NULL) && (*Size != 0)) {\r
149 // If the environment variable does not exist yet then set it with the default value\r
150 Status = gRT->SetVariable (\r
151 (CHAR16*)VariableName,\r
c0b2e477 152 VendorGuid,\r
1e57a462 153 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
154 *Size,\r
155 DefaultValue\r
156 );\r
d8dc9f0a 157 *Value = AllocateCopyPool (*Size, DefaultValue);\r
1e57a462 158 } else {\r
159 return EFI_NOT_FOUND;\r
160 }\r
161 } else if (Status == EFI_BUFFER_TOO_SMALL) {\r
162 // Get the environment variable value\r
163 *Value = AllocatePool (VariableSize);\r
164 if (*Value == NULL) {\r
165 return EFI_OUT_OF_RESOURCES;\r
166 }\r
167\r
c0b2e477 168 Status = gRT->GetVariable ((CHAR16 *)VariableName, VendorGuid, NULL, &VariableSize, *Value);\r
1e57a462 169 if (EFI_ERROR (Status)) {\r
170 FreePool(*Value);\r
171 return EFI_INVALID_PARAMETER;\r
172 }\r
173\r
174 if (Size) {\r
175 *Size = VariableSize;\r
176 }\r
177 } else {\r
d8dc9f0a 178 *Value = AllocateCopyPool (*Size, DefaultValue);\r
1e57a462 179 return Status;\r
180 }\r
181\r
182 return EFI_SUCCESS;\r
183}\r