aboutsummaryrefslogtreecommitdiff
path: root/gnu-efi/gnu-efi-3.0/lib/event.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu-efi/gnu-efi-3.0/lib/event.c')
-rw-r--r--gnu-efi/gnu-efi-3.0/lib/event.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/gnu-efi/gnu-efi-3.0/lib/event.c b/gnu-efi/gnu-efi-3.0/lib/event.c
new file mode 100644
index 0000000..6c16c62
--- /dev/null
+++ b/gnu-efi/gnu-efi-3.0/lib/event.c
@@ -0,0 +1,153 @@
+/*++
+
+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 = uefi_call_wrapper(
+ BS->CreateEvent,
+ 5,
+ EVT_NOTIFY_SIGNAL,
+ NotifyTpl,
+ NotifyFunction,
+ NotifyContext,
+ &Event
+ );
+ ASSERT (!EFI_ERROR(Status));
+
+ //
+ // Register for protocol notifactions on this event
+ //
+
+ Status = uefi_call_wrapper(
+ BS->RegisterProtocolNotify,
+ 3,
+ ProtocolGuid,
+ Event,
+ Registration
+ );
+
+ ASSERT (!EFI_ERROR(Status));
+
+ //
+ // Kick the event so we will perform an initial pass of
+ // current installed drivers
+ //
+
+ uefi_call_wrapper(BS->SignalEvent, 1, 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 = uefi_call_wrapper(BS->CreateEvent, 5, EVT_TIMER, 0, NULL, NULL, &TimerEvent);
+ if (!EFI_ERROR(Status)) {
+
+ //
+ // Set the timer event
+ //
+
+ uefi_call_wrapper(BS->SetTimer, 3, TimerEvent, TimerRelative, Timeout);
+
+ //
+ // Wait for the original event or the timer
+ //
+
+ WaitList[0] = Event;
+ WaitList[1] = TimerEvent;
+ Status = uefi_call_wrapper(BS->WaitForEvent, 3, 2, WaitList, &Index);
+ uefi_call_wrapper(BS->CloseEvent, 1, 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 = uefi_call_wrapper(BS->WaitForEvent, 3, 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(uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, Key))) {
+ return;
+ }
+ }
+ } while (Timeout > 0);
+ *Key = TimeoutKey;
+}
+