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