- 执行流程
------------------------------> MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
VOID EFIAPI PeiCore (
IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreDataPtr,
IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList,
IN VOID *Data
)
{ .....InitializeSecurityServices(&PrivateData.Ps, OldCoreData); // === >
}
------------------------------> MdeModulePkg/Core/Pei/Security/Security.c
EFI_PEI_NOTIFY_DESCRIPTOR mNotifyList = {
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
&gEfiPeiSecurity2PpiGuid,
SecurityPpiNotifyCallback
};
##为安装安全PPI时提供回调。这个例程将把已安装的安全PPI缓存到PeiCore的私有数据中。
EFI_STATUS EFIAPI SecurityPpiNotifyCallback (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
IN VOID *Ppi
)
{
PEI_CORE_INSTANCE *PrivateData;
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);
if (PrivateData->PrivateSecurityPpi == NULL) {
PrivateData->PrivateSecurityPpi = (EFI_PEI_SECURITY2_PPI *)Ppi;
}
return EFI_SUCCESS;
}
##初始化安全服务。
VOID InitializeSecurityServices (
IN EFI_PEI_SERVICES **PeiServices,
IN PEI_CORE_INSTANCE *OldCoreData
){
if (OldCoreData == NULL) {
PeiServicesNotifyPpi (&mNotifyList); // === >
}
return;
}
------------------------------> MdePkg/Library/PeiServicesLib/PeiServicesLib.c
## 此服务允许PEIMs注册一个给定的服务,以便在安装或重新安装另一个服务时调用该服务。
EFI_STATUS EFIAPI PeiServicesNotifyPpi (
IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList
)
{
CONST EFI_PEI_SERVICES **PeiServices;PeiServices = GetPeiServicesTablePointer ();
return (*PeiServices)->NotifyPpi (PeiServices, NotifyList); // === >
}
------------------------------> MdeModulePkg/Core/Pei/Ppi/Ppi.c
##此函数安装一个通知服务,以便在安装或重新安装给定接口时调用该服务。该服务的目的是发布一个接口,其他各方可以使用该接口来调用以后可能实现的其他PPIs。 [EFI_PEI_SERVICES gPs服务之一]
EFI_STATUS EFIAPI PeiNotifyPpi (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList
)
{
return InternalPeiNotifyPpi (PeiServices, NotifyList, FALSE); // === >
}
##此函数安装一个通知服务,以便在安装或重新安装给定接口时调用该服务。该服务的目的是发布一个接口,其他各方可以使用该接口来调用以后可能实现的其他PPIs。
EFI_STATUS InternalPeiNotifyPpi (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList,
IN BOOLEAN Single
)
{ .....// 将 PEI_PPI_LIST_POINTERS 安装到 PpiData->PpiListPtrs[]的低部。
DispatchNotify ( // === >
PrivateData,
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,
0,
PrivateData->PpiData.PpiListEnd,
LastCallbackNotify,
PrivateData->PpiData.NotifyListEnd
);}
##发送通知。
VOID DispatchNotify (
IN PEI_CORE_INSTANCE *PrivateData,
IN UINTN NotifyType,
IN INTN InstallStartIndex,
IN INTN InstallStopIndex,
IN INTN NotifyStartIndex,
IN INTN NotifyStopIndex
)
{ ....// 遍历注册的Notify的GUID,查找与之匹配GUID的ppi。并回调Notify的方法。
NotifyDescriptor->Notify ( // === >
(EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),
NotifyDescriptor,
(PrivateData->PpiData.PpiListPtrs[Index2].Ppi)->Ppi
);....
}