176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*++ 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCopyright (c) 1998 Intel Corporation 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanModule Name: 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman event.c 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanAbstract: 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRevision History 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman--*/ 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lib.h" 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_EVENT 2276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLibCreateProtocolNotifyEvent ( 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN EFI_GUID *ProtocolGuid, 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN EFI_TPL NotifyTpl, 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN EFI_EVENT_NOTIFY NotifyFunction, 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN VOID *NotifyContext, 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman OUT VOID *Registration 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ) 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_STATUS Status; 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_EVENT Event; 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Create the event 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Status = uefi_call_wrapper( 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman BS->CreateEvent, 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5, 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EVT_NOTIFY_SIGNAL, 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NotifyTpl, 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NotifyFunction, 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NotifyContext, 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman &Event 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ); 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT (!EFI_ERROR(Status)); 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Register for protocol notifactions on this event 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Status = uefi_call_wrapper( 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman BS->RegisterProtocolNotify, 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3, 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ProtocolGuid, 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Event, 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Registration 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ); 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT (!EFI_ERROR(Status)); 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Kick the event so we will perform an initial pass of 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // current installed drivers 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uefi_call_wrapper(BS->SignalEvent, 1, Event); 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return Event; 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS 7376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanWaitForSingleEvent ( 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN EFI_EVENT Event, 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN UINT64 Timeout OPTIONAL 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ) 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_STATUS Status; 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman UINTN Index; 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_EVENT TimerEvent; 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_EVENT WaitList[2]; 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (Timeout) { 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Create a timer event 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Status = uefi_call_wrapper(BS->CreateEvent, 5, EVT_TIMER, 0, NULL, NULL, &TimerEvent); 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!EFI_ERROR(Status)) { 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Set the timer event 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uefi_call_wrapper(BS->SetTimer, 3, TimerEvent, TimerRelative, Timeout); 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Wait for the original event or the timer 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman WaitList[0] = Event; 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman WaitList[1] = TimerEvent; 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Status = uefi_call_wrapper(BS->WaitForEvent, 3, 2, WaitList, &Index); 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uefi_call_wrapper(BS->CloseEvent, 1, TimerEvent); 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // If the timer expired, change the return to timed out 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!EFI_ERROR(Status) && Index == 1) { 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Status = EFI_TIMEOUT; 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else { 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // No timeout... just wait on the event 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Status = uefi_call_wrapper(BS->WaitForEvent, 3, 1, &Event, &Index); 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT (!EFI_ERROR(Status)); 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT (Index == 0); 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return Status; 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanVOID 13076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanWaitForEventWithTimeout ( 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN EFI_EVENT Event, 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN UINTN Timeout, 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN UINTN Row, 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN UINTN Column, 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN CHAR16 *String, 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IN EFI_INPUT_KEY TimeoutKey, 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman OUT EFI_INPUT_KEY *Key 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ) 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_STATUS Status; 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman do { 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman PrintAt (Column, Row, String, Timeout); 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Status = WaitForSingleEvent (Event, 10000000); 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (Status == EFI_SUCCESS) { 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!EFI_ERROR(uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, Key))) { 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } while (Timeout > 0); 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *Key = TimeoutKey; 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 154