150 lines
3 KiB
C
150 lines
3 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Intel Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
event.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
Revision History
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "lib.h"
|
||
|
|
||
|
|
||
|
EFI_EVENT
|
||
|
LibCreateProtocolNotifyEvent (
|
||
|
IN EFI_GUID *ProtocolGuid,
|
||
|
IN EFI_TPL NotifyTpl,
|
||
|
IN EFI_EVENT_NOTIFY NotifyFunction,
|
||
|
IN VOID *NotifyContext,
|
||
|
OUT VOID *Registration
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
EFI_EVENT Event;
|
||
|
|
||
|
/*
|
||
|
* Create the event
|
||
|
*/
|
||
|
|
||
|
Status = BS->CreateEvent (
|
||
|
EVT_NOTIFY_SIGNAL,
|
||
|
NotifyTpl,
|
||
|
NotifyFunction,
|
||
|
NotifyContext,
|
||
|
&Event
|
||
|
);
|
||
|
ASSERT (!EFI_ERROR(Status));
|
||
|
|
||
|
/*
|
||
|
* Register for protocol notifactions on this event
|
||
|
*/
|
||
|
|
||
|
Status = BS->RegisterProtocolNotify (
|
||
|
ProtocolGuid,
|
||
|
Event,
|
||
|
Registration
|
||
|
);
|
||
|
|
||
|
ASSERT (!EFI_ERROR(Status));
|
||
|
|
||
|
/*
|
||
|
* Kick the event so we will perform an initial pass of
|
||
|
* current installed drivers
|
||
|
*/
|
||
|
|
||
|
BS->SignalEvent (Event);
|
||
|
return Event;
|
||
|
}
|
||
|
|
||
|
|
||
|
EFI_STATUS
|
||
|
WaitForSingleEvent (
|
||
|
IN EFI_EVENT Event,
|
||
|
IN UINT64 Timeout OPTIONAL
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
UINTN Index;
|
||
|
EFI_EVENT TimerEvent;
|
||
|
EFI_EVENT WaitList[2];
|
||
|
|
||
|
if (Timeout) {
|
||
|
/*
|
||
|
* Create a timer event
|
||
|
*/
|
||
|
|
||
|
Status = BS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);
|
||
|
if (!EFI_ERROR(Status)) {
|
||
|
|
||
|
/*
|
||
|
* Set the timer event
|
||
|
*/
|
||
|
|
||
|
BS->SetTimer (TimerEvent, TimerRelative, Timeout);
|
||
|
|
||
|
/*
|
||
|
* Wait for the original event or the timer
|
||
|
*/
|
||
|
|
||
|
WaitList[0] = Event;
|
||
|
WaitList[1] = TimerEvent;
|
||
|
Status = BS->WaitForEvent (2, WaitList, &Index);
|
||
|
BS->CloseEvent (TimerEvent);
|
||
|
|
||
|
/*
|
||
|
* If the timer expired, change the return to timed out
|
||
|
*/
|
||
|
|
||
|
if (!EFI_ERROR(Status) && Index == 1) {
|
||
|
Status = EFI_TIMEOUT;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
|
||
|
/*
|
||
|
* No timeout... just wait on the event
|
||
|
*/
|
||
|
|
||
|
Status = BS->WaitForEvent (1, &Event, &Index);
|
||
|
ASSERT (!EFI_ERROR(Status));
|
||
|
ASSERT (Index == 0);
|
||
|
}
|
||
|
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
WaitForEventWithTimeout (
|
||
|
IN EFI_EVENT Event,
|
||
|
IN UINTN Timeout,
|
||
|
IN UINTN Row,
|
||
|
IN UINTN Column,
|
||
|
IN CHAR16 *String,
|
||
|
IN EFI_INPUT_KEY TimeoutKey,
|
||
|
OUT EFI_INPUT_KEY *Key
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
|
||
|
do {
|
||
|
PrintAt (Column, Row, String, Timeout);
|
||
|
Status = WaitForSingleEvent (Event, 10000000);
|
||
|
if (Status == EFI_SUCCESS) {
|
||
|
if (!EFI_ERROR(ST->ConIn->ReadKeyStroke (ST->ConIn, Key))) {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
} while (Timeout > 0);
|
||
|
*Key = TimeoutKey;
|
||
|
}
|
||
|
|