下面这些services 为PPI database 提供了接口的集合:就是说,所有的操作都是基于PPI database的
InstallPpi()
ReinstallPpi()
LocatePpi()
NotifyPpi()
InstallPpi()
小节
这个是由PEI Foundation提供的第一个service.它通过 GUID 向PPI database 中安装一个接口(interface),
这个service的目的就是公布一个interface 以方便其他的部分可以调用额外的PEIM.
原型
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_INSTALL_PPI) (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList
);
</pre>参数<p></p><p>PeiServices</p><p><span style="white-space:pre"></span>一个指向EFI_PEI_SERVICES表的间接指针,这个表由PEI Foundation published,不知道翻译成什么</p><p>原文 是 An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.</p><p>PpiList</p><p><span style="white-space:pre"> </span>一个指向将会被安装的interface 列表的指针</p><p>这个service 使得peim 可以向PEI Foundation, PEI Foundation 维护指向列表的指针而不是整个list,</p><p>这个list 要么是peim 本体要么是分配在临时或者永久内存中的。</p><p>有两种类型的EFI_PEI_PPI_DESCRIPTOR 可以被安装,包括</p><p>EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH 和 EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK.</p><p>返回的状态码</p><p><table border="1" width="400" cellspacing="1" cellpadding="1"><tbody><tr><td>EFI_SUCCESS<span style="white-space:pre"> </span></td><td>the interface was successfully installed.</td></tr><tr><td>EFI_INVALID_PARAMETER<span style="white-space:pre"> </span></td><td>The PpiList pointer is NULL</td></tr><tr><td>EFI_INVALID_PARAMETER<span style="white-space:pre"> </span></td><td>Any of the PEI PPI descriptors in the list do not have the EFI_PEI_PPI_DESCRIPTOR_PPI bit set in the Flags field.</td></tr><tr><td>EFI_OUT_OF_RESOURCES</td><td>There is no additional space in the PPI database.</td></tr></tbody></table>ReinstallPpi()</p><p>这个函数通过GUID重新安装一个interface,这个service的目的是publish一个Interfere,使得别的部分</p><p>可以替换interface.</p><p></p><p>原型</p><p><pre name="code" class="cpp">typedef
EFI_STATUS
(EFIAPI *EFI_PEI_REINSTALL_PPI) (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_PPI_DESCRIPTOR *OldPpi,
IN CONST EFI_PEI_PPI_DESCRIPTOR *NewPpi
);
参数
PeiServices
一个由PEI Foundation publish的指向EFI_PEI_SERVICES 表
OldPpi
database中一个指向先前PPI 的指针。
NewPpi
一个指向新的将会被安装的interface的指针
描述
这个service 使得PEIM 在ppi database 里面使用另外一个entry 替换一个entry.
返回的状态码
EFI_SUCCESS | the interface was successfully installed |
EFI_INVALID_PARAMETER | The Oldppi or NewPpi pointer is NULL |
EFI_INVALID_PARAMETER | Any of the PEI PPI descriptors in the list do not have the EFI_PEI_PPI_DESCRIPTOR_PPI bit set in the Flags field |
EFI_OUT_OF_RESOURCES | There is no additional space in the PPI database. |
EFI_NOT_FOUND | The PPI for which the reinstallation was requested has not been installed. |
LocatePpi()
这个函数使用GUID 在 PEI PPI database 中找一个interface.
原型
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_LOCATE_PPI) (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_GUID *Guid,
IN UINTN Instance,
IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor OPTIONAL,
IN OUT VOID **Ppi
);