在PEI和DXE之间通过HOB 传递参数。例如从VOID EFIAPI DxeMain ( IN VOID *HobStart ) 的入口函数也可以看到输入参数只有一个,这个参数是在PEI阶段准备好的。
拿到HOB 后就可以按照下面的code从HOB中拿到PEI传递过来的数据
VectorInfoList = NULL;
GuidHob = GetNextGuidHob (&gEfiVectorHandoffInfoPpiGuid, HobStart);
if (GuidHob != NULL) {
VectorInfoList = (EFI_VECTOR_HANDOFF_INFO *) (GET_GUID_HOB_DATA(GuidHob));
}
调用GetNextGuidHob 来找从HobStart 开始第一个匹配gEfiVectorHandoffInfoPpiGuid的GuidHob。
VOID *
EFIAPI
GetNextGuidHob (
IN CONST EFI_GUID *Guid,
IN CONST VOID *HobStart
)
{
EFI_PEI_HOB_POINTERS GuidHob;
GuidHob.Raw = (UINT8 *) HobStart;
while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {
if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
break;
}
GuidHob.Raw = GET_NEXT_HOB (GuidHob);
}
return GuidHob.Raw;
}
可见会遍历整个GuidHob.Raw,如果找到guid的name等于gEfiVectorHandoffInfoPpiGuid 就停止,然后返回 GuidHob.Raw。
然后通过
#define GET_GUID_HOB_DATA(HobStart) \
(VOID *)(*(UINT8 **)&(HobStart) + sizeof (EFI_HOB_GUID_TYPE))
就可以拿到想要的gEfiVectorHandoffInfoPpiGuid
拿到HOB 后就可以按照下面的code从HOB中拿到PEI传递过来的数据
VectorInfoList = NULL;
GuidHob = GetNextGuidHob (&gEfiVectorHandoffInfoPpiGuid, HobStart);
if (GuidHob != NULL) {
VectorInfoList = (EFI_VECTOR_HANDOFF_INFO *) (GET_GUID_HOB_DATA(GuidHob));
}
调用GetNextGuidHob 来找从HobStart 开始第一个匹配gEfiVectorHandoffInfoPpiGuid的GuidHob。
VOID *
EFIAPI
GetNextGuidHob (
IN CONST EFI_GUID *Guid,
IN CONST VOID *HobStart
)
{
EFI_PEI_HOB_POINTERS GuidHob;
GuidHob.Raw = (UINT8 *) HobStart;
while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {
if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
break;
}
GuidHob.Raw = GET_NEXT_HOB (GuidHob);
}
return GuidHob.Raw;
}
可见会遍历整个GuidHob.Raw,如果找到guid的name等于gEfiVectorHandoffInfoPpiGuid 就停止,然后返回 GuidHob.Raw。
然后通过
#define GET_GUID_HOB_DATA(HobStart) \
(VOID *)(*(UINT8 **)&(HobStart) + sizeof (EFI_HOB_GUID_TYPE))
就可以拿到想要的gEfiVectorHandoffInfoPpiGuid