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