event.c revision 1.1 1 1.1 jakllsch /* $NetBSD: event.c,v 1.1 2014/04/01 16:16:06 jakllsch 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.1 jakllsch EFI_STATUS Status;
33 1.1 jakllsch EFI_EVENT Event;
34 1.1 jakllsch
35 1.1 jakllsch //
36 1.1 jakllsch // Create the event
37 1.1 jakllsch //
38 1.1 jakllsch
39 1.1 jakllsch Status = uefi_call_wrapper(
40 1.1 jakllsch BS->CreateEvent,
41 1.1 jakllsch 5,
42 1.1 jakllsch EVT_NOTIFY_SIGNAL,
43 1.1 jakllsch NotifyTpl,
44 1.1 jakllsch NotifyFunction,
45 1.1 jakllsch NotifyContext,
46 1.1 jakllsch &Event
47 1.1 jakllsch );
48 1.1 jakllsch ASSERT (!EFI_ERROR(Status));
49 1.1 jakllsch
50 1.1 jakllsch //
51 1.1 jakllsch // Register for protocol notifactions on this event
52 1.1 jakllsch //
53 1.1 jakllsch
54 1.1 jakllsch Status = uefi_call_wrapper(
55 1.1 jakllsch BS->RegisterProtocolNotify,
56 1.1 jakllsch 3,
57 1.1 jakllsch ProtocolGuid,
58 1.1 jakllsch Event,
59 1.1 jakllsch Registration
60 1.1 jakllsch );
61 1.1 jakllsch
62 1.1 jakllsch ASSERT (!EFI_ERROR(Status));
63 1.1 jakllsch
64 1.1 jakllsch //
65 1.1 jakllsch // Kick the event so we will perform an initial pass of
66 1.1 jakllsch // current installed drivers
67 1.1 jakllsch //
68 1.1 jakllsch
69 1.1 jakllsch uefi_call_wrapper(BS->SignalEvent, 1, Event);
70 1.1 jakllsch return Event;
71 1.1 jakllsch }
72 1.1 jakllsch
73 1.1 jakllsch
74 1.1 jakllsch EFI_STATUS
75 1.1 jakllsch WaitForSingleEvent (
76 1.1 jakllsch IN EFI_EVENT Event,
77 1.1 jakllsch IN UINT64 Timeout OPTIONAL
78 1.1 jakllsch )
79 1.1 jakllsch {
80 1.1 jakllsch EFI_STATUS Status;
81 1.1 jakllsch UINTN Index;
82 1.1 jakllsch EFI_EVENT TimerEvent;
83 1.1 jakllsch EFI_EVENT WaitList[2];
84 1.1 jakllsch
85 1.1 jakllsch if (Timeout) {
86 1.1 jakllsch //
87 1.1 jakllsch // Create a timer event
88 1.1 jakllsch //
89 1.1 jakllsch
90 1.1 jakllsch Status = uefi_call_wrapper(BS->CreateEvent, 5, EVT_TIMER, 0, NULL, NULL, &TimerEvent);
91 1.1 jakllsch if (!EFI_ERROR(Status)) {
92 1.1 jakllsch
93 1.1 jakllsch //
94 1.1 jakllsch // Set the timer event
95 1.1 jakllsch //
96 1.1 jakllsch
97 1.1 jakllsch uefi_call_wrapper(BS->SetTimer, 3, TimerEvent, TimerRelative, Timeout);
98 1.1 jakllsch
99 1.1 jakllsch //
100 1.1 jakllsch // Wait for the original event or the timer
101 1.1 jakllsch //
102 1.1 jakllsch
103 1.1 jakllsch WaitList[0] = Event;
104 1.1 jakllsch WaitList[1] = TimerEvent;
105 1.1 jakllsch Status = uefi_call_wrapper(BS->WaitForEvent, 3, 2, WaitList, &Index);
106 1.1 jakllsch uefi_call_wrapper(BS->CloseEvent, 1, TimerEvent);
107 1.1 jakllsch
108 1.1 jakllsch //
109 1.1 jakllsch // If the timer expired, change the return to timed out
110 1.1 jakllsch //
111 1.1 jakllsch
112 1.1 jakllsch if (!EFI_ERROR(Status) && Index == 1) {
113 1.1 jakllsch Status = EFI_TIMEOUT;
114 1.1 jakllsch }
115 1.1 jakllsch }
116 1.1 jakllsch
117 1.1 jakllsch } else {
118 1.1 jakllsch
119 1.1 jakllsch //
120 1.1 jakllsch // No timeout... just wait on the event
121 1.1 jakllsch //
122 1.1 jakllsch
123 1.1 jakllsch Status = uefi_call_wrapper(BS->WaitForEvent, 3, 1, &Event, &Index);
124 1.1 jakllsch ASSERT (!EFI_ERROR(Status));
125 1.1 jakllsch ASSERT (Index == 0);
126 1.1 jakllsch }
127 1.1 jakllsch
128 1.1 jakllsch return Status;
129 1.1 jakllsch }
130 1.1 jakllsch
131 1.1 jakllsch VOID
132 1.1 jakllsch WaitForEventWithTimeout (
133 1.1 jakllsch IN EFI_EVENT Event,
134 1.1 jakllsch IN UINTN Timeout,
135 1.1 jakllsch IN UINTN Row,
136 1.1 jakllsch IN UINTN Column,
137 1.1 jakllsch IN CHAR16 *String,
138 1.1 jakllsch IN EFI_INPUT_KEY TimeoutKey,
139 1.1 jakllsch OUT EFI_INPUT_KEY *Key
140 1.1 jakllsch )
141 1.1 jakllsch {
142 1.1 jakllsch EFI_STATUS Status;
143 1.1 jakllsch
144 1.1 jakllsch do {
145 1.1 jakllsch PrintAt (Column, Row, String, Timeout);
146 1.1 jakllsch Status = WaitForSingleEvent (Event, 10000000);
147 1.1 jakllsch if (Status == EFI_SUCCESS) {
148 1.1 jakllsch if (!EFI_ERROR(uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, Key))) {
149 1.1 jakllsch return;
150 1.1 jakllsch }
151 1.1 jakllsch }
152 1.1 jakllsch } while (Timeout > 0);
153 1.1 jakllsch *Key = TimeoutKey;
154 1.1 jakllsch }
155 1.1 jakllsch
156