/*++\r
\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. 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
+Copyright (c) 2006 - 2007, Intel Corporation\r
+All rights reserved. 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
Module Name:\r
\r
PciDriverOverride.c\r
- \r
+\r
Abstract:\r
\r
PCI Bus Driver\r
Initializes a PCI Driver Override Instance\r
\r
Arguments:\r
- \r
+\r
Returns:\r
\r
None\r
Get a overriding driver image\r
\r
Arguments:\r
- \r
+\r
Returns:\r
\r
None\r
Add a overriding driver image\r
\r
Arguments:\r
- \r
+\r
Returns:\r
\r
None\r
EFI_IMAGE_NT_HEADERS *PeHdr;\r
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
PCI_DRIVER_OVERRIDE_LIST *Node;\r
-#if (EFI_SPECIFICATION_VERSION < 0x00020000)\r
- EFI_DRIVER_OS_HANDOFF_HEADER *DriverOsHandoffHeader;\r
- EFI_DRIVER_OS_HANDOFF_HEADER *NewDriverOsHandoffHeader;\r
- EFI_DRIVER_OS_HANDOFF *DriverOsHandoff;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_HANDLE DeviceHandle;\r
- UINTN NumberOfEntries;\r
- UINTN Size;\r
- UINTN Index;\r
-#endif\r
\r
Status = gBS->HandleProtocol (DriverImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &LoadedImage);\r
if (EFI_ERROR (Status)) {\r
if (PeHdr->FileHeader.Machine != EFI_IMAGE_MACHINE_EBC) {\r
return EFI_SUCCESS;\r
}\r
-\r
-#if (EFI_SPECIFICATION_VERSION < 0x00020000)\r
- DriverOsHandoffHeader = NULL;\r
- Status = EfiGetSystemConfigurationTable (&gEfiUgaIoProtocolGuid, (VOID **) &DriverOsHandoffHeader);\r
- if (!EFI_ERROR (Status) && DriverOsHandoffHeader != NULL) {\r
- for (Index = 0; Index < DriverOsHandoffHeader->NumberOfEntries; Index++) {\r
- DriverOsHandoff = (EFI_DRIVER_OS_HANDOFF *)((UINTN)(DriverOsHandoffHeader) + \r
- DriverOsHandoffHeader->HeaderSize + \r
- Index * DriverOsHandoffHeader->SizeOfEntries);\r
- DevicePath = DriverOsHandoff->DevicePath;\r
- Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &DevicePath, &DeviceHandle);\r
- if (!EFI_ERROR (Status) && DeviceHandle != NULL && IsDevicePathEnd (DevicePath)) {\r
- if (DeviceHandle == PciIoDevice->Handle) {\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- }\r
-\r
- NumberOfEntries = DriverOsHandoffHeader->NumberOfEntries + 1;\r
- } else {\r
- NumberOfEntries = 1;\r
- }\r
-\r
- Status = gBS->AllocatePool (\r
- EfiRuntimeServicesData,\r
- sizeof (EFI_DRIVER_OS_HANDOFF_HEADER) + NumberOfEntries * sizeof (EFI_DRIVER_OS_HANDOFF),\r
- (VOID **) &NewDriverOsHandoffHeader\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- if (DriverOsHandoffHeader == NULL) {\r
- NewDriverOsHandoffHeader->Version = 0;\r
- NewDriverOsHandoffHeader->HeaderSize = sizeof (EFI_DRIVER_OS_HANDOFF_HEADER);\r
- NewDriverOsHandoffHeader->SizeOfEntries = sizeof (EFI_DRIVER_OS_HANDOFF);\r
- NewDriverOsHandoffHeader->NumberOfEntries = (UINT32) NumberOfEntries;\r
- } else {\r
- gBS->CopyMem (\r
- NewDriverOsHandoffHeader,\r
- DriverOsHandoffHeader,\r
- DriverOsHandoffHeader->HeaderSize + (NumberOfEntries - 1) * DriverOsHandoffHeader->SizeOfEntries\r
- );\r
- NewDriverOsHandoffHeader->NumberOfEntries = (UINT32) NumberOfEntries;\r
- }\r
-\r
- DriverOsHandoff = (EFI_DRIVER_OS_HANDOFF *)((UINTN)NewDriverOsHandoffHeader + \r
- NewDriverOsHandoffHeader->HeaderSize + \r
- (NumberOfEntries - 1) * NewDriverOsHandoffHeader->SizeOfEntries);\r
-\r
- //\r
- // Fill in the EFI_DRIVER_OS_HANDOFF structure\r
- //\r
- DriverOsHandoff->Type = EfiUgaDriverFromPciRom;\r
-\r
- //\r
- // Compute the size of the device path\r
- //\r
- Size = GetDevicePathSize (PciIoDevice->DevicePath);\r
- if (Size == 0) {\r
- DriverOsHandoff->DevicePath = NULL;\r
- } else {\r
-\r
- //\r
- // Allocate space for duplicate device path\r
- //\r
- Status = gBS->AllocatePool (\r
- EfiRuntimeServicesData,\r
- Size,\r
- (VOID **) &DriverOsHandoff->DevicePath\r
- );\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePool (NewDriverOsHandoffHeader);\r
- return Status;\r
- }\r
-\r
- //\r
- // Make copy of device path\r
- //\r
- CopyMem (DriverOsHandoff->DevicePath, PciIoDevice->DevicePath, Size);\r
- }\r
-\r
- DriverOsHandoff->PciRomSize = (UINT64) PciIoDevice->PciIo.RomSize;\r
- Status = gBS->AllocatePool (\r
- EfiRuntimeServicesData,\r
- (UINTN) DriverOsHandoff->PciRomSize,\r
- (VOID **) &DriverOsHandoff->PciRomImage\r
- );\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePool (NewDriverOsHandoffHeader);\r
- return Status;\r
- }\r
-\r
- gBS->CopyMem (\r
- DriverOsHandoff->PciRomImage,\r
- PciIoDevice->PciIo.RomImage,\r
- (UINTN) DriverOsHandoff->PciRomSize\r
- );\r
-\r
- Status = gBS->InstallConfigurationTable (&gEfiUgaIoProtocolGuid, NewDriverOsHandoffHeader);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- if (DriverOsHandoffHeader != NULL) {\r
- gBS->FreePool (DriverOsHandoffHeader);\r
- }\r
-#endif\r
-\r
return EFI_SUCCESS;\r
}\r