]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPkg/Library/BdsLib/BdsAppLoader.c
Sync up ArmPkg with patch from mailing list. Changed name of BdsLib.h to BdsUnixLib...
[mirror_edk2.git] / ArmPkg / Library / BdsLib / BdsAppLoader.c
1 /** @file
2 *
3 * Copyright (c) 2011, ARM Limited. All rights reserved.
4 *
5 * This program and the accompanying materials
6 * are licensed and made available under the terms and conditions of the BSD License
7 * which accompanies this distribution. The full text of the license may be found at
8 * http://opensource.org/licenses/bsd-license.php
9 *
10 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 *
13 **/
14
15 #include "BdsInternal.h"
16
17 EFI_STATUS
18 BdsLoadPeCoff (
19 IN BDS_FILE *EfiAppFile
20 )
21 {
22 EFI_STATUS Status;
23 EFI_HANDLE ImageHandle;
24 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH NewNode;
25 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
26
27 // Only support loading from FV right now
28 ASSERT(EfiAppFile->Type == BDS_FILETYPE_FV);
29
30 // Generate the Device Path for the file
31 DevicePath = DuplicateDevicePath(EfiAppFile->DevicePath);
32 EfiInitializeFwVolDevicepathNode (&NewNode, &(EfiAppFile->File.Fv.Guid));
33 DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&NewNode);
34
35 Status = gBS->LoadImage (TRUE, gImageHandle, DevicePath, NULL, 0, &ImageHandle);
36 if (!EFI_ERROR (Status)) {
37 Status = gBS->StartImage (ImageHandle, NULL, NULL);
38 }
39
40 return Status;
41 }
42
43 EFI_STATUS BdsLoadApplicationFromPath(
44 IN CHAR16* EfiAppPath
45 ) {
46 EFI_STATUS Status;
47 BDS_FILE EfiAppFile;
48
49 // Need to connect every drivers to ensure no dependencies are missing for the application
50 Status = BdsConnectAllDrivers();
51 if (EFI_ERROR(Status)) {
52 DEBUG ((EFI_D_ERROR, "FAIL to connect all drivers\n"));
53 return Status;
54 }
55
56 // Locate the application from a device path
57 Status = BdsLoadFilePath(EfiAppPath, &EfiAppFile);
58 if (EFI_ERROR(Status)) {
59 DEBUG ((EFI_D_ERROR, "ERROR: Do not find EFI application %s\n",EfiAppPath));
60 return Status;
61 }
62
63 // Start the application
64 Status = BdsLoadPeCoff(&EfiAppFile);
65
66 return Status;
67 }
68
69 EFI_STATUS BdsLoadApplication(
70 IN CHAR16* EfiApp
71 ) {
72 EFI_STATUS Status;
73 UINTN NoHandles, HandleIndex;
74 EFI_HANDLE *Handles;
75 BDS_FILE EfiAppFile;
76
77 // Need to connect every drivers to ensure no dependencies are missing for the application
78 Status = BdsConnectAllDrivers();
79 if (EFI_ERROR(Status)) {
80 DEBUG ((EFI_D_ERROR, "FAIL to connect all drivers\n"));
81 return Status;
82 }
83
84 // Search the application in any Firmware Volume
85 Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiFirmwareVolume2ProtocolGuid, NULL, &NoHandles, &Handles);
86 if (EFI_ERROR (Status) || (NoHandles == 0)) {
87 DEBUG ((EFI_D_ERROR, "FAIL to find Firmware Volume\n"));
88 return Status;
89 }
90
91 // Search in all Firmware Volume for the EFI Application
92 for (HandleIndex = 0; HandleIndex < NoHandles; HandleIndex++) {
93 Status = BdsLoadFileFromFirmwareVolume(Handles[HandleIndex],EfiApp,EFI_FV_FILETYPE_APPLICATION,&EfiAppFile);
94 if (!EFI_ERROR (Status)) {
95 // Start the application
96 Status = BdsLoadPeCoff(&EfiAppFile);
97 return Status;
98 }
99 }
100
101 return Status;
102 }