]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c
ShellPkg: Standardized HP Copyright Message String
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Load.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for attrib shell level 2 function.\r
3\r
c011b6c9 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
b54fd049 5 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
a405b86d 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellLevel2CommandsLib.h"\r
17\r
18// This function was from from the BdsLib implementation in\r
19// IntelFrameworkModulePkg\Library\GenericBdsLib\BdsConnect.c\r
20// function name: BdsLibConnectAllEfi\r
21/**\r
22 This function will connect all current system handles recursively. The\r
23 connection will finish until every handle's child handle created if it have.\r
24\r
25 @retval EFI_SUCCESS All handles and it's child handle have been\r
26 connected\r
27 @retval EFI_STATUS Return the status of gBS->LocateHandleBuffer().\r
28\r
29**/\r
30EFI_STATUS\r
31EFIAPI\r
32ConnectAllEfi (\r
33 VOID\r
34 )\r
35{\r
36 EFI_STATUS Status;\r
37 UINTN HandleCount;\r
38 EFI_HANDLE *HandleBuffer;\r
39 UINTN Index;\r
40\r
41 Status = gBS->LocateHandleBuffer (\r
42 AllHandles,\r
43 NULL,\r
44 NULL,\r
45 &HandleCount,\r
46 &HandleBuffer\r
47 );\r
48 if (EFI_ERROR (Status)) {\r
49 return Status;\r
50 }\r
51\r
52 for (Index = 0; Index < HandleCount; Index++) {\r
53 Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
54 }\r
55\r
56 if (HandleBuffer != NULL) {\r
57 FreePool (HandleBuffer);\r
58 }\r
59\r
60 return EFI_SUCCESS;\r
61}\r
62\r
63/**\r
64 function to load a .EFI driver into memory and possible connect the driver.\r
65\r
66 if FileName is NULL then ASSERT.\r
67\r
68 @param[in] FileName FileName of the driver to load\r
69 @param[in] Connect Whether to connect or not\r
70\r
71 @retval EFI_SUCCESS the driver was loaded and if Connect was\r
72 true then connect was attempted. Connection may\r
73 have failed.\r
74 @retval EFI_OUT_OF_RESOURCES there was insufficient memory\r
75**/\r
76EFI_STATUS\r
77EFIAPI\r
78LoadDriver(\r
79 IN CONST CHAR16 *FileName,\r
80 IN CONST BOOLEAN Connect\r
81 )\r
82{\r
83 EFI_HANDLE LoadedDriverHandle;\r
84 EFI_STATUS Status;\r
a405b86d 85 EFI_DEVICE_PATH_PROTOCOL *FilePath;\r
86 EFI_LOADED_IMAGE_PROTOCOL *LoadedDriverImage;\r
87\r
88 LoadedDriverImage = NULL;\r
89 FilePath = NULL;\r
a405b86d 90 LoadedDriverHandle = NULL;\r
91 Status = EFI_SUCCESS;\r
92\r
93 ASSERT (FileName != NULL);\r
94\r
95 //\r
96 // Fix local copies of the protocol pointers\r
97 //\r
98 Status = CommandInit();\r
99 ASSERT_EFI_ERROR(Status);\r
100\r
101 //\r
102 // Convert to DEVICE_PATH\r
103 //\r
104 FilePath = gEfiShellProtocol->GetDevicePathFromFilePath(FileName);\r
105\r
106 if (FilePath == NULL) {\r
107 ASSERT(FALSE);\r
108 return (EFI_INVALID_PARAMETER);\r
109 }\r
110\r
111 //\r
112 // Use LoadImage to get it into memory\r
113 //\r
114 Status = gBS->LoadImage(\r
115 FALSE,\r
116 gImageHandle,\r
117 FilePath,\r
118 NULL,\r
119 0,\r
120 &LoadedDriverHandle);\r
121\r
122 if (EFI_ERROR(Status)) {\r
123 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOAD_NOT_IMAGE), gShellLevel2HiiHandle, FileName, Status);\r
124 } else {\r
125 //\r
126 // Make sure it is a driver image\r
127 //\r
128 Status = gBS->HandleProtocol (LoadedDriverHandle, &gEfiLoadedImageProtocolGuid, (VOID *) &LoadedDriverImage);\r
129\r
130 ASSERT (LoadedDriverImage != NULL);\r
131\r
132 if ( EFI_ERROR(Status)\r
133 || ( LoadedDriverImage->ImageCodeType != EfiBootServicesCode\r
134 && LoadedDriverImage->ImageCodeType != EfiRuntimeServicesCode)\r
135 ){\r
136 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOAD_NOT_DRIVER), gShellLevel2HiiHandle, FileName);\r
137\r
138 //\r
139 // Exit and unload the non-driver image\r
140 //\r
141 gBS->Exit(LoadedDriverHandle, EFI_INVALID_PARAMETER, 0, NULL);\r
142 Status = EFI_INVALID_PARAMETER;\r
143 }\r
144 }\r
145\r
146 if (!EFI_ERROR(Status)) {\r
147 //\r
148 // Start the image\r
149 //\r
150 Status = gBS->StartImage(LoadedDriverHandle, NULL, NULL);\r
151 if (EFI_ERROR(Status)) {\r
152 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOAD_ERROR), gShellLevel2HiiHandle, FileName, Status);\r
153 } else {\r
154 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOAD_LOADED), gShellLevel2HiiHandle, FileName, LoadedDriverImage->ImageBase, Status);\r
155 }\r
156 }\r
157\r
158 if (!EFI_ERROR(Status) && Connect) {\r
159 //\r
160 // Connect it...\r
161 //\r
162 Status = ConnectAllEfi();\r
163 }\r
164\r
165 //\r
166 // clean up memory...\r
167 //\r
168 if (FilePath != NULL) {\r
169 FreePool(FilePath);\r
170 }\r
171\r
172 return (Status);\r
173}\r
174\r
175STATIC CONST SHELL_PARAM_ITEM LoadParamList[] = {\r
176 {L"-nc", TypeFlag},\r
177 {NULL, TypeMax}\r
178 };\r
179\r
180/**\r
181 Function for 'load' command.\r
182\r
183 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
184 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
185**/\r
186SHELL_STATUS\r
187EFIAPI\r
188ShellCommandRunLoad (\r
189 IN EFI_HANDLE ImageHandle,\r
190 IN EFI_SYSTEM_TABLE *SystemTable\r
191 )\r
192{\r
193 EFI_STATUS Status;\r
194 LIST_ENTRY *Package;\r
195 CHAR16 *ProblemParam;\r
196 SHELL_STATUS ShellStatus;\r
197 UINTN ParamCount;\r
198 EFI_SHELL_FILE_INFO *ListHead;\r
199 EFI_SHELL_FILE_INFO *Node;\r
200\r
201 ListHead = NULL;\r
202 ProblemParam = NULL;\r
203 ShellStatus = SHELL_SUCCESS;\r
204\r
205 //\r
206 // initialize the shell lib (we must be in non-auto-init...)\r
207 //\r
208 Status = ShellInitialize();\r
209 ASSERT_EFI_ERROR(Status);\r
210\r
211 //\r
212 // parse the command line\r
213 //\r
214 Status = ShellCommandLineParse (LoadParamList, &Package, &ProblemParam, TRUE);\r
215 if (EFI_ERROR(Status)) {\r
216 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
099e8ff5 217 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"load", ProblemParam); \r
a405b86d 218 FreePool(ProblemParam);\r
219 ShellStatus = SHELL_INVALID_PARAMETER;\r
220 } else {\r
221 ASSERT(FALSE);\r
222 }\r
223 } else {\r
224 //\r
225 // check for "-?"\r
226 //\r
227 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
228 ASSERT(FALSE);\r
229 } else if (ShellCommandLineGetRawValue(Package, 1) == NULL) {\r
230 //\r
231 // we didnt get a single file to load parameter\r
232 //\r
099e8ff5 233 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"load"); \r
a405b86d 234 ShellStatus = SHELL_INVALID_PARAMETER;\r
235 } else {\r
236 for ( ParamCount = 1\r
237 ; ShellCommandLineGetRawValue(Package, ParamCount) != NULL\r
238 ; ParamCount++\r
239 ){\r
240 Status = ShellOpenFileMetaArg((CHAR16*)ShellCommandLineGetRawValue(Package, ParamCount), EFI_FILE_MODE_READ, &ListHead);\r
241 if (!EFI_ERROR(Status)) {\r
242 for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link)\r
243 ; !IsNull(&ListHead->Link, &Node->Link)\r
244 ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&ListHead->Link, &Node->Link)\r
245 ){\r
246 //\r
247 // once we have an error preserve that value, but finish the loop.\r
248 //\r
249 if (EFI_ERROR(Status)) {\r
b54fd049 250 LoadDriver(Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag(Package, L"-nc")==FALSE));\r
a405b86d 251 } else {\r
b54fd049 252 Status = LoadDriver(Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag(Package, L"-nc")==FALSE));\r
a405b86d 253 }\r
254 } // for loop for multi-open\r
255 if (EFI_ERROR(Status)) {\r
256 ShellCloseFileMetaArg(&ListHead);\r
257 } else {\r
258 Status = ShellCloseFileMetaArg(&ListHead);;\r
259 }\r
260 } else {\r
261 //\r
262 // no files found.\r
263 //\r
099e8ff5 264 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"load", (CHAR16*)ShellCommandLineGetRawValue(Package, ParamCount)); \r
a405b86d 265 ShellStatus = SHELL_NOT_FOUND;\r
266 }\r
267 } // for loop for params\r
268 }\r
269\r
270 //\r
271 // free the command line package\r
272 //\r
273 ShellCommandLineFreeVarList (Package);\r
274 }\r
275\r
276 if (EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS) {\r
277 ShellStatus = SHELL_DEVICE_ERROR;\r
278 }\r
279\r
280 return (ShellStatus);\r
281}\r