-/*++\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
-\r
-Module Name:\r
-\r
- Dispatcher.c\r
-\r
-Abstract:\r
-\r
- Tiano DXE Dispatcher.\r
+/**@file\r
+ DXE Dispatcher.\r
\r
Step #1 - When a FV protocol is added to the system every driver in the FV\r
is added to the mDiscoveredList. The SOR, Before, and After Depex are \r
Depex - Dependency Expresion.\r
SOR - Schedule On Request - Don't schedule if this bit is set.\r
\r
---*/\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
+**/\r
\r
#include <DxeMain.h>\r
\r
STATIC\r
EFI_DEVICE_PATH_PROTOCOL *\r
CoreFvToDevicePath (\r
- IN EFI_FIRMWARE_VOLUME_PROTOCOL *Fv,\r
+ IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv,\r
IN EFI_HANDLE FvHandle,\r
IN EFI_GUID *DriverName\r
);\r
STATIC \r
EFI_STATUS\r
CoreAddToDriverList (\r
- IN EFI_FIRMWARE_VOLUME_PROTOCOL *Fv,\r
+ IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv,\r
IN EFI_HANDLE FvHandle,\r
IN EFI_GUID *DriverName\r
);\r
STATIC\r
EFI_STATUS \r
CoreProcessFvImageFile (\r
- IN EFI_FIRMWARE_VOLUME_PROTOCOL *Fv,\r
+ IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv,\r
IN EFI_HANDLE FvHandle,\r
IN EFI_GUID *DriverName\r
);\r
EFI_STATUS Status;\r
EFI_SECTION_TYPE SectionType;\r
UINT32 AuthenticationStatus;\r
- EFI_FIRMWARE_VOLUME_PROTOCOL *Fv;\r
+ EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
\r
\r
Fv = DriverEntry->Fv;\r
DriverEntry->DepexProtocolError = TRUE;\r
} else {\r
//\r
- // If no Depex assume EFI 1.1 driver model\r
+ // If no Depex assume UEFI 2.0 driver model\r
//\r
DriverEntry->Depex = NULL;\r
DriverEntry->Dependent = TRUE;\r
\r
CoreReleaseDispatcherLock ();\r
\r
-\r
- CoreReportProgressCodeSpecific (EFI_SOFTWARE_DXE_CORE | EFI_SW_PC_INIT_BEGIN, DriverEntry->ImageHandle);\r
+ CoreReportProgressCodeSpecific (\r
+ FixedPcdGet32(PcdStatusCodeValueDxeDriverBegin), \r
+ DriverEntry->ImageHandle\r
+ );\r
Status = CoreStartImage (DriverEntry->ImageHandle, NULL, NULL);\r
- CoreReportProgressCodeSpecific (EFI_SOFTWARE_DXE_CORE | EFI_SW_PC_INIT_END, DriverEntry->ImageHandle);\r
+ CoreReportProgressCodeSpecific (\r
+ FixedPcdGet32(PcdStatusCodeValueDxeDriverEnd), \r
+ DriverEntry->ImageHandle\r
+ );\r
\r
ReturnStatus = EFI_SUCCESS;\r
}\r
STATIC\r
EFI_DEVICE_PATH_PROTOCOL *\r
CoreFvToDevicePath (\r
- IN EFI_FIRMWARE_VOLUME_PROTOCOL *Fv,\r
+ IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv,\r
IN EFI_HANDLE FvHandle,\r
IN EFI_GUID *DriverName\r
)\r
\r
EFI_STATUS\r
CoreAddToDriverList (\r
- IN EFI_FIRMWARE_VOLUME_PROTOCOL *Fv,\r
+ IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv,\r
IN EFI_HANDLE FvHandle,\r
IN EFI_GUID *DriverName\r
)\r
--*/\r
{\r
EFI_PEI_HOB_POINTERS HobFv2;\r
- EFI_STATUS Status;\r
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;\r
- EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
- EFI_PHYSICAL_ADDRESS FvHeaderAddr;\r
\r
HobFv2.Raw = GetHobList ();\r
\r
while ((HobFv2.Raw = GetNextHob (EFI_HOB_TYPE_FV2, HobFv2.Raw)) != NULL) {\r
if (CompareGuid (DriverName, &HobFv2.FirmwareVolume2->FileName)) {\r
- Status = CoreHandleProtocol (FvHandle, &gEfiFirmwareVolumeBlockProtocolGuid, &Fvb);\r
- if (!EFI_ERROR (Status)) {\r
- Status = Fvb->GetPhysicalAddress (Fvb, &FvHeaderAddr);\r
- if (!EFI_ERROR (Status)) {\r
- FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FvHeaderAddr;\r
- if (CompareGuid (&FvHeader->FileSystemGuid, &HobFv2.FirmwareVolume2->FvName)) {\r
- return TRUE;\r
- }\r
- }\r
- }\r
+ return TRUE;\r
}\r
HobFv2.Raw = GET_NEXT_HOB (HobFv2);\r
}\r
\r
EFI_STATUS \r
CoreProcessFvImageFile (\r
- IN EFI_FIRMWARE_VOLUME_PROTOCOL *Fv,\r
+ IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv,\r
IN EFI_HANDLE FvHandle,\r
IN EFI_GUID *DriverName\r
)\r
EFI_SECTION_TYPE SectionType;\r
UINT32 AuthenticationStatus;\r
VOID *Buffer;\r
+ VOID *AlignedBuffer;\r
UINTN BufferSize;\r
+ EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
+ UINT32 FvAlignment; \r
\r
//\r
// Read the first (and only the first) firmware volume section\r
//\r
SectionType = EFI_SECTION_FIRMWARE_VOLUME_IMAGE;\r
+ FvHeader = NULL;\r
+ FvAlignment = 0;\r
Buffer = NULL;\r
BufferSize = 0;\r
+ AlignedBuffer = NULL;\r
Status = Fv->ReadSection (\r
Fv, \r
DriverName, \r
);\r
if (!EFI_ERROR (Status)) {\r
//\r
- // Produce a FVB protocol for the file\r
+ // FvImage should be at its required alignment.\r
//\r
- Status = ProduceFVBProtocolOnBuffer (\r
- (EFI_PHYSICAL_ADDRESS) (UINTN) Buffer,\r
- (UINT64)BufferSize,\r
- FvHandle,\r
- NULL\r
- );\r
+ FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) Buffer;\r
+ FvAlignment = 1 << ((FvHeader->Attributes & EFI_FVB2_ALIGNMENT) >> 16);\r
+ //\r
+ // FvAlignment must be more than 8 bytes required by FvHeader structure.\r
+ // \r
+ if (FvAlignment < 8) {\r
+ FvAlignment = 8;\r
+ }\r
+ \r
+ AlignedBuffer = AllocateAlignedPool ((UINTN) BufferSize, (UINTN) FvAlignment);\r
+ if (AlignedBuffer == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ } else {\r
+ //\r
+ // Move FvImage into the aligned buffer and release the original buffer.\r
+ //\r
+ CopyMem (AlignedBuffer, Buffer, BufferSize);\r
+ CoreFreePool (Buffer);\r
+ Buffer = NULL;\r
+ //\r
+ // Produce a FVB protocol for the file\r
+ //\r
+ Status = ProduceFVBProtocolOnBuffer (\r
+ (EFI_PHYSICAL_ADDRESS) (UINTN) AlignedBuffer,\r
+ (UINT64)BufferSize,\r
+ FvHandle,\r
+ NULL\r
+ );\r
+ }\r
}\r
\r
- if (EFI_ERROR (Status) && (Buffer != NULL)) { \r
- //\r
- // ReadSection or Produce FVB failed, Free data buffer\r
- //\r
- CoreFreePool (Buffer); \r
-\r
+ if (EFI_ERROR (Status)) { \r
+ //\r
+ // ReadSection or Produce FVB failed, Free data buffer\r
+ //\r
+ if (Buffer != NULL) {\r
+ CoreFreePool (Buffer); \r
+ }\r
+ \r
+ if (AlignedBuffer != NULL) {\r
+ FreeAlignedPool (AlignedBuffer);\r
+ }\r
}\r
\r
return Status;\r
EFI_STATUS Status;\r
EFI_STATUS GetNextFileStatus;\r
EFI_STATUS SecurityStatus;\r
- EFI_FIRMWARE_VOLUME_PROTOCOL *Fv;\r
+ EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
EFI_DEVICE_PATH_PROTOCOL *FvDevicePath;\r
EFI_HANDLE FvHandle;\r
UINTN BufferSize;\r
FvIsBeingProcesssed (FvHandle);\r
\r
\r
- Status = CoreHandleProtocol (FvHandle, &gEfiFirmwareVolumeProtocolGuid, (VOID **)&Fv);\r
+ Status = CoreHandleProtocol (FvHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID **)&Fv);\r
if (EFI_ERROR (Status)) {\r
//\r
// The Handle has a FirmwareVolumeDispatch protocol and should also contiain\r
if (FvFoundInHobFv2 (FvHandle, &NameGuid)) {\r
continue;\r
}\r
- \r
//\r
// Found a firmware volume image. Produce a firmware volume block\r
// protocol for it so it gets dispatched from. This is usually a \r
--*/\r
{\r
mFwVolEvent = CoreCreateProtocolNotifyEvent (\r
- &gEfiFirmwareVolumeProtocolGuid, \r
+ &gEfiFirmwareVolume2ProtocolGuid, \r
TPL_CALLBACK,\r
CoreFwVolEventProtocolNotify,\r
NULL,\r