欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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_WAITEVT_NOTIFY_SIGNAL
					      都是普通事件类型,
					      都会有 Notification 函数
					      都 有可能会被 放入到 gEventQueue[Event->NotifyTpl] 待执行队列中.
					      只是触发函数不一样. 下面说是哪些函数导致会被放入, 这里先看流程

						  如果是这两种类型的事件,那么就必须要检查 NotifyTpl*/
		if ((Type & (EVT_NOTIFY_WAIT | EVT_NOTIFY_SIGNAL)) != 0) {
		    /*
		    	此时的 NotifyTplTPL_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);
	  	{
	  		
		}
	}	  	
}