event.c revision 1.3 1 1.3 jmcneill /* $NetBSD: event.c,v 1.3 2018/08/16 18:22:05 jmcneill Exp $ */
2 1.1 jakllsch
3 1.1 jakllsch /*++
4 1.1 jakllsch
5 1.1 jakllsch Copyright (c) 1998 Intel Corporation
6 1.1 jakllsch
7 1.1 jakllsch Module Name:
8 1.1 jakllsch
9 1.1 jakllsch event.c
10 1.1 jakllsch
11 1.1 jakllsch Abstract:
12 1.1 jakllsch
13 1.1 jakllsch
14 1.1 jakllsch
15 1.1 jakllsch
16 1.1 jakllsch Revision History
17 1.1 jakllsch
18 1.1 jakllsch --*/
19 1.1 jakllsch
20 1.1 jakllsch #include "lib.h"
21 1.1 jakllsch
22 1.1 jakllsch
23 1.1 jakllsch EFI_EVENT
24 1.1 jakllsch LibCreateProtocolNotifyEvent (
25 1.1 jakllsch IN EFI_GUID *ProtocolGuid,
26 1.1 jakllsch IN EFI_TPL NotifyTpl,
27 1.1 jakllsch IN EFI_EVENT_NOTIFY NotifyFunction,
28 1.1 jakllsch IN VOID *NotifyContext,
29 1.1 jakllsch OUT VOID *Registration
30 1.1 jakllsch )
31 1.1 jakllsch {
32 1.2 mlelstv #ifdef EFI_DEBUG
33 1.1 jakllsch EFI_STATUS Status;
34 1.2 mlelstv #else
35 1.2 mlelstv EFI_STATUS Status __unused;
36 1.2 mlelstv #endif
37 1.1 jakllsch EFI_EVENT Event;
38 1.1 jakllsch
39 1.1 jakllsch //
40 1.1 jakllsch // Create the event
41 1.1 jakllsch //
42 1.1 jakllsch
43 1.1 jakllsch Status = uefi_call_wrapper(
44 1.1 jakllsch BS->CreateEvent,
45 1.1 jakllsch 5,
46 1.1 jakllsch EVT_NOTIFY_SIGNAL,
47 1.1 jakllsch NotifyTpl,
48 1.1 jakllsch NotifyFunction,
49 1.1 jakllsch NotifyContext,
50 1.1 jakllsch &Event
51 1.1 jakllsch );
52 1.3 jmcneill if ( EFI_ERROR( Status ) ) return NULL ;
53 1.1 jakllsch ASSERT (!EFI_ERROR(Status));
54 1.1 jakllsch
55 1.1 jakllsch //
56 1.1 jakllsch // Register for protocol notifactions on this event
57 1.1 jakllsch //
58 1.1 jakllsch
59 1.1 jakllsch Status = uefi_call_wrapper(
60 1.1 jakllsch BS->RegisterProtocolNotify,
61 1.1 jakllsch 3,
62 1.3 jmcneill ProtocolGuid,
63 1.3 jmcneill Event,
64 1.1 jakllsch Registration
65 1.1 jakllsch );
66 1.3 jmcneill if ( EFI_ERROR( Status ) ) return NULL ;
67 1.1 jakllsch ASSERT (!EFI_ERROR(Status));
68 1.1 jakllsch
69 1.1 jakllsch //
70 1.1 jakllsch // Kick the event so we will perform an initial pass of
71 1.1 jakllsch // current installed drivers
72 1.1 jakllsch //
73 1.1 jakllsch
74 1.1 jakllsch uefi_call_wrapper(BS->SignalEvent, 1, Event);
75 1.1 jakllsch return Event;
76 1.1 jakllsch }
77 1.1 jakllsch
78 1.1 jakllsch
79 1.1 jakllsch EFI_STATUS
80 1.1 jakllsch WaitForSingleEvent (
81 1.1 jakllsch IN EFI_EVENT Event,
82 1.1 jakllsch IN UINT64 Timeout OPTIONAL
83 1.1 jakllsch )
84 1.1 jakllsch {
85 1.1 jakllsch EFI_STATUS Status;
86 1.1 jakllsch UINTN Index;
87 1.1 jakllsch EFI_EVENT TimerEvent;
88 1.1 jakllsch EFI_EVENT WaitList[2];
89 1.1 jakllsch
90 1.1 jakllsch if (Timeout) {
91 1.1 jakllsch //
92 1.1 jakllsch // Create a timer event
93 1.1 jakllsch //
94 1.1 jakllsch
95 1.1 jakllsch Status = uefi_call_wrapper(BS->CreateEvent, 5, EVT_TIMER, 0, NULL, NULL, &TimerEvent);
96 1.1 jakllsch if (!EFI_ERROR(Status)) {
97 1.1 jakllsch
98 1.1 jakllsch //
99 1.1 jakllsch // Set the timer event
100 1.1 jakllsch //
101 1.1 jakllsch
102 1.1 jakllsch uefi_call_wrapper(BS->SetTimer, 3, TimerEvent, TimerRelative, Timeout);
103 1.3 jmcneill
104 1.1 jakllsch //
105 1.1 jakllsch // Wait for the original event or the timer
106 1.1 jakllsch //
107 1.1 jakllsch
108 1.1 jakllsch WaitList[0] = Event;
109 1.1 jakllsch WaitList[1] = TimerEvent;
110 1.1 jakllsch Status = uefi_call_wrapper(BS->WaitForEvent, 3, 2, WaitList, &Index);
111 1.1 jakllsch uefi_call_wrapper(BS->CloseEvent, 1, TimerEvent);
112 1.1 jakllsch
113 1.1 jakllsch //
114 1.1 jakllsch // If the timer expired, change the return to timed out
115 1.1 jakllsch //
116 1.1 jakllsch
117 1.1 jakllsch if (!EFI_ERROR(Status) && Index == 1) {
118 1.1 jakllsch Status = EFI_TIMEOUT;
119 1.1 jakllsch }
120 1.1 jakllsch }
121 1.1 jakllsch
122 1.1 jakllsch } else {
123 1.1 jakllsch
124 1.1 jakllsch //
125 1.1 jakllsch // No timeout... just wait on the event
126 1.1 jakllsch //
127 1.1 jakllsch
128 1.1 jakllsch Status = uefi_call_wrapper(BS->WaitForEvent, 3, 1, &Event, &Index);
129 1.1 jakllsch ASSERT (!EFI_ERROR(Status));
130 1.1 jakllsch ASSERT (Index == 0);
131 1.1 jakllsch }
132 1.1 jakllsch
133 1.1 jakllsch return Status;
134 1.1 jakllsch }
135 1.1 jakllsch
136 1.1 jakllsch VOID
137 1.1 jakllsch WaitForEventWithTimeout (
138 1.1 jakllsch IN EFI_EVENT Event,
139 1.1 jakllsch IN UINTN Timeout,
140 1.1 jakllsch IN UINTN Row,
141 1.1 jakllsch IN UINTN Column,
142 1.1 jakllsch IN CHAR16 *String,
143 1.1 jakllsch IN EFI_INPUT_KEY TimeoutKey,
144 1.1 jakllsch OUT EFI_INPUT_KEY *Key
145 1.1 jakllsch )
146 1.1 jakllsch {
147 1.1 jakllsch EFI_STATUS Status;
148 1.1 jakllsch
149 1.1 jakllsch do {
150 1.1 jakllsch PrintAt (Column, Row, String, Timeout);
151 1.1 jakllsch Status = WaitForSingleEvent (Event, 10000000);
152 1.1 jakllsch if (Status == EFI_SUCCESS) {
153 1.1 jakllsch if (!EFI_ERROR(uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, Key))) {
154 1.1 jakllsch return;
155 1.1 jakllsch }
156 1.1 jakllsch }
157 1.1 jakllsch } while (Timeout > 0);
158 1.3 jmcneill CopyMem(Key, &TimeoutKey, sizeof(EFI_INPUT_KEY));
159 1.1 jakllsch }
160 1.1 jakllsch
161