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