UEFI中PEI阶段InitializeSecurityServices()分析

  • 执行流程

------------------------------> 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
                            );

....

}

 


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值