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