]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Bus/Pci/PciBusDxe/PciDriverOverride.c
Update PCI Bus Driver to use the PeCoffLib instead of paring the PE/COFF image itself
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Pci / PciBusDxe / PciDriverOverride.c
CommitLineData
97404058 1/** @file\r
ead42efc 2\r
3db51098 3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
ead42efc 11\r
3db51098 12**/\r
ead42efc 13\r
ead42efc 14\r
03417d8d 15#include "PciBus.h"\r
ead42efc 16\r
bcd70414 17/**\r
97404058 18 Initializes a PCI Driver Override Instance.\r
ead42efc 19\r
97404058 20 @param PciIoDevice Device instance.\r
ead42efc 21\r
97404058 22 @retval EFI_SUCCESS Operation success.\r
bcd70414 23**/\r
a3b8e257 24EFI_STATUS\r
25InitializePciDriverOverrideInstance (\r
26 PCI_IO_DEVICE *PciIoDevice\r
27 )\r
ead42efc 28{\r
29 PciIoDevice->PciDriverOverride.GetDriver = GetDriver;\r
30 return EFI_SUCCESS;\r
31}\r
32\r
a3b8e257 33/**\r
97404058 34 Get a overriding driver image.\r
35 @param This Pointer to instance of EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL.\r
36 @param DriverImageHandle Override driver image.\r
a3b8e257 37 \r
97404058 38 @retval EFI_SUCCESS Success to get driver image handle.\r
39 @retval EFI_NOT_FOUND can not find override driver image.\r
40 @retval EFI_INVALID_PARAMETER Invalid parameter.\r
a3b8e257 41**/\r
ead42efc 42EFI_STATUS\r
43EFIAPI\r
44GetDriver (\r
45 IN EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *This,\r
46 IN OUT EFI_HANDLE *DriverImageHandle\r
47 )\r
ead42efc 48{\r
49 PCI_IO_DEVICE *PciIoDevice;\r
50 LIST_ENTRY *CurrentLink;\r
51 PCI_DRIVER_OVERRIDE_LIST *Node;\r
52\r
53 PciIoDevice = PCI_IO_DEVICE_FROM_PCI_DRIVER_OVERRIDE_THIS (This);\r
54\r
55 CurrentLink = PciIoDevice->OptionRomDriverList.ForwardLink;\r
56\r
97404058 57 while (CurrentLink != NULL && CurrentLink != &PciIoDevice->OptionRomDriverList) {\r
ead42efc 58\r
59 Node = DRIVER_OVERRIDE_FROM_LINK (CurrentLink);\r
60\r
61 if (*DriverImageHandle == NULL) {\r
62\r
63 *DriverImageHandle = Node->DriverImageHandle;\r
64 return EFI_SUCCESS;\r
65 }\r
66\r
67 if (*DriverImageHandle == Node->DriverImageHandle) {\r
68\r
69 if (CurrentLink->ForwardLink == &PciIoDevice->OptionRomDriverList ||\r
70 CurrentLink->ForwardLink == NULL) {\r
71 return EFI_NOT_FOUND;\r
72 }\r
73\r
74 //\r
75 // Get next node\r
76 //\r
77 Node = DRIVER_OVERRIDE_FROM_LINK (CurrentLink->ForwardLink);\r
78 *DriverImageHandle = Node->DriverImageHandle;\r
79 return EFI_SUCCESS;\r
80 }\r
81\r
82 CurrentLink = CurrentLink->ForwardLink;\r
83 }\r
84\r
85 return EFI_INVALID_PARAMETER;\r
86}\r
87\r
a3b8e257 88/**\r
89 Add an overriding driver image\r
90 \r
eeefcb9d 91 @param PciIoDevice Instance of PciIo device.\r
92 @param DriverImageHandle new added driver image.\r
a3b8e257 93 \r
eeefcb9d 94 @retval EFI_OUT_OF_RESOURCES no memory resource for new driver instance.\r
95 @retval EFI_SUCCESS Success add driver.\r
a3b8e257 96**/\r
ead42efc 97EFI_STATUS\r
98AddDriver (\r
99 IN PCI_IO_DEVICE *PciIoDevice,\r
100 IN EFI_HANDLE DriverImageHandle\r
101 )\r
ead42efc 102{\r
103 EFI_STATUS Status;\r
ead42efc 104 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
2fb718b0 105 PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
ead42efc 106 PCI_DRIVER_OVERRIDE_LIST *Node;\r
107\r
108 Status = gBS->HandleProtocol (DriverImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &LoadedImage);\r
109 if (EFI_ERROR (Status)) {\r
110 return Status;\r
111 }\r
112\r
113 Node = AllocatePool (sizeof (PCI_DRIVER_OVERRIDE_LIST));\r
114 if (Node == NULL) {\r
115 return EFI_OUT_OF_RESOURCES;\r
116 }\r
117\r
118 Node->Signature = DRIVER_OVERRIDE_SIGNATURE;\r
119 Node->DriverImageHandle = DriverImageHandle;\r
120\r
121 InsertTailList (&PciIoDevice->OptionRomDriverList, &(Node->Link));\r
122\r
123 PciIoDevice->BusOverride = TRUE;\r
124\r
2fb718b0 125 ImageContext.Handle = LoadedImage->ImageBase;\r
126 ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;\r
127\r
128 //\r
129 // Get information about the image \r
130 //\r
131 Status = PeCoffLoaderGetImageInfo (&ImageContext);\r
132 if (EFI_ERROR (Status)) {\r
ead42efc 133 return EFI_SUCCESS;\r
134 }\r
135\r
2fb718b0 136 if (ImageContext.Machine != EFI_IMAGE_MACHINE_EBC) {\r
ead42efc 137 return EFI_SUCCESS;\r
138 }\r
2fb718b0 139\r
ead42efc 140 return EFI_SUCCESS;\r
141}\r
a3b8e257 142\r