• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 David Decotigny <decot@googlers.com>
3  *
4  * See drv0.c for an example session.
5  */
6 
7 #include <efi.h>
8 #include <efilib.h>
9 #include "drv0.h"
10 
11 
12 static EFI_GUID GnuEfiAppsDrv0ProtocolGuid
13   = GNU_EFI_APPS_DRV0_PROTOCOL_GUID;
14 
15 
16 static
17 EFI_STATUS
PlayWithGnuEfiAppsDrv0Protocol(IN EFI_HANDLE DrvHandle)18 PlayWithGnuEfiAppsDrv0Protocol(IN EFI_HANDLE DrvHandle) {
19   EFI_STATUS Status;
20   GNU_EFI_APPS_DRV0_PROTOCOL *drv = NULL;
21   UINTN NumberOfHello = 0;
22 
23   Status = uefi_call_wrapper(BS->OpenProtocol, 6,
24                              DrvHandle,
25                              &GnuEfiAppsDrv0ProtocolGuid,
26                              &drv,
27                              DrvHandle,
28                              NULL,
29                              EFI_OPEN_PROTOCOL_GET_PROTOCOL);
30   if (EFI_ERROR(Status)) {
31     Print(L"Cannot open proto: %d\n", Status);
32     return Status;
33   }
34 
35   Status = uefi_call_wrapper(drv->SayHello, 2, drv, L"Sample UEFI Driver");
36   if (EFI_ERROR(Status)) {
37     Print(L"Cannot call SayHello: %d\n", Status);
38   }
39 
40   Status = uefi_call_wrapper(drv->GetNumberOfHello, 2, drv, &NumberOfHello);
41   if (EFI_ERROR(Status)) {
42     Print(L"Cannot call GetNumberOfHello: %d\n", Status);
43   } else {
44     Print(L"Hello was called %d time(s).\n", NumberOfHello);
45   }
46 
47   return EFI_SUCCESS;
48 }
49 
50 
51 EFI_STATUS
efi_main(EFI_HANDLE Image,EFI_SYSTEM_TABLE * SysTab)52 efi_main (EFI_HANDLE Image, EFI_SYSTEM_TABLE *SysTab)
53 {
54   EFI_STATUS Status;
55   EFI_HANDLE *Handles = NULL;
56   UINTN i, NoHandles = 0;
57 
58   InitializeLib(Image, SysTab);
59 
60   Status = LibLocateHandle(ByProtocol, &GnuEfiAppsDrv0ProtocolGuid,
61                            NULL, &NoHandles, &Handles);
62   if (EFI_ERROR(Status)) {
63     Print(L"Error looking up handles for proto: %d\n", Status);
64     return Status;
65   }
66 
67   for (i = 0 ; i < NoHandles ; ++i)
68   {
69     Print(L"Playing with driver instance %d...\n", i);
70     Status = PlayWithGnuEfiAppsDrv0Protocol(Handles[i]);
71     if (EFI_ERROR(Status))
72       Print(L"Error playing with instance %d, skipping\n", i);
73   }
74 
75   if (Handles)
76     FreePool(Handles);
77 
78   return EFI_SUCCESS;
79 }
80