OpenCore  1.0.6
OpenCore Bootloader
Loading...
Searching...
No Matches
TestEvent.c
Go to the documentation of this file.
1
6#include <Uefi.h>
7#include <Library/UefiBootServicesTableLib.h>
8#include <Library/DebugLib.h>
9#include <Library/UefiLib.h>
10#include <stdio.h>
11#include <unistd.h>
12
16typedef struct {
17 EFI_EVENT LinkedEvent;
18 UINTN Counter;
20
24STATIC
25VOID
27 IN EFI_EVENT Event,
28 IN VOID *Context
29 )
30{
31 NOTIFY_CONTEXT1 *Ctx;
32
33 DEBUG ((DEBUG_INFO, "SignalNotify1()\n"));
34 Ctx = (NOTIFY_CONTEXT1 *)Context;
35 ++(Ctx->Counter);
36}
37
41STATIC
42VOID
44 IN EFI_EVENT Event,
45 IN VOID *Context
46 )
47{
48 NOTIFY_CONTEXT1 *Ctx;
49
50 DEBUG ((DEBUG_INFO, "@@@@ SelfDestroyNotify1()\n"));
51 Ctx = (NOTIFY_CONTEXT1 *)Context;
52 ++(Ctx->Counter);
53 gBS->CloseEvent (Event);
54}
55
59STATIC
60VOID
62 IN EFI_EVENT Event,
63 IN VOID *Context
64 )
65{
66 NOTIFY_CONTEXT1 *Ctx;
67
68 Ctx = (NOTIFY_CONTEXT1 *)Context;
69 gBS->SignalEvent (Ctx->LinkedEvent);
70 ++(Ctx->Counter);
71}
72
76STATIC
77VOID
79 IN EFI_EVENT Event,
80 IN VOID *Context
81 )
82{
83 NOTIFY_CONTEXT1 *Ctx;
84
85 Ctx = (NOTIFY_CONTEXT1 *)Context;
86 ++(Ctx->Counter);
87}
88
92STATIC
93VOID
95 IN EFI_EVENT Event,
96 IN VOID *Context
97 )
98{
99 NOTIFY_CONTEXT1 *Ctx;
100
101 Ctx = (NOTIFY_CONTEXT1 *)Context;
102 gBS->SignalEvent (Ctx->LinkedEvent);
103 ++(Ctx->Counter);
104}
105
106int
108 VOID
109 )
110{
111 EFI_STATUS Status;
112 NOTIFY_CONTEXT1 SignalNotifyContext1 = { 0, };
113 NOTIFY_CONTEXT1 SignalNotifyContext2 = { 0, };
114 NOTIFY_CONTEXT1 SignalNotifyContext3 = { 0, };
115 NOTIFY_CONTEXT1 WaitNotifyContext1 = { 0, };
116 NOTIFY_CONTEXT1 SelfDestroyContext1 = { 0, };
117 EFI_EVENT Signal1;
118 EFI_EVENT Signal2;
119 EFI_EVENT Signal3;
120 EFI_EVENT Wait1;
121 EFI_EVENT Timer1;
122 EFI_EVENT SelfD1;
123 UINTN TimerCounter1 = 0;
124 UINTN Index;
125 INTN Jndex;
126 EFI_TPL OriginalTPL;
127 //
128 // Array for waiting events
129 //
130 EFI_EVENT Events[2];
131
132 DEBUG ((DEBUG_INFO, "=== Test UEFI Event System ===\n"));
133
134 //
135 // Create events
136 //
137 Status = gBS->CreateEvent (
138 EVT_NOTIFY_SIGNAL,
139 TPL_CALLBACK,
141 (VOID *)&SignalNotifyContext1,
142 &Signal1
143 );
144
145 if (EFI_ERROR (Status) || (Signal1 == NULL)) {
146 DEBUG ((DEBUG_INFO, "FAIL: Signal1 event creation (Status: %r)\n", Status));
147 } else {
148 DEBUG ((DEBUG_INFO, "PASS: Signal1 event created\n"));
149 }
150
151 Status = gBS->CreateEvent (
152 EVT_NOTIFY_SIGNAL,
153 TPL_CALLBACK,
155 (VOID *)&SignalNotifyContext2,
156 &Signal2
157 );
158
159 if (EFI_ERROR (Status) || (Signal2 == NULL)) {
160 DEBUG ((DEBUG_INFO, "FAIL: Signal2 event creation (Status: %r)\n", Status));
161 } else {
162 DEBUG ((DEBUG_INFO, "PASS: Signal2 event created\n"));
163 }
164
165 Status = gBS->CreateEvent (
166 EVT_NOTIFY_SIGNAL,
167 TPL_CALLBACK,
169 (VOID *)&SignalNotifyContext3,
170 &Signal3
171 );
172
173 if (EFI_ERROR (Status) || (Signal3 == NULL)) {
174 DEBUG ((DEBUG_INFO, "FAIL: Signal3 event creation (Status: %r)\n", Status));
175 } else {
176 DEBUG ((DEBUG_INFO, "PASS: Signal3 event created\n"));
177 }
178
179 Status = gBS->CreateEvent (
180 EVT_TIMER | EVT_NOTIFY_WAIT,
181 TPL_CALLBACK,
183 (VOID *)&WaitNotifyContext1,
184 &Wait1
185 );
186
187 if (EFI_ERROR (Status) || (Wait1 == NULL)) {
188 DEBUG ((DEBUG_INFO, "FAIL: Wait1 event creation (Status: %r)\n", Status));
189 } else {
190 DEBUG ((DEBUG_INFO, "PASS: Wait1 event created\n"));
191 }
192
193 Status = gBS->CreateEvent (
194 EVT_TIMER,
195 TPL_CALLBACK,
196 NULL,
197 NULL,
198 &Timer1
199 );
200
201 if (EFI_ERROR (Status) || (Timer1 == NULL)) {
202 DEBUG ((DEBUG_INFO, "FAIL: Timer1 event creation (Status: %r)\n", Status));
203 } else {
204 DEBUG ((DEBUG_INFO, "PASS: Timer1 event created\n"));
205 }
206
207 Status = gBS->CreateEvent (
208 EVT_TIMER | EVT_NOTIFY_SIGNAL,
209 TPL_CALLBACK,
211 (VOID *)&SelfDestroyContext1,
212 &SelfD1
213 );
214
215 if (EFI_ERROR (Status) || (SelfD1 == NULL)) {
216 DEBUG ((DEBUG_INFO, "FAIL: SelfD1 event creation (Status: %r)\n", Status));
217 } else {
218 DEBUG ((DEBUG_INFO, "PASS: SelfD event created\n"));
219 }
220
221 //
222 // Link events
223 // Signal2 --> Signal3
224 // Wait1 --> Signal2
225 //
226 SignalNotifyContext2.LinkedEvent = Signal3;
227 WaitNotifyContext1.LinkedEvent = Signal2;
228
229 //
230 // Try to set timers
231 //
232 Status = gBS->SetTimer (Wait1, TimerPeriodic, 100*10000);
233
234 if (EFI_ERROR (Status)) {
235 DEBUG ((DEBUG_INFO, "FAIL: Set timer for Wait1 (Status: %r)\n", Status));
236 } else {
237 DEBUG ((DEBUG_INFO, "PASS: Wait1 set to 100*10000 periodic\n"));
238 }
239
240 Status = gBS->SetTimer (Timer1, TimerPeriodic, 10*10000);
241
242 if (EFI_ERROR (Status)) {
243 DEBUG ((DEBUG_INFO, "FAIL: Set timer for Timer1 (Status: %r)\n", Status));
244 } else {
245 DEBUG ((DEBUG_INFO, "PASS: Timer1 set to 10*10000 periodic\n"));
246 }
247
248 Status = gBS->SetTimer (SelfD1, TimerRelative, 30*10000);
249
250 if (EFI_ERROR (Status)) {
251 DEBUG ((DEBUG_INFO, "FAIL: Set timer for SelfD1 (Status: %r)\n", Status));
252 } else {
253 DEBUG ((DEBUG_INFO, "PASS: SelfD1 set to 30*10000 relative\n"));
254 }
255
256 //
257 // Try to emit Signal1
258 //
259 gBS->SignalEvent (Signal1);
260
261 //
262 // Try to wait events
263 //
264 Events[0] = Timer1;
265 Events[1] = Wait1;
266
267 for (Jndex = 0; Jndex < 10; Jndex++) {
268 Status = gBS->WaitForEvent (2, Events, &Index);
269 if (!EFI_ERROR (Status)) {
270 DEBUG ((DEBUG_INFO, "Event %u triggered\n", Index));
271 if (Index == 0) {
272 DEBUG ((DEBUG_INFO, "PASS: Timer1 event wait succeeded\n"));
273 TimerCounter1++;
274 }
275 } else {
276 DEBUG ((DEBUG_INFO, "Event Error %u (Status: %r)\n", Index, Status));
277 }
278 }
279
280 //
281 // Try to check event
282 //
283 Status = gBS->CheckEvent (Signal1);
284 if (Status == EFI_SUCCESS) {
285 DEBUG ((DEBUG_INFO, "FAIL: Event check succeeded\n"));
286 } else {
287 DEBUG ((DEBUG_INFO, "PASS: Event check error (Status: %r)\n", Status));
288 }
289
290 //
291 // The TPL test
292 //
293 OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);
294
295 DEBUG ((DEBUG_INFO, "TPL raised from %u to %d\n", OriginalTPL, TPL_HIGH_LEVEL));
296
297 gBS->SignalEvent (Signal1);
298 DEBUG ((DEBUG_INFO, "EVENT SIGANL1 NEED PRINTF AFTER THIS LINE:\n"));
299
300 gBS->RestoreTPL (OriginalTPL);
301 DEBUG ((DEBUG_INFO, "TPL restored to %u\n", OriginalTPL));
302
303 //
304 // Try to close event
305 //
306 gBS->CloseEvent (Signal1);
307 gBS->CloseEvent (Timer1);
308
309 //
310 // Try to signal a closed event. Need to trigger ASSERT()
311 //
312 // gBS->SignalEvent (Signal1);
313
314 DEBUG ((DEBUG_INFO, "\n=== Test Summary ===\n"));
315 DEBUG ((DEBUG_INFO, "Signal1 callbacks: %u\n", SignalNotifyContext1.Counter));
316 DEBUG ((DEBUG_INFO, "Signal2 callbacks: %u\n", SignalNotifyContext2.Counter));
317 DEBUG ((DEBUG_INFO, "Signal3 callbacks: %u\n", SignalNotifyContext3.Counter));
318 DEBUG ((DEBUG_INFO, "Wait1 callbacks: %u\n", WaitNotifyContext1.Counter));
319 DEBUG ((DEBUG_INFO, "SelfD1 callbacks: %u\n", SelfDestroyContext1.Counter));
320 DEBUG ((DEBUG_INFO, "Timer1 callbacks: %u\n", TimerCounter1));
321
322 gBS->CloseEvent (Signal2);
323 gBS->CloseEvent (Signal3);
324 gBS->CloseEvent (Wait1);
325}
EFI_BOOT_SERVICES * gBS
STATIC VOID SelfDestroyNotify1(IN EFI_EVENT Event, IN VOID *Context)
Definition TestEvent.c:43
STATIC VOID SignalNotify1(IN EFI_EVENT Event, IN VOID *Context)
Definition TestEvent.c:26
STATIC VOID SignalNotify3(IN EFI_EVENT Event, IN VOID *Context)
Definition TestEvent.c:78
STATIC VOID SignalNotify2(IN EFI_EVENT Event, IN VOID *Context)
Definition TestEvent.c:61
STATIC VOID WaitNotify1(IN EFI_EVENT Event, IN VOID *Context)
Definition TestEvent.c:94
int ENTRY_POINT(void)
EFI_EVENT LinkedEvent
Definition TestEvent.c:17