/** Creates an event. @param Type The type of event to create and its mode and attributes @param NotifyTpl The task priority level of event notifications @param NotifyFunction Pointer to the events notification function @param NotifyContext Pointer to the notification functions context; corresponds to parameter "Context" in the notification function @param Event Pointer to the newly created event if the call succeeds; undefined otherwise @retval EFI_SUCCESS The event structure was created @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value @retval EFI_OUT_OF_RESOURCES The event could not be allocated **/ EFI_STATUS EFIAPI CoreCreateEvent ( IN UINT32 Type, IN EFI_TPL NotifyTpl, IN EFI_EVENT_NOTIFY NotifyFunction, OPTIONAL IN VOID *NotifyContext, OPTIONAL OUT EFI_EVENT *Event ) { return CoreCreateEventEx (Type, NotifyTpl, NotifyFunction, NotifyContext, NULL, Event); }
/** Initializes "event" support. @retval EFI_SUCCESS Always return success **/ EFI_STATUS CoreInitializeEventServices ( VOID ) { UINTN Index; for (Index=0; Index <= TPL_HIGH_LEVEL; Index++) { InitializeListHead (&gEventQueue[Index]); } CoreInitializeTimer (); CoreCreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_NOTIFY, CoreEmptyCallbackFunction, NULL, &gIdleLoopEventGuid, &gIdleLoopEvent ); return EFI_SUCCESS; }
/** Initialize Memory Protection support. **/ VOID EFIAPI CoreInitializeMemoryProtection ( VOID ) { EFI_STATUS Status; EFI_EVENT Event; EFI_EVENT EndOfDxeEvent; VOID *Registration; mImageProtectionPolicy = PcdGet32(PcdImageProtectionPolicy); InitializeListHead (&mProtectedImageRecordList); // // Sanity check the PcdDxeNxMemoryProtectionPolicy setting: // - code regions should have no EFI_MEMORY_XP attribute // - EfiConventionalMemory and EfiBootServicesData should use the // same attribute // ASSERT ((GetPermissionAttributeForMemoryType (EfiBootServicesCode) & EFI_MEMORY_XP) == 0); ASSERT ((GetPermissionAttributeForMemoryType (EfiRuntimeServicesCode) & EFI_MEMORY_XP) == 0); ASSERT ((GetPermissionAttributeForMemoryType (EfiLoaderCode) & EFI_MEMORY_XP) == 0); ASSERT (GetPermissionAttributeForMemoryType (EfiBootServicesData) == GetPermissionAttributeForMemoryType (EfiConventionalMemory)); if (mImageProtectionPolicy != 0 || PcdGet64 (PcdDxeNxMemoryProtectionPolicy) != 0) { Status = CoreCreateEvent ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, MemoryProtectionCpuArchProtocolNotify, NULL, &Event ); ASSERT_EFI_ERROR(Status); // // Register for protocol notifactions on this event // Status = CoreRegisterProtocolNotify ( &gEfiCpuArchProtocolGuid, Event, &Registration ); ASSERT_EFI_ERROR(Status); } // // Register a callback to disable NULL pointer detection at EndOfDxe // if ((PcdGet8 (PcdNullPointerDetectionPropertyMask) & (BIT0|BIT7)) == (BIT0|BIT7)) { Status = CoreCreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_NOTIFY, DisableNullDetectionAtTheEndOfDxe, NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent ); ASSERT_EFI_ERROR (Status); } return ; }
EFI_BOOTSERVICE EFI_STATUS EFIAPI CoreCreateEvent ( IN UINT32 Type, IN EFI_TPL NotifyTpl, IN EFI_EVENT_NOTIFY NotifyFunction, IN VOID *NotifyContext, OUT EFI_EVENT *Event ) /*++ Routine Description: Creates a general-purpose event structure Arguments: Type - The type of event to create and its mode and attributes NotifyTpl - The task priority level of event notifications NotifyFunction - Pointer to the events notification function NotifyContext - Pointer to the notification functions context; corresponds to parameter "Context" in the notification function Event - Pointer to the newly created event if the call succeeds; undefined otherwise Returns: EFI_SUCCESS - The event structure was created EFI_INVALID_PARAMETER - One of the parameters has an invalid value EFI_OUT_OF_RESOURCES - The event could not be allocated --*/ { EFI_GUID *GuidPtr; EFI_EVENT_NOTIFY Function; GuidPtr = NULL; Function = NotifyFunction; #if (EFI_SPECIFICATION_VERSION < 0x00020000) // // Clear EFI_EVENT_NOFITY_SIGNAL_ALL (Tiano extension) as all events in the // EventGroup now have this property. So we need to filter it out. // if (Type & EFI_EVENT_NOTIFY_SIGNAL_ALL) { Type &= ~EFI_EVENT_NOTIFY_SIGNAL_ALL; Function = EventNotifySignalAllNullEvent; } // // Map the Tiano extensions Events to CreateEventEx form // if (Type == EFI_EVENT_SIGNAL_READY_TO_BOOT) { GuidPtr = &gEfiEventReadyToBootGuid; } else if (Type == EFI_EVENT_SIGNAL_LEGACY_BOOT) { GuidPtr = &gEfiEventLegacyBootGuid; } #endif // // Convert EFI 1.10 Events to thier UEFI 2.0 CreateEventEx mapping // if (Type == EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES) { Type = 0; GuidPtr = &gEfiEventExitBootServicesGuid; } else if (Type == EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE) { Type = 0; GuidPtr = &gEfiEventVirtualAddressChangeGuid; } return CoreCreateEventEx (Type, NotifyTpl, Function, NotifyContext, GuidPtr, Event); }