Update DxeCore to deal PIWG FV device path case if FV contains extension header.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7850 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
f0480ecf80
commit
84266565f5
|
@ -18,33 +18,56 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
#include "DxeMain.h"
|
#include "DxeMain.h"
|
||||||
#include "FwVolBlock.h"
|
#include "FwVolBlock.h"
|
||||||
|
|
||||||
|
FV_MEMMAP_DEVICE_PATH mFvMemmapDevicePathTemplate = {
|
||||||
|
{
|
||||||
|
{
|
||||||
|
HARDWARE_DEVICE_PATH,
|
||||||
|
HW_MEMMAP_DP,
|
||||||
|
{
|
||||||
|
(UINT8)(sizeof (MEMMAP_DEVICE_PATH)),
|
||||||
|
(UINT8)(sizeof (MEMMAP_DEVICE_PATH) >> 8)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
EfiMemoryMappedIO,
|
||||||
|
(EFI_PHYSICAL_ADDRESS) 0,
|
||||||
|
(EFI_PHYSICAL_ADDRESS) 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
END_DEVICE_PATH_TYPE,
|
||||||
|
END_ENTIRE_DEVICE_PATH_SUBTYPE,
|
||||||
|
{
|
||||||
|
END_DEVICE_PATH_LENGTH,
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
FV_PIWG_DEVICE_PATH mFvPIWGDevicePathTemplate = {
|
||||||
|
{
|
||||||
|
{
|
||||||
|
MEDIA_DEVICE_PATH,
|
||||||
|
MEDIA_PIWG_FW_VOL_DP,
|
||||||
|
{
|
||||||
|
(UINT8)(sizeof (MEDIA_FW_VOL_DEVICE_PATH)),
|
||||||
|
(UINT8)(sizeof (MEDIA_FW_VOL_DEVICE_PATH) >> 8)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ 0 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
END_DEVICE_PATH_TYPE,
|
||||||
|
END_ENTIRE_DEVICE_PATH_SUBTYPE,
|
||||||
|
{
|
||||||
|
END_DEVICE_PATH_LENGTH,
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
EFI_FW_VOL_BLOCK_DEVICE mFwVolBlock = {
|
EFI_FW_VOL_BLOCK_DEVICE mFwVolBlock = {
|
||||||
FVB_DEVICE_SIGNATURE,
|
FVB_DEVICE_SIGNATURE,
|
||||||
NULL,
|
NULL,
|
||||||
{
|
NULL,
|
||||||
{
|
|
||||||
{
|
|
||||||
HARDWARE_DEVICE_PATH,
|
|
||||||
HW_MEMMAP_DP,
|
|
||||||
{
|
|
||||||
(UINT8)(sizeof (MEMMAP_DEVICE_PATH)),
|
|
||||||
(UINT8)(sizeof (MEMMAP_DEVICE_PATH) >> 8)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
EfiMemoryMappedIO,
|
|
||||||
(EFI_PHYSICAL_ADDRESS) 0,
|
|
||||||
(EFI_PHYSICAL_ADDRESS) 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
END_DEVICE_PATH_TYPE,
|
|
||||||
END_ENTIRE_DEVICE_PATH_SUBTYPE,
|
|
||||||
{
|
|
||||||
END_DEVICE_PATH_LENGTH,
|
|
||||||
0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
FwVolBlockGetAttributes,
|
FwVolBlockGetAttributes,
|
||||||
(EFI_FVB_SET_ATTRIBUTES)FwVolBlockSetAttributes,
|
(EFI_FVB_SET_ATTRIBUTES)FwVolBlockSetAttributes,
|
||||||
|
@ -466,6 +489,7 @@ ProduceFVBProtocolOnBuffer (
|
||||||
CoreFreePool (FvbDev);
|
CoreFreePool (FvbDev);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Last, fill in the cache with the linear address of the blocks
|
// Last, fill in the cache with the linear address of the blocks
|
||||||
//
|
//
|
||||||
|
@ -482,11 +506,26 @@ ProduceFVBProtocolOnBuffer (
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Set up the devicepath
|
// Judget whether FV name guid is produced in Fv extension header
|
||||||
//
|
//
|
||||||
FvbDev->DevicePath.MemMapDevPath.StartingAddress = BaseAddress;
|
if (FwVolHeader->ExtHeaderOffset == 0) {
|
||||||
FvbDev->DevicePath.MemMapDevPath.EndingAddress = BaseAddress + FwVolHeader->FvLength - 1;
|
//
|
||||||
|
// FV does not contains extension header, then produce MEMMAP_DEVICE_PATH
|
||||||
|
//
|
||||||
|
FvbDev->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocateCopyPool (sizeof (FV_MEMMAP_DEVICE_PATH), &mFvMemmapDevicePathTemplate);
|
||||||
|
((FV_MEMMAP_DEVICE_PATH *) FvbDev->DevicePath)->MemMapDevPath.StartingAddress = BaseAddress;
|
||||||
|
((FV_MEMMAP_DEVICE_PATH *) FvbDev->DevicePath)->MemMapDevPath.EndingAddress = BaseAddress + FwVolHeader->FvLength - 1;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// FV contains extension header, then produce MEDIA_FW_VOL_DEVICE_PATH
|
||||||
|
//
|
||||||
|
FvbDev->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocateCopyPool (sizeof (FV_PIWG_DEVICE_PATH), &mFvPIWGDevicePathTemplate);
|
||||||
|
CopyGuid (
|
||||||
|
&((FV_PIWG_DEVICE_PATH *)FvbDev->DevicePath)->FvDevPath.FvName,
|
||||||
|
(GUID *)(UINTN)(BaseAddress + FwVolHeader->ExtHeaderOffset)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// Attach FvVolBlock Protocol to new handle
|
// Attach FvVolBlock Protocol to new handle
|
||||||
|
@ -494,7 +533,7 @@ ProduceFVBProtocolOnBuffer (
|
||||||
Status = CoreInstallMultipleProtocolInterfaces (
|
Status = CoreInstallMultipleProtocolInterfaces (
|
||||||
&FvbDev->Handle,
|
&FvbDev->Handle,
|
||||||
&gEfiFirmwareVolumeBlockProtocolGuid, &FvbDev->FwVolBlockInstance,
|
&gEfiFirmwareVolumeBlockProtocolGuid, &FvbDev->FwVolBlockInstance,
|
||||||
&gEfiDevicePathProtocolGuid, &FvbDev->DevicePath,
|
&gEfiDevicePathProtocolGuid, FvbDev->DevicePath,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -25,17 +25,23 @@ typedef struct {
|
||||||
UINTN Length;
|
UINTN Length;
|
||||||
} LBA_CACHE;
|
} LBA_CACHE;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
MEMMAP_DEVICE_PATH MemMapDevPath;
|
MEMMAP_DEVICE_PATH MemMapDevPath;
|
||||||
EFI_DEVICE_PATH_PROTOCOL EndDevPath;
|
EFI_DEVICE_PATH_PROTOCOL EndDevPath;
|
||||||
} FV_DEVICE_PATH;
|
} FV_MEMMAP_DEVICE_PATH;
|
||||||
|
|
||||||
|
//
|
||||||
|
// UEFI Specification define FV device path format if FV provide name guid in extension header
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
MEDIA_FW_VOL_DEVICE_PATH FvDevPath;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL EndDevPath;
|
||||||
|
} FV_PIWG_DEVICE_PATH;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
FV_DEVICE_PATH DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
|
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
|
||||||
UINTN NumBlocks;
|
UINTN NumBlocks;
|
||||||
LBA_CACHE *LbaCache;
|
LBA_CACHE *LbaCache;
|
||||||
|
|
Loading…
Reference in New Issue