UEFI Event --- 欣赏
程序员文章站
2022-06-17 14:42:03
...
/*
@func
创建一个事件。
@param:
Type 事件的类型
该函数的实现会对传入的 type 进行校验,
是强制与 mEventTable[] 中定义好的 valid type 以一比对来实现的.
这样的架构设计真的让人汗颜! ????
NotifyTpl 事件NotifyTpl函数的优先级
具体为什么要对函数执行优先级的限制,下面说
NotifyFunction 事件NotifyTpl函数
NotifyContext 传递给NotifyTpl函数的参数
Event 创建的事件
要传出的参数 大多数都是作为函数的最后一个参数传入的,
这要涉及到出栈、入栈的原理了.
比如 : linux kernel netlink 中
struct sock * __netlink_kernel_create(...)
{
struct sock *sk;
....
内部调用 sk_alloc() 创建 sock 套接字.
if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock))
return NULL;
}
*/
typedef
EFI_STATUS
(EFIAPI *EFI_CREATE_EVENT)(
IN UINT32 Type,
IN EFI_TPL NotifyTpl,
IN EFI_EVENT_NOTIFY NotifyFunction,
IN VOID *NotifyContext,
OUT EFI_EVENT *Event
);
{
/*
创建事件并且将事件加入事件组.
当然了 第 5 个参数为 NULL
*/
return CoreCreateEventEx (Type, NotifyTpl, NotifyFunction, NotifyContext, NULL, Event);
{
/*
EVT_NOTIFY_WAIT、EVT_NOTIFY_SIGNAL
都是普通事件类型,
都会有 Notification 函数
都 有可能会被 放入到 gEventQueue[Event->NotifyTpl] 待执行队列中.
只是触发函数不一样. 下面说是哪些函数导致会被放入, 这里先看流程
如果是这两种类型的事件,那么就必须要检查 NotifyTpl了
*/
if ((Type & (EVT_NOTIFY_WAIT | EVT_NOTIFY_SIGNAL)) != 0) {
/*
此时的 NotifyTpl 是 TPL_HIGH_LEVEL . 优先级最高了.
中断是被禁止的. 大部分 ***Event()函数是不支持运行在这个级别的.
*/
if (NotifyTpl != TPL_APPLICATION &&
NotifyTpl != TPL_CALLBACK &&
NotifyTpl != TPL_NOTIFY) {
return EFI_INVALID_PARAMETER;
}
}
return CoreCreateEventInternal (Type, NotifyTpl, NotifyFunction, NotifyContext, EventGroup, Event);
{
}
}
}