d901c3892630f2500eda9822c712aae278017907
[grub.git] / grub-core / commands / efi / lsefi.c
1 /*
2  *  GRUB  --  GRand Unified Bootloader
3  *  Copyright (C) 2012  Free Software Foundation, Inc.
4  *
5  *  GRUB is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  GRUB is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 #include <grub/types.h>
19 #include <grub/mm.h>
20 #include <grub/misc.h>
21 #include <grub/efi/api.h>
22 #include <grub/efi/edid.h>
23 #include <grub/efi/pci.h>
24 #include <grub/efi/efi.h>
25 #include <grub/efi/uga_draw.h>
26 #include <grub/efi/graphics_output.h>
27 #include <grub/efi/console_control.h>
28 #include <grub/command.h>
29
30 GRUB_MOD_LICENSE ("GPLv3+");
31
32 struct known_protocol
33 {
34   grub_efi_guid_t guid;
35   const char *name;
36 } known_protocols[] = 
37   {
38     { GRUB_EFI_DISK_IO_GUID, "disk" },
39     { GRUB_EFI_BLOCK_IO_GUID, "block" },
40     { GRUB_EFI_SERIAL_IO_GUID, "serial" },
41     { GRUB_EFI_SIMPLE_NETWORK_GUID, "network" },
42     { GRUB_EFI_PXE_GUID, "pxe" },
43     { GRUB_EFI_DEVICE_PATH_GUID, "device path" },
44     { GRUB_EFI_PCI_IO_GUID, "PCI" },
45     { GRUB_EFI_PCI_ROOT_IO_GUID, "PCI root" },
46     { GRUB_EFI_EDID_ACTIVE_GUID, "active EDID" },
47     { GRUB_EFI_EDID_DISCOVERED_GUID, "discovered EDID" },
48     { GRUB_EFI_EDID_OVERRIDE_GUID, "override EDID" },
49     { GRUB_EFI_GOP_GUID, "GOP" },
50     { GRUB_EFI_UGA_DRAW_GUID, "UGA draw" },
51     { GRUB_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID, "simple text output" },
52     { GRUB_EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID, "simple text input" },
53     { GRUB_EFI_SIMPLE_POINTER_PROTOCOL_GUID, "simple pointer" },
54     { GRUB_EFI_CONSOLE_CONTROL_GUID, "console control" },
55     { GRUB_EFI_ABSOLUTE_POINTER_PROTOCOL_GUID, "absolute pointer" },
56     { GRUB_EFI_DRIVER_BINDING_PROTOCOL_GUID, "EFI driver binding" },
57     { GRUB_EFI_LOAD_FILE_PROTOCOL_GUID, "load file" },
58     { GRUB_EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID, "simple FS" },
59     { GRUB_EFI_TAPE_IO_PROTOCOL_GUID, "tape I/O" },
60     { GRUB_EFI_UNICODE_COLLATION_PROTOCOL_GUID, "unicode collation" },
61     { GRUB_EFI_SCSI_IO_PROTOCOL_GUID, "SCSI I/O" },
62     { GRUB_EFI_USB2_HC_PROTOCOL_GUID, "USB host" },
63     { GRUB_EFI_DEBUG_SUPPORT_PROTOCOL_GUID, "debug support" },
64     { GRUB_EFI_DEBUGPORT_PROTOCOL_GUID, "debug port" },
65     { GRUB_EFI_DECOMPRESS_PROTOCOL_GUID, "decompress" },
66     { GRUB_EFI_LOADED_IMAGE_PROTOCOL_GUID, "loaded image" },
67     { GRUB_EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID, "device path to text" },
68     { GRUB_EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID, "device path utilities" },
69     { GRUB_EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL_GUID, "device path from text" },
70     { GRUB_EFI_HII_CONFIG_ROUTING_PROTOCOL_GUID, "HII config routing" },
71     { GRUB_EFI_HII_DATABASE_PROTOCOL_GUID, "HII database" },
72     { GRUB_EFI_HII_STRING_PROTOCOL_GUID, "HII string" },
73     { GRUB_EFI_HII_IMAGE_PROTOCOL_GUID, "HII image" },
74     { GRUB_EFI_HII_FONT_PROTOCOL_GUID, "HII font" },
75     { GRUB_EFI_COMPONENT_NAME2_PROTOCOL_GUID, "component name 2" },
76     { GRUB_EFI_HII_CONFIGURATION_ACCESS_PROTOCOL_GUID,
77       "HII configuration access" },
78     { GRUB_EFI_USB_IO_PROTOCOL_GUID, "USB I/O" },
79   };
80
81 static grub_err_t
82 grub_cmd_lsefi (grub_command_t cmd __attribute__ ((unused)),
83                 int argc __attribute__ ((unused)),
84                 char **args __attribute__ ((unused)))
85 {
86   grub_efi_handle_t *handles;
87   grub_efi_uintn_t num_handles;
88   unsigned i, j, k;
89
90   handles = grub_efi_locate_handle (GRUB_EFI_ALL_HANDLES,
91                                     NULL, NULL, &num_handles);
92
93   for (i = 0; i < num_handles; i++)
94     {
95       grub_efi_handle_t handle = handles[i];
96       grub_efi_status_t status;
97       grub_efi_uintn_t num_protocols;
98       grub_efi_packed_guid_t **protocols;
99       grub_efi_device_path_t *dp;
100
101       grub_printf ("Handle %p\n", handle);
102
103       dp = grub_efi_get_device_path (handle);
104       if (dp)
105         {
106           grub_printf ("  ");
107           grub_efi_print_device_path (dp);
108         }
109
110       status = efi_call_3 (grub_efi_system_table->boot_services->protocols_per_handle,
111                            handle, &protocols, &num_protocols);
112       if (status != GRUB_EFI_SUCCESS)
113         grub_printf ("Unable to retrieve protocols\n");
114       for (j = 0; j < num_protocols; j++)
115         {
116           for (k = 0; k < ARRAY_SIZE (known_protocols); k++)
117             if (grub_memcmp (protocols[j], &known_protocols[k].guid,
118                              sizeof (known_protocols[k].guid)) == 0)
119                 break;
120           if (k < ARRAY_SIZE (known_protocols))
121             grub_printf ("  %s\n", known_protocols[k].name);
122           else
123             grub_printf ("  %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
124                          protocols[j]->data1,
125                          protocols[j]->data2,
126                          protocols[j]->data3,
127                          (unsigned) protocols[j]->data4[0],
128                          (unsigned) protocols[j]->data4[1],
129                          (unsigned) protocols[j]->data4[2],
130                          (unsigned) protocols[j]->data4[3],
131                          (unsigned) protocols[j]->data4[4],
132                          (unsigned) protocols[j]->data4[5],
133                          (unsigned) protocols[j]->data4[6],
134                          (unsigned) protocols[j]->data4[7]);
135         }
136
137     }
138
139   return 0;
140 }
141
142 static grub_command_t cmd;
143
144 GRUB_MOD_INIT(lsefi)
145 {
146   cmd = grub_register_command ("lsefi", grub_cmd_lsefi,
147                                NULL, "Display EFI handles.");
148 }
149
150 GRUB_MOD_FINI(lsefi)
151 {
152   grub_unregister_command (cmd);
153 }