xref: /illumos-gate/usr/src/boot/efi/libefi/env.c (revision f334afcf)
1eee59048SToomas Soome /*
2eee59048SToomas Soome  * Copyright (c) 2015 Netflix, Inc. All Rights Reserved.
3eee59048SToomas Soome  *
4eee59048SToomas Soome  * Redistribution and use in source and binary forms, with or without
5eee59048SToomas Soome  * modification, are permitted provided that the following conditions
6eee59048SToomas Soome  * are met:
7eee59048SToomas Soome  * 1. Redistributions of source code must retain the above copyright
8eee59048SToomas Soome  *    notice, this list of conditions and the following disclaimer.
9eee59048SToomas Soome  * 2. Redistributions in binary form must reproduce the above copyright
10eee59048SToomas Soome  *    notice, this list of conditions and the following disclaimer in the
11eee59048SToomas Soome  *    documentation and/or other materials provided with the distribution.
12eee59048SToomas Soome  *
13eee59048SToomas Soome  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14eee59048SToomas Soome  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15eee59048SToomas Soome  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16eee59048SToomas Soome  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17eee59048SToomas Soome  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18eee59048SToomas Soome  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19eee59048SToomas Soome  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20eee59048SToomas Soome  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21eee59048SToomas Soome  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22eee59048SToomas Soome  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23eee59048SToomas Soome  * SUCH DAMAGE.
24eee59048SToomas Soome  */
25eee59048SToomas Soome 
26eee59048SToomas Soome #include <sys/cdefs.h>
27eee59048SToomas Soome 
28eee59048SToomas Soome #include <stand.h>
29eee59048SToomas Soome #include <string.h>
30eee59048SToomas Soome #include <efi.h>
318dff7262SToomas Soome #include <efichar.h>
32eee59048SToomas Soome #include <efilib.h>
33*f334afcfSToomas Soome #include <eficonsctl.h>
34*f334afcfSToomas Soome #include <Guid/Acpi.h>
35*f334afcfSToomas Soome #include <Guid/ConsoleInDevice.h>
36*f334afcfSToomas Soome #include <Guid/ConsoleOutDevice.h>
37*f334afcfSToomas Soome #include <Guid/DebugImageInfoTable.h>
38*f334afcfSToomas Soome #include <Guid/DxeServices.h>
39*f334afcfSToomas Soome #include <Guid/Fdt.h>
40*f334afcfSToomas Soome #include <Guid/GlobalVariable.h>
41*f334afcfSToomas Soome #include <Guid/Gpt.h>
42*f334afcfSToomas Soome #include <Guid/HobList.h>
43eee59048SToomas Soome #include <Guid/MemoryTypeInformation.h>
44*f334afcfSToomas Soome #include <Guid/Mps.h>
45eee59048SToomas Soome #include <Guid/MtcVendor.h>
46*f334afcfSToomas Soome #include <Guid/SmBios.h>
47*f334afcfSToomas Soome #include <Guid/StandardErrorDevice.h>
48eee59048SToomas Soome #include <Guid/ZeroGuid.h>
49*f334afcfSToomas Soome #include <Pi/PiStatusCode.h>
50*f334afcfSToomas Soome #include <Protocol/AbsolutePointer.h>
51*f334afcfSToomas Soome #include <Protocol/AdapterInformation.h>
52*f334afcfSToomas Soome #include <Protocol/Arp.h>
53*f334afcfSToomas Soome #include <Protocol/AtaPassThru.h>
54*f334afcfSToomas Soome #include <Protocol/Bds.h>
55*f334afcfSToomas Soome #include <Protocol/BlockIo.h>
56*f334afcfSToomas Soome #include <Protocol/BlockIo2.h>
57*f334afcfSToomas Soome #include <Protocol/BusSpecificDriverOverride.h>
58*f334afcfSToomas Soome #include <Protocol/Capsule.h>
59*f334afcfSToomas Soome #include <Protocol/ComponentName.h>
60*f334afcfSToomas Soome #include <Protocol/ComponentName2.h>
61*f334afcfSToomas Soome #include <Protocol/Cpu.h>
62*f334afcfSToomas Soome #include <Protocol/CpuIo2.h>
63*f334afcfSToomas Soome #include <Protocol/DataHub.h>
64*f334afcfSToomas Soome #include <Protocol/Decompress.h>
65*f334afcfSToomas Soome #include <Protocol/DeviceIo.h>
66*f334afcfSToomas Soome #include <Protocol/DevicePath.h>
67*f334afcfSToomas Soome #include <Protocol/DevicePathFromText.h>
68*f334afcfSToomas Soome #include <Protocol/DevicePathToText.h>
69*f334afcfSToomas Soome #include <Protocol/DevicePathUtilities.h>
70*f334afcfSToomas Soome #include <Protocol/Dhcp4.h>
71*f334afcfSToomas Soome #include <Protocol/Dhcp6.h>
72*f334afcfSToomas Soome #include <Protocol/DiskInfo.h>
73*f334afcfSToomas Soome #include <Protocol/DiskIo.h>
74*f334afcfSToomas Soome #include <Protocol/DiskIo2.h>
75*f334afcfSToomas Soome #include <Protocol/Dpc.h>
76*f334afcfSToomas Soome #include <Protocol/DriverBinding.h>
77*f334afcfSToomas Soome #include <Protocol/DriverConfiguration.h>
78*f334afcfSToomas Soome #include <Protocol/DriverConfiguration2.h>
79*f334afcfSToomas Soome #include <Protocol/DriverDiagnostics.h>
80*f334afcfSToomas Soome #include <Protocol/DriverDiagnostics2.h>
81*f334afcfSToomas Soome #include <Protocol/DriverFamilyOverride.h>
82*f334afcfSToomas Soome #include <Protocol/DriverHealth.h>
83*f334afcfSToomas Soome #include <Protocol/DriverSupportedEfiVersion.h>
84*f334afcfSToomas Soome #include <Protocol/Ebc.h>
85eee59048SToomas Soome #include <Protocol/EdidActive.h>
86eee59048SToomas Soome #include <Protocol/EdidDiscovered.h>
87*f334afcfSToomas Soome #include <Pi/PiFirmwareVolume.h>
88*f334afcfSToomas Soome #include <Protocol/FirmwareVolumeBlock.h>
89*f334afcfSToomas Soome #include <Uefi/UefiInternalFormRepresentation.h>
90*f334afcfSToomas Soome #include <Protocol/FormBrowser2.h>
91*f334afcfSToomas Soome #include <Protocol/GraphicsOutput.h>
92*f334afcfSToomas Soome #include <Protocol/HiiConfigAccess.h>
93*f334afcfSToomas Soome #include <Protocol/HiiConfigKeyword.h>
94*f334afcfSToomas Soome #include <Protocol/HiiConfigRouting.h>
95*f334afcfSToomas Soome #include <Protocol/HiiFont.h>
96*f334afcfSToomas Soome #include <Protocol/HiiImage.h>
97*f334afcfSToomas Soome #include <Protocol/HiiDatabase.h>
98*f334afcfSToomas Soome #include <Protocol/HiiString.h>
99*f334afcfSToomas Soome #include <Protocol/IdeControllerInit.h>
100*f334afcfSToomas Soome #include <Protocol/Ip4.h>
101*f334afcfSToomas Soome #include <Protocol/Ip4Config.h>
102*f334afcfSToomas Soome #include <Protocol/Ip4Config2.h>
103*f334afcfSToomas Soome #include <Protocol/Ip6.h>
104*f334afcfSToomas Soome #include <Protocol/Ip6Config.h>
105*f334afcfSToomas Soome #include <Protocol/IpSec.h>
106*f334afcfSToomas Soome #include <Protocol/IpSecConfig.h>
107*f334afcfSToomas Soome #include <Protocol/IsaAcpi.h>
108*f334afcfSToomas Soome #include <Protocol/IsaIo.h>
109*f334afcfSToomas Soome #include <Protocol/Kms.h>
110*f334afcfSToomas Soome #include <Protocol/Legacy8259.h>
111*f334afcfSToomas Soome #include <Protocol/LoadFile.h>
112*f334afcfSToomas Soome #include <Protocol/LoadFile2.h>
113*f334afcfSToomas Soome #include <Protocol/Metronome.h>
114*f334afcfSToomas Soome #include <Protocol/MonotonicCounter.h>
115*f334afcfSToomas Soome #include <Pi/PiMultiPhase.h>
116*f334afcfSToomas Soome #include <Protocol/MpService.h>
117*f334afcfSToomas Soome #include <Protocol/Mtftp4.h>
118*f334afcfSToomas Soome #include <Protocol/Mtftp6.h>
119*f334afcfSToomas Soome #include <Protocol/NetworkInterfaceIdentifier.h>
120*f334afcfSToomas Soome #include <Protocol/NvmExpressPassthru.h>
121*f334afcfSToomas Soome #include <Protocol/PciIo.h>
122*f334afcfSToomas Soome #include <Protocol/Pcd.h>
123*f334afcfSToomas Soome #include <Protocol/PciEnumerationComplete.h>
124*f334afcfSToomas Soome #include <Protocol/PciRootBridgeIo.h>
125*f334afcfSToomas Soome #include <Protocol/PiPcd.h>
126*f334afcfSToomas Soome #include <Protocol/PlatformDriverOverride.h>
127*f334afcfSToomas Soome #include <Protocol/PlatformToDriverConfiguration.h>
128*f334afcfSToomas Soome #include <Protocol/Print2.h>
129*f334afcfSToomas Soome #include <Protocol/PxeBaseCode.h>
130*f334afcfSToomas Soome #include <Protocol/PxeBaseCodeCallBack.h>
131*f334afcfSToomas Soome #include <Protocol/RealTimeClock.h>
132*f334afcfSToomas Soome #include <Protocol/ReportStatusCodeHandler.h>
133*f334afcfSToomas Soome #include <Protocol/Reset.h>
134*f334afcfSToomas Soome #include <Protocol/Rng.h>
135*f334afcfSToomas Soome #include <Protocol/Runtime.h>
136*f334afcfSToomas Soome #include <Protocol/ScsiIo.h>
137*f334afcfSToomas Soome #include <Protocol/ScsiPassThru.h>
138*f334afcfSToomas Soome #include <Protocol/ScsiPassThruExt.h>
139*f334afcfSToomas Soome #include <Protocol/Security.h>
140*f334afcfSToomas Soome #include <Protocol/Security2.h>
141*f334afcfSToomas Soome #include <Protocol/SecurityPolicy.h>
142*f334afcfSToomas Soome #include <Protocol/SerialIo.h>
143*f334afcfSToomas Soome #include <Protocol/SimpleFileSystem.h>
144*f334afcfSToomas Soome #include <Protocol/SimplePointer.h>
145*f334afcfSToomas Soome #include <Protocol/SimpleTextIn.h>
146*f334afcfSToomas Soome #include <Protocol/SimpleTextInEx.h>
147*f334afcfSToomas Soome #include <Protocol/SimpleTextOut.h>
148*f334afcfSToomas Soome #include <Protocol/SmartCardReader.h>
149*f334afcfSToomas Soome #include <Protocol/StatusCode.h>
150*f334afcfSToomas Soome #include <Protocol/StorageSecurityCommand.h>
151*f334afcfSToomas Soome #include <Protocol/Tcg2Protocol.h>
152*f334afcfSToomas Soome #include <Protocol/Tcp4.h>
153*f334afcfSToomas Soome #include <Protocol/Tcp6.h>
154*f334afcfSToomas Soome #include <Protocol/Timer.h>
155*f334afcfSToomas Soome #include <Protocol/Udp4.h>
156*f334afcfSToomas Soome #include <Protocol/Udp6.h>
157*f334afcfSToomas Soome #include <Protocol/UgaDraw.h>
158*f334afcfSToomas Soome #include <Protocol/UgaIo.h>
159*f334afcfSToomas Soome #include <Protocol/UnicodeCollation.h>
160*f334afcfSToomas Soome #include <Protocol/UsbIo.h>
161*f334afcfSToomas Soome #include <Protocol/Usb2HostController.h>
162*f334afcfSToomas Soome #include <Protocol/Variable.h>
163*f334afcfSToomas Soome #include <Protocol/VariableWrite.h>
164*f334afcfSToomas Soome #include <Protocol/VlanConfig.h>
165*f334afcfSToomas Soome #include <Protocol/WatchdogTimer.h>
166eee59048SToomas Soome #include <uuid.h>
167eee59048SToomas Soome #include <stdbool.h>
168eee59048SToomas Soome #include <sys/param.h>
169eee59048SToomas Soome #include "bootstrap.h"
170eee59048SToomas Soome #include "ficl.h"
171eee59048SToomas Soome 
1722b811402SToomas Soome /*
1732b811402SToomas Soome  * About ENABLE_UPDATES
1742b811402SToomas Soome  *
1752b811402SToomas Soome  * The UEFI variables are identified only by GUID and name, there is no
1762b811402SToomas Soome  * way to (auto)detect the type for the value, so we need to process the
1772b811402SToomas Soome  * variables case by case, as we do learn about them.
1782b811402SToomas Soome  *
1792b811402SToomas Soome  * While showing the variable name and the value is safe, we must not store
1802b811402SToomas Soome  * random values nor allow removing (random) variables.
1812b811402SToomas Soome  *
1822b811402SToomas Soome  * Since we do have stub code to set/unset the variables, I do want to keep
1832b811402SToomas Soome  * it to make the future development a bit easier, but the updates are disabled
1842b811402SToomas Soome  * by default till:
1852b811402SToomas Soome  *	a) the validation and data translation to values is properly implemented
1862b811402SToomas Soome  *	b) We have established which variables we do allow to be updated.
1872b811402SToomas Soome  * Therefore the set/unset code is included only for developers aid.
1882b811402SToomas Soome  */
1892b811402SToomas Soome 
190*f334afcfSToomas Soome /* If GUID is not defined elsewhere, define it here. */
191*f334afcfSToomas Soome EFI_GUID gEfiAbsolutePointerProtocolGuid = EFI_ABSOLUTE_POINTER_PROTOCOL_GUID;
192*f334afcfSToomas Soome EFI_GUID gEfiAdapterInformationProtocolGuid =
193*f334afcfSToomas Soome     EFI_ADAPTER_INFORMATION_PROTOCOL_GUID;
194*f334afcfSToomas Soome EFI_GUID gEfiAtaPassThruProtocolGuid = EFI_ATA_PASS_THRU_PROTOCOL_GUID;
195*f334afcfSToomas Soome EFI_GUID gEfiBdsArchProtocolGuid = EFI_BDS_ARCH_PROTOCOL_GUID;
196*f334afcfSToomas Soome EFI_GUID gEfiBusSpecificDriverOverrideProtocolGuid =
197*f334afcfSToomas Soome     EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL_GUID;
198*f334afcfSToomas Soome EFI_GUID gEfiCapsuleArchProtocolGuid = EFI_CAPSULE_ARCH_PROTOCOL_GUID;
199*f334afcfSToomas Soome EFI_GUID gEfiComponentNameProtocolGuid = EFI_COMPONENT_NAME_PROTOCOL_GUID;
200*f334afcfSToomas Soome EFI_GUID gEfiComponentName2ProtocolGuid = EFI_COMPONENT_NAME2_PROTOCOL_GUID;
201*f334afcfSToomas Soome EFI_GUID gEfiCpuArchProtocolGuid = EFI_CPU_ARCH_PROTOCOL_GUID;
202*f334afcfSToomas Soome EFI_GUID gEfiCpuIo2ProtocolGuid = EFI_CPU_IO2_PROTOCOL_GUID;
203*f334afcfSToomas Soome EFI_GUID gEfiDataHubProtocolGuid = EFI_DATA_HUB_PROTOCOL_GUID;
204*f334afcfSToomas Soome EFI_GUID gEfiDebugImageInfoTableGuid = EFI_DEBUG_IMAGE_INFO_TABLE_GUID;
205*f334afcfSToomas Soome EFI_GUID gEfiDecompressProtocolGuid = EFI_DECOMPRESS_PROTOCOL_GUID;
206*f334afcfSToomas Soome EFI_GUID gEfiDeviceIoProtocolGuid = EFI_DEVICE_IO_PROTOCOL_GUID;
207*f334afcfSToomas Soome EFI_GUID gEfiDhcp4ProtocolGuid = EFI_DHCP4_PROTOCOL_GUID;
208*f334afcfSToomas Soome EFI_GUID gEfiDhcp4ServiceBindingProtocolGuid =
209*f334afcfSToomas Soome     EFI_DHCP6_SERVICE_BINDING_PROTOCOL_GUID;
210*f334afcfSToomas Soome EFI_GUID gEfiDhcp6ProtocolGuid = EFI_DHCP4_PROTOCOL_GUID;
211*f334afcfSToomas Soome EFI_GUID gEfiDhcp6ServiceBindingProtocolGuid =
212*f334afcfSToomas Soome     EFI_DHCP6_SERVICE_BINDING_PROTOCOL_GUID;
213*f334afcfSToomas Soome EFI_GUID gEfiDiskInfoProtocolGuid = EFI_DISK_INFO_PROTOCOL_GUID;
214*f334afcfSToomas Soome EFI_GUID gEfiDiskIoProtocolGuid = EFI_DISK_IO_PROTOCOL_GUID;
215*f334afcfSToomas Soome EFI_GUID gEfiDiskIo2ProtocolGuid = EFI_DISK_IO2_PROTOCOL_GUID;
216*f334afcfSToomas Soome EFI_GUID gEfiDpcProtocolGuid = EFI_DPC_PROTOCOL_GUID;
217*f334afcfSToomas Soome EFI_GUID gEfiDriverConfigurationProtocolGuid =
218*f334afcfSToomas Soome     EFI_DRIVER_CONFIGURATION_PROTOCOL_GUID;
219*f334afcfSToomas Soome EFI_GUID gEfiDriverConfiguration2ProtocolGuid =
220*f334afcfSToomas Soome     EFI_DRIVER_CONFIGURATION2_PROTOCOL_GUID;
221*f334afcfSToomas Soome EFI_GUID gEfiDriverDiagnosticsProtocolGuid =
222*f334afcfSToomas Soome     EFI_DRIVER_DIAGNOSTICS_PROTOCOL_GUID;
223*f334afcfSToomas Soome EFI_GUID gEfiDriverDiagnostics2ProtocolGuid =
224*f334afcfSToomas Soome     EFI_DRIVER_DIAGNOSTICS2_PROTOCOL_GUID;
225*f334afcfSToomas Soome EFI_GUID gEfiDriverFamilyOverrideProtocolGuid =
226*f334afcfSToomas Soome     EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL_GUID;
227*f334afcfSToomas Soome EFI_GUID gEfiDriverHealthProtocolGuid =
228*f334afcfSToomas Soome     EFI_DRIVER_HEALTH_PROTOCOL_GUID;
229*f334afcfSToomas Soome EFI_GUID gEfiDriverSupportedEfiVersionProtocolGuid =
230*f334afcfSToomas Soome     EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL_GUID;
231*f334afcfSToomas Soome EFI_GUID gEfiDxeServicesTableGuid = DXE_SERVICES_TABLE_GUID;
232*f334afcfSToomas Soome EFI_GUID gEfiEbcProtocolGuid = EFI_EBC_INTERPRETER_PROTOCOL_GUID;
233*f334afcfSToomas Soome EFI_GUID gEfiFormBrowser2ProtocolGuid = EFI_FORM_BROWSER2_PROTOCOL_GUID;
234*f334afcfSToomas Soome EFI_GUID gEfiFirmwareVolumeBlockProtocolGuid =
235*f334afcfSToomas Soome     EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID;
236*f334afcfSToomas Soome EFI_GUID gEfiFirmwareVolumeBlock2ProtocolGuid =
237*f334afcfSToomas Soome     EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL_GUID;
238*f334afcfSToomas Soome EFI_GUID gEfiHiiConfigAccessProtocolGuid = EFI_HII_CONFIG_ACCESS_PROTOCOL_GUID;
239*f334afcfSToomas Soome EFI_GUID gEfiConfigKeywordHandlerProtocolGuid =
240*f334afcfSToomas Soome     EFI_CONFIG_KEYWORD_HANDLER_PROTOCOL_GUID;
241*f334afcfSToomas Soome EFI_GUID gEfiHiiConfigRoutingProtocolGuid =
242*f334afcfSToomas Soome     EFI_HII_CONFIG_ROUTING_PROTOCOL_GUID;
243*f334afcfSToomas Soome EFI_GUID gEfiHiiFontProtocolGuid = EFI_HII_FONT_PROTOCOL_GUID;
244*f334afcfSToomas Soome EFI_GUID gEfiHiiImageProtocolGuid = EFI_HII_IMAGE_PROTOCOL_GUID;
245*f334afcfSToomas Soome EFI_GUID gEfiHiiStringProtocolGuid = EFI_HII_STRING_PROTOCOL_GUID;
246*f334afcfSToomas Soome EFI_GUID gEfiHiiDatabaseProtocolGuid = EFI_HII_DATABASE_PROTOCOL_GUID;
247*f334afcfSToomas Soome EFI_GUID gEfiHobListGuid = HOB_LIST_GUID;
248*f334afcfSToomas Soome EFI_GUID gEfiIdeControllerInitProtocolGuid =
249*f334afcfSToomas Soome     EFI_IDE_CONTROLLER_INIT_PROTOCOL_GUID;
250*f334afcfSToomas Soome EFI_GUID gEfiIp4ProtocolGuid = EFI_IP4_PROTOCOL_GUID;
251*f334afcfSToomas Soome EFI_GUID gEfiIp4ServiceBindingProtocolGuid =
252*f334afcfSToomas Soome     EFI_IP4_SERVICE_BINDING_PROTOCOL_GUID;
253*f334afcfSToomas Soome EFI_GUID gEfiIp4ConfigProtocolGuid = EFI_IP4_CONFIG_PROTOCOL_GUID;
254*f334afcfSToomas Soome EFI_GUID gEfiIp4Config2ProtocolGuid = EFI_IP4_CONFIG2_PROTOCOL_GUID;
255*f334afcfSToomas Soome EFI_GUID gEfiIp6ProtocolGuid = EFI_IP6_PROTOCOL_GUID;
256*f334afcfSToomas Soome EFI_GUID gEfiIp6ServiceBindingProtocolGuid =
257*f334afcfSToomas Soome     EFI_IP6_SERVICE_BINDING_PROTOCOL_GUID;
258*f334afcfSToomas Soome EFI_GUID gEfiIp6ConfigProtocolGuid = EFI_IP6_CONFIG_PROTOCOL_GUID;
259*f334afcfSToomas Soome EFI_GUID gEfiIpSecProtocolGuid = EFI_IPSEC_PROTOCOL_GUID;
260*f334afcfSToomas Soome EFI_GUID gEfiIpSec2ProtocolGuid = EFI_IPSEC2_PROTOCOL_GUID;
261*f334afcfSToomas Soome EFI_GUID gEfiIpSecConfigProtocolGuid = EFI_IPSEC_CONFIG_PROTOCOL_GUID;
262*f334afcfSToomas Soome EFI_GUID gEfiIsaAcpiProtocolGuid = EFI_ISA_ACPI_PROTOCOL_GUID;
263*f334afcfSToomas Soome EFI_GUID gEfiIsaIoProtocolGuid = EFI_ISA_IO_PROTOCOL_GUID;
264*f334afcfSToomas Soome EFI_GUID gEfiKmsProtocolGuid = EFI_KMS_PROTOCOL_GUID;
265*f334afcfSToomas Soome EFI_GUID gEfiLegacy8259ProtocolGuid = EFI_LEGACY_8259_PROTOCOL_GUID;
266*f334afcfSToomas Soome EFI_GUID gEfiLoadFileProtocolGuid = EFI_LOAD_FILE_PROTOCOL_GUID;
267*f334afcfSToomas Soome EFI_GUID gEfiLoadFile2ProtocolGuid = EFI_LOAD_FILE2_PROTOCOL_GUID;
268*f334afcfSToomas Soome EFI_GUID gEfiManagedNetworkProtocolGuid = EFI_MANAGED_NETWORK_PROTOCOL_GUID;
269*f334afcfSToomas Soome EFI_GUID gEfiManagedNetworkServiceBindingProtocolGuid =
270*f334afcfSToomas Soome     EFI_MANAGED_NETWORK_SERVICE_BINDING_PROTOCOL_GUID;
271*f334afcfSToomas Soome EFI_GUID gEfiMemoryTypeInformationGuid = EFI_MEMORY_TYPE_INFORMATION_GUID;
272*f334afcfSToomas Soome EFI_GUID gEfiMetronomeArchProtocolGuid = EFI_METRONOME_ARCH_PROTOCOL_GUID;
273*f334afcfSToomas Soome EFI_GUID gEfiMonotonicCounterArchProtocolGuid =
274*f334afcfSToomas Soome     EFI_MONOTONIC_COUNTER_ARCH_PROTOCOL_GUID;
275*f334afcfSToomas Soome EFI_GUID gEfiMpServiceProtocolGuid = EFI_MP_SERVICES_PROTOCOL_GUID;
276*f334afcfSToomas Soome EFI_GUID gEfiMpsTableGuid = MPS_TABLE_GUID;
277*f334afcfSToomas Soome EFI_GUID gEfiMtftp4ProtocolGuid = EFI_MTFTP4_PROTOCOL_GUID;
278*f334afcfSToomas Soome EFI_GUID gEfiMtftp4ServiceBindingProtocolGuid =
279*f334afcfSToomas Soome     EFI_MTFTP4_SERVICE_BINDING_PROTOCOL_GUID;
280*f334afcfSToomas Soome EFI_GUID gEfiMtftp6ProtocolGuid = EFI_MTFTP6_PROTOCOL_GUID;
281*f334afcfSToomas Soome EFI_GUID gEfiMtftp6ServiceBindingProtocolGuid =
282*f334afcfSToomas Soome     EFI_MTFTP6_SERVICE_BINDING_PROTOCOL_GUID;
283*f334afcfSToomas Soome EFI_GUID gEfiNetworkInterfaceIdentifierProtocolGuid =
284*f334afcfSToomas Soome     EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID;
285*f334afcfSToomas Soome EFI_GUID gEfiNetworkInterfaceIdentifierProtocolGuid_31 =
286*f334afcfSToomas Soome     EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID_31;
287*f334afcfSToomas Soome EFI_GUID gEfiNvmExpressPassThruProtocolGuid =
288*f334afcfSToomas Soome     EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL_GUID;
289*f334afcfSToomas Soome EFI_GUID gEfiPartTypeLegacyMbrGuid = EFI_PART_TYPE_LEGACY_MBR_GUID;
290*f334afcfSToomas Soome EFI_GUID gEfiPartTypeSystemPartGuid = EFI_PART_TYPE_EFI_SYSTEM_PART_GUID;
291*f334afcfSToomas Soome EFI_GUID gEfiPcdProtocolGuid = EFI_PCD_PROTOCOL_GUID;
292*f334afcfSToomas Soome EFI_GUID gEfiPciEnumerationCompleteProtocolGuid =
293*f334afcfSToomas Soome     EFI_PCI_ENUMERATION_COMPLETE_GUID;
294*f334afcfSToomas Soome EFI_GUID gEfiPciRootBridgeIoProtocolGuid =
295*f334afcfSToomas Soome     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID;
296*f334afcfSToomas Soome EFI_GUID gEfiPlatformDriverOverrideProtocolGuid =
297*f334afcfSToomas Soome     EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL_GUID;
298*f334afcfSToomas Soome EFI_GUID gEfiPlatformToDriverConfigurationProtocolGuid =
299*f334afcfSToomas Soome     EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL_GUID;
300*f334afcfSToomas Soome EFI_GUID gEfiPrint2SProtocolGuid = EFI_PRINT2_PROTOCOL_GUID;
301*f334afcfSToomas Soome EFI_GUID gEfiPxeBaseCodeProtocolGuid = EFI_PXE_BASE_CODE_PROTOCOL_GUID;
302*f334afcfSToomas Soome EFI_GUID gEfiPxeBaseCodeCallbackProtocolGuid =
303*f334afcfSToomas Soome     EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_GUID;
304*f334afcfSToomas Soome EFI_GUID gEfiRealTimeClockArchProtocolGuid =
305*f334afcfSToomas Soome     EFI_REAL_TIME_CLOCK_ARCH_PROTOCOL_GUID;
306*f334afcfSToomas Soome EFI_GUID gEfiResetArchProtocolGuid = EFI_RESET_ARCH_PROTOCOL_GUID;
307*f334afcfSToomas Soome EFI_GUID gEfiRngProtocolGuid = EFI_RNG_PROTOCOL_GUID;
308*f334afcfSToomas Soome EFI_GUID gEfiRuntimeArchProtocolGuid = EFI_RUNTIME_ARCH_PROTOCOL_GUID;
309*f334afcfSToomas Soome EFI_GUID gEfiScsiIoProtocolGuid = EFI_SCSI_IO_PROTOCOL_GUID;
310*f334afcfSToomas Soome EFI_GUID gEfiScsiPassThruProtocolGuid = EFI_SCSI_PASS_THRU_PROTOCOL_GUID;
311*f334afcfSToomas Soome EFI_GUID gEfiExtScsiPassThruProtocolGuid =
312*f334afcfSToomas Soome     EFI_EXT_SCSI_PASS_THRU_PROTOCOL_GUID;
313*f334afcfSToomas Soome EFI_GUID gEfiSecurityArchProtocolGuid = EFI_SECURITY_ARCH_PROTOCOL_GUID;
314*f334afcfSToomas Soome EFI_GUID gEfiSecurity2ArchProtocolGuid = EFI_SECURITY2_ARCH_PROTOCOL_GUID;
315*f334afcfSToomas Soome EFI_GUID gEfiSecurityPolicyProtocolGuid = EFI_SECURITY_POLICY_PROTOCOL_GUID;
316*f334afcfSToomas Soome EFI_GUID gEfiSimpleFileSystemProtocolGuid =
317*f334afcfSToomas Soome     EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID;
318*f334afcfSToomas Soome EFI_GUID gEfiSimplePointerProtocolGuid = EFI_SIMPLE_POINTER_PROTOCOL_GUID;
319*f334afcfSToomas Soome EFI_GUID gEfiSmartCardReaderProtocolGuid = EFI_SMART_CARD_READER_PROTOCOL_GUID;
320*f334afcfSToomas Soome EFI_GUID gEfiStatusCodeRuntimeProtocolGuid =
321*f334afcfSToomas Soome     EFI_STATUS_CODE_RUNTIME_PROTOCOL_GUID;
322*f334afcfSToomas Soome EFI_GUID gEfiStorageSecurityCommandProtocolGuid =
323*f334afcfSToomas Soome     EFI_STORAGE_SECURITY_COMMAND_PROTOCOL_GUID;
324*f334afcfSToomas Soome EFI_GUID gEfiTcg2ProtocolGuid = EFI_TCG2_PROTOCOL_GUID;
325*f334afcfSToomas Soome EFI_GUID gEfiTcp4ProtocolGuid = EFI_TCP4_PROTOCOL_GUID;
326*f334afcfSToomas Soome EFI_GUID gEfiTcp4ServiceBindingProtocolGuid =
327*f334afcfSToomas Soome     EFI_TCP4_SERVICE_BINDING_PROTOCOL_GUID;
328*f334afcfSToomas Soome EFI_GUID gEfiTcp6ProtocolGuid = EFI_TCP6_PROTOCOL_GUID;
329*f334afcfSToomas Soome EFI_GUID gEfiTcp6ServiceBindingProtocolGuid =
330*f334afcfSToomas Soome     EFI_TCP6_SERVICE_BINDING_PROTOCOL_GUID;
331*f334afcfSToomas Soome EFI_GUID gEfiTimerArchProtocolGuid = EFI_TIMER_ARCH_PROTOCOL_GUID;
332*f334afcfSToomas Soome EFI_GUID gEfiUdp4ProtocolGuid = EFI_UDP4_PROTOCOL_GUID;
333*f334afcfSToomas Soome EFI_GUID gEfiUdp4ServiceBindingProtocolGuid =
334*f334afcfSToomas Soome     EFI_UDP4_SERVICE_BINDING_PROTOCOL_GUID;
335*f334afcfSToomas Soome EFI_GUID gEfiUdp6ProtocolGuid = EFI_UDP6_PROTOCOL_GUID;
336*f334afcfSToomas Soome EFI_GUID gEfiUdp6ServiceBindingProtocolGuid =
337*f334afcfSToomas Soome     EFI_UDP6_SERVICE_BINDING_PROTOCOL_GUID;
338*f334afcfSToomas Soome EFI_GUID gEfiUnicodeCollationProtocolGuid = EFI_UNICODE_COLLATION_PROTOCOL_GUID;
339*f334afcfSToomas Soome EFI_GUID gEfiUnicodeCollation2ProtocolGuid =
340*f334afcfSToomas Soome     EFI_UNICODE_COLLATION_PROTOCOL2_GUID;
341*f334afcfSToomas Soome EFI_GUID gEfiUsbIoProtocolGuid = EFI_USB_IO_PROTOCOL_GUID;
342*f334afcfSToomas Soome EFI_GUID gEfiUsb2HcProtocolGuid = EFI_USB2_HC_PROTOCOL_GUID;
343*f334afcfSToomas Soome EFI_GUID gEfiVariableArchProtocolGuid = EFI_VARIABLE_ARCH_PROTOCOL_GUID;
344*f334afcfSToomas Soome EFI_GUID gEfiVariableWriteArchProtocolGuid =
345*f334afcfSToomas Soome     EFI_VARIABLE_WRITE_ARCH_PROTOCOL_GUID;
346*f334afcfSToomas Soome EFI_GUID gEfiWatchdogTimerArchProtocolGuid =
347*f334afcfSToomas Soome     EFI_WATCHDOG_TIMER_ARCH_PROTOCOL_GUID;
348*f334afcfSToomas Soome EFI_GUID gFdtTableGuid = FDT_TABLE_GUID;
349*f334afcfSToomas Soome EFI_GUID gLzmaCompress = LZMA_COMPRESS_GUID;
350*f334afcfSToomas Soome EFI_GUID gMtcVendorGuid = MTC_VENDOR_GUID;
351*f334afcfSToomas Soome EFI_GUID gPcdProtocolGuid = PCD_PROTOCOL_GUID;
352*f334afcfSToomas Soome EFI_GUID gEfiSerialIoProtocolGuid = EFI_SERIAL_IO_PROTOCOL_GUID;
353*f334afcfSToomas Soome EFI_GUID gEfiSerialTerminalDeviceTypeGuid =
354*f334afcfSToomas Soome     EFI_SERIAL_TERMINAL_DEVICE_TYPE_GUID;
355*f334afcfSToomas Soome 
356eee59048SToomas Soome static struct efi_uuid_mapping {
357eee59048SToomas Soome 	const char *efi_guid_name;
358*f334afcfSToomas Soome 	EFI_GUID *efi_guid;
359eee59048SToomas Soome } efi_uuid_mapping[] = {
360*f334afcfSToomas Soome 	{ .efi_guid_name = "global",
361*f334afcfSToomas Soome 	    .efi_guid = &gEfiGlobalVariableGuid },
362*f334afcfSToomas Soome 	{ .efi_guid_name = "illumos",
363*f334afcfSToomas Soome 	    .efi_guid = &gillumosBootVarGuid },
364eee59048SToomas Soome 	/* EFI Systab entry names. */
365*f334afcfSToomas Soome 	{ .efi_guid_name = "MPS Table",
366*f334afcfSToomas Soome 	    .efi_guid = &gEfiMpsTableGuid },
367*f334afcfSToomas Soome 	{ .efi_guid_name = "ACPI Table",
368*f334afcfSToomas Soome 	    .efi_guid = &gEfiAcpiTableGuid },
369*f334afcfSToomas Soome 	{ .efi_guid_name = "ACPI 2.0 Table",
370*f334afcfSToomas Soome 	    .efi_guid = &gEfiAcpi20TableGuid },
371*f334afcfSToomas Soome 	{ .efi_guid_name = "ATA pass thru",
372*f334afcfSToomas Soome 	    .efi_guid = &gEfiAtaPassThruProtocolGuid },
373*f334afcfSToomas Soome 	{ .efi_guid_name = "SMBIOS Table",
374*f334afcfSToomas Soome 	    .efi_guid = &gEfiSmbiosTableGuid },
375*f334afcfSToomas Soome 	{ .efi_guid_name = "SMBIOS3 Table",
376*f334afcfSToomas Soome 	    .efi_guid = &gEfiSmbios3TableGuid },
377*f334afcfSToomas Soome 	{ .efi_guid_name = "DXE Table",
378*f334afcfSToomas Soome 	    .efi_guid = &gEfiDxeServicesTableGuid },
379*f334afcfSToomas Soome 	{ .efi_guid_name = "HOB List Table",
380*f334afcfSToomas Soome 	    .efi_guid = &gEfiHobListGuid },
381eee59048SToomas Soome 	{ .efi_guid_name = EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME,
382*f334afcfSToomas Soome 	    .efi_guid = &gEfiMemoryTypeInformationGuid },
383eee59048SToomas Soome 	{ .efi_guid_name = "Debug Image Info Table",
384*f334afcfSToomas Soome 	    .efi_guid = &gEfiDebugImageInfoTableGuid },
385*f334afcfSToomas Soome 	{ .efi_guid_name = "FDT Table",
386*f334afcfSToomas Soome 	    .efi_guid = &gFdtTableGuid },
387eee59048SToomas Soome 	/*
388eee59048SToomas Soome 	 * Protocol names for debug purposes.
389eee59048SToomas Soome 	 * Can be removed along with lsefi command.
390eee59048SToomas Soome 	 */
391*f334afcfSToomas Soome 	{ .efi_guid_name = "absolute pointer",
392*f334afcfSToomas Soome 	    .efi_guid = &gEfiAbsolutePointerProtocolGuid },
393*f334afcfSToomas Soome 	{ .efi_guid_name = "device path",
394*f334afcfSToomas Soome 	    .efi_guid = &gEfiDevicePathProtocolGuid },
395*f334afcfSToomas Soome 	{ .efi_guid_name = "block io",
396*f334afcfSToomas Soome 	    .efi_guid = &gEfiBlockIoProtocolGuid },
397*f334afcfSToomas Soome 	{ .efi_guid_name = "block io2",
398*f334afcfSToomas Soome 	    .efi_guid = &gEfiBlockIo2ProtocolGuid },
399*f334afcfSToomas Soome 	{ .efi_guid_name = "disk io",
400*f334afcfSToomas Soome 	    .efi_guid = &gEfiDiskIoProtocolGuid },
401*f334afcfSToomas Soome 	{ .efi_guid_name = "disk io2",
402*f334afcfSToomas Soome 	    .efi_guid = &gEfiDiskIo2ProtocolGuid },
403*f334afcfSToomas Soome 	{ .efi_guid_name = "disk info",
404*f334afcfSToomas Soome 	    .efi_guid = &gEfiDiskInfoProtocolGuid },
405eee59048SToomas Soome 	{ .efi_guid_name = "simple fs",
406*f334afcfSToomas Soome 	    .efi_guid = &gEfiSimpleFileSystemProtocolGuid },
407*f334afcfSToomas Soome 	{ .efi_guid_name = "load file",
408*f334afcfSToomas Soome 	    .efi_guid = &gEfiLoadFileProtocolGuid },
409*f334afcfSToomas Soome 	{ .efi_guid_name = "load file2",
410*f334afcfSToomas Soome 	    .efi_guid = &gEfiLoadFile2ProtocolGuid },
411*f334afcfSToomas Soome 	{ .efi_guid_name = "device io",
412*f334afcfSToomas Soome 	    .efi_guid = &gEfiDeviceIoProtocolGuid },
413eee59048SToomas Soome 	{ .efi_guid_name = "unicode collation",
414*f334afcfSToomas Soome 	    .efi_guid = &gEfiUnicodeCollationProtocolGuid },
415eee59048SToomas Soome 	{ .efi_guid_name = "unicode collation2",
416*f334afcfSToomas Soome 	    .efi_guid = &gEfiUnicodeCollation2ProtocolGuid },
417eee59048SToomas Soome 	{ .efi_guid_name = "simple network",
418*f334afcfSToomas Soome 	    .efi_guid = &gEfiSimpleNetworkProtocolGuid },
419*f334afcfSToomas Soome 	{ .efi_guid_name = "simple pointer",
420*f334afcfSToomas Soome 	    .efi_guid = &gEfiSimplePointerProtocolGuid },
421eee59048SToomas Soome 	{ .efi_guid_name = "simple text output",
422*f334afcfSToomas Soome 	    .efi_guid = &gEfiSimpleTextOutProtocolGuid },
423eee59048SToomas Soome 	{ .efi_guid_name = "simple text input",
424*f334afcfSToomas Soome 	    .efi_guid = &gEfiSimpleTextInProtocolGuid },
425eee59048SToomas Soome 	{ .efi_guid_name = "simple text ex input",
426*f334afcfSToomas Soome 	    .efi_guid = &gEfiSimpleTextInputExProtocolGuid },
427eee59048SToomas Soome 	{ .efi_guid_name = "console control",
428*f334afcfSToomas Soome 	    .efi_guid = &gEfiConsoleControlProtocolGuid },
429*f334afcfSToomas Soome 	{ .efi_guid_name = "stdin",
430*f334afcfSToomas Soome 	    .efi_guid = &gEfiConsoleInDeviceGuid },
431*f334afcfSToomas Soome 	{ .efi_guid_name = "stdout",
432*f334afcfSToomas Soome 	    .efi_guid = &gEfiConsoleOutDeviceGuid },
433eee59048SToomas Soome 	{ .efi_guid_name = "stderr",
434*f334afcfSToomas Soome 	    .efi_guid = &gEfiStandardErrorDeviceGuid },
435eee59048SToomas Soome 	{ .efi_guid_name = "GOP",
436*f334afcfSToomas Soome 	    .efi_guid = &gEfiGraphicsOutputProtocolGuid },
437*f334afcfSToomas Soome 	{ .efi_guid_name = "UGA draw",
438*f334afcfSToomas Soome 	    .efi_guid = &gEfiUgaDrawProtocolGuid },
439*f334afcfSToomas Soome 	{ .efi_guid_name = "UGA io",
440*f334afcfSToomas Soome 	    .efi_guid = &gEfiUgaIoProtocolGuid },
441eee59048SToomas Soome 	{ .efi_guid_name = "PXE base code",
442*f334afcfSToomas Soome 	    .efi_guid = &gEfiPxeBaseCodeProtocolGuid },
443eee59048SToomas Soome 	{ .efi_guid_name = "PXE base code callback",
444*f334afcfSToomas Soome 	    .efi_guid = &gEfiPxeBaseCodeCallbackProtocolGuid },
445*f334afcfSToomas Soome 	{ .efi_guid_name = "serial io",
446*f334afcfSToomas Soome 	    .efi_guid = &gEfiSerialIoProtocolGuid },
447*f334afcfSToomas Soome 	{ .efi_guid_name = "serial device type",
448*f334afcfSToomas Soome 	    .efi_guid = &gEfiSerialTerminalDeviceTypeGuid },
449*f334afcfSToomas Soome 	{ .efi_guid_name = "loaded image",
450*f334afcfSToomas Soome 	    .efi_guid = &gEfiLoadedImageProtocolGuid },
451eee59048SToomas Soome 	{ .efi_guid_name = "loaded image device path",
452*f334afcfSToomas Soome 	    .efi_guid = &gEfiLoadedImageDevicePathProtocolGuid },
453*f334afcfSToomas Soome 	{ .efi_guid_name = "ISA ACPI",
454*f334afcfSToomas Soome 	    .efi_guid = &gEfiIsaAcpiProtocolGuid },
455*f334afcfSToomas Soome 	{ .efi_guid_name = "ISA io",
456*f334afcfSToomas Soome 	    .efi_guid = &gEfiIsaIoProtocolGuid },
4578dff7262SToomas Soome 	{ .efi_guid_name = "IDE controller init",
458*f334afcfSToomas Soome 	    .efi_guid = &gEfiIdeControllerInitProtocolGuid },
459*f334afcfSToomas Soome 	{ .efi_guid_name = "PCI",
460*f334afcfSToomas Soome 	    .efi_guid = &gEfiPciIoProtocolGuid },
4618dff7262SToomas Soome 	{ .efi_guid_name = "PCI enumeration",
462*f334afcfSToomas Soome 	    .efi_guid = &gEfiPciEnumerationCompleteProtocolGuid },
463*f334afcfSToomas Soome 	{ .efi_guid_name = "PCI root bridge",
464*f334afcfSToomas Soome 	    .efi_guid = &gEfiPciRootBridgeIoProtocolGuid },
465*f334afcfSToomas Soome 	{ .efi_guid_name = "driver binding",
466*f334afcfSToomas Soome 	    .efi_guid = &gEfiDriverBindingProtocolGuid },
467*f334afcfSToomas Soome 	{ .efi_guid_name = "driver configuration",
468*f334afcfSToomas Soome 	    .efi_guid = &gEfiDriverConfigurationProtocolGuid },
469*f334afcfSToomas Soome 	{ .efi_guid_name = "driver configuration2",
470*f334afcfSToomas Soome 	    .efi_guid = &gEfiDriverConfiguration2ProtocolGuid },
471*f334afcfSToomas Soome 	{ .efi_guid_name = "driver diagnostics",
472*f334afcfSToomas Soome 	    .efi_guid = &gEfiDriverDiagnosticsProtocolGuid },
473*f334afcfSToomas Soome 	{ .efi_guid_name = "driver diagnostics2",
474*f334afcfSToomas Soome 	    .efi_guid = &gEfiDriverDiagnostics2ProtocolGuid },
475*f334afcfSToomas Soome 	{ .efi_guid_name = "driver override",
476*f334afcfSToomas Soome 	    .efi_guid = &gEfiPlatformDriverOverrideProtocolGuid },
477*f334afcfSToomas Soome 	{ .efi_guid_name = "bus specific driver override",
478*f334afcfSToomas Soome 	    .efi_guid = &gEfiBusSpecificDriverOverrideProtocolGuid },
479*f334afcfSToomas Soome 	{ .efi_guid_name = "platform to driver configuration",
480*f334afcfSToomas Soome 	    .efi_guid = &gEfiPlatformToDriverConfigurationProtocolGuid },
481*f334afcfSToomas Soome 	{ .efi_guid_name = "driver supported EFI version",
482*f334afcfSToomas Soome 	    .efi_guid = &gEfiDriverSupportedEfiVersionProtocolGuid },
483*f334afcfSToomas Soome 	{ .efi_guid_name = "driver family override",
484*f334afcfSToomas Soome 	    .efi_guid = &gEfiDriverFamilyOverrideProtocolGuid },
485*f334afcfSToomas Soome 	{ .efi_guid_name = "driver health",
486*f334afcfSToomas Soome 	    .efi_guid = &gEfiDriverHealthProtocolGuid },
487*f334afcfSToomas Soome 	{ .efi_guid_name = "adapter information",
488*f334afcfSToomas Soome 	    .efi_guid = &gEfiAdapterInformationProtocolGuid },
489*f334afcfSToomas Soome 	{ .efi_guid_name = "VLAN config",
490*f334afcfSToomas Soome 	    .efi_guid = &gEfiVlanConfigProtocolGuid },
491*f334afcfSToomas Soome 	{ .efi_guid_name = "ARP service binding",
492*f334afcfSToomas Soome 	    .efi_guid = &gEfiArpServiceBindingProtocolGuid },
493*f334afcfSToomas Soome 	{ .efi_guid_name = "ARP",
494*f334afcfSToomas Soome 	    .efi_guid = &gEfiArpProtocolGuid },
495*f334afcfSToomas Soome 	{ .efi_guid_name = "IPv4 service binding",
496*f334afcfSToomas Soome 	    .efi_guid = &gEfiIp4ServiceBindingProtocolGuid },
497*f334afcfSToomas Soome 	{ .efi_guid_name = "IPv4",
498*f334afcfSToomas Soome 	    .efi_guid = &gEfiIp4ProtocolGuid },
499*f334afcfSToomas Soome 	{ .efi_guid_name = "IPv4 config",
500*f334afcfSToomas Soome 	    .efi_guid = &gEfiIp4ConfigProtocolGuid },
501*f334afcfSToomas Soome 	{ .efi_guid_name = "IPv4 config2",
502*f334afcfSToomas Soome 	    .efi_guid = &gEfiIp4Config2ProtocolGuid },
503*f334afcfSToomas Soome 	{ .efi_guid_name = "IPv6 service binding",
504*f334afcfSToomas Soome 	    .efi_guid = &gEfiIp6ServiceBindingProtocolGuid },
505*f334afcfSToomas Soome 	{ .efi_guid_name = "IPv6",
506*f334afcfSToomas Soome 	    .efi_guid = &gEfiIp6ProtocolGuid },
507*f334afcfSToomas Soome 	{ .efi_guid_name = "IPv6 config",
508*f334afcfSToomas Soome 	    .efi_guid = &gEfiIp6ConfigProtocolGuid },
509*f334afcfSToomas Soome 	{ .efi_guid_name = "NVMe pass thru",
510*f334afcfSToomas Soome 	    .efi_guid = &gEfiNvmExpressPassThruProtocolGuid },
511*f334afcfSToomas Soome 	{ .efi_guid_name = "UDPv4",
512*f334afcfSToomas Soome 	    .efi_guid = &gEfiUdp4ProtocolGuid },
513*f334afcfSToomas Soome 	{ .efi_guid_name = "UDPv4 service binding",
514*f334afcfSToomas Soome 	    .efi_guid = &gEfiUdp4ServiceBindingProtocolGuid },
515*f334afcfSToomas Soome 	{ .efi_guid_name = "UDPv6",
516*f334afcfSToomas Soome 	    .efi_guid = &gEfiUdp6ProtocolGuid },
517*f334afcfSToomas Soome 	{ .efi_guid_name = "UDPv6 service binding",
518*f334afcfSToomas Soome 	    .efi_guid = &gEfiUdp6ServiceBindingProtocolGuid },
519*f334afcfSToomas Soome 	{ .efi_guid_name = "TCPv4",
520*f334afcfSToomas Soome 	    .efi_guid = &gEfiTcp4ProtocolGuid },
521*f334afcfSToomas Soome 	{ .efi_guid_name = "TCPv4 service binding",
522*f334afcfSToomas Soome 	    .efi_guid = &gEfiTcp4ServiceBindingProtocolGuid },
523*f334afcfSToomas Soome 	{ .efi_guid_name = "TCPv6",
524*f334afcfSToomas Soome 	    .efi_guid = &gEfiTcp6ProtocolGuid },
525*f334afcfSToomas Soome 	{ .efi_guid_name = "TCPv6 service binding",
526*f334afcfSToomas Soome 	    .efi_guid = &gEfiTcp6ServiceBindingProtocolGuid },
527*f334afcfSToomas Soome 	{ .efi_guid_name = "EFI System partition",
528*f334afcfSToomas Soome 	    .efi_guid = &gEfiPartTypeSystemPartGuid },
529*f334afcfSToomas Soome 	{ .efi_guid_name = "MBR legacy",
530*f334afcfSToomas Soome 	    .efi_guid = &gEfiPartTypeLegacyMbrGuid },
531*f334afcfSToomas Soome 	{ .efi_guid_name = "USB io",
532*f334afcfSToomas Soome 	    .efi_guid = &gEfiUsbIoProtocolGuid },
533*f334afcfSToomas Soome 	{ .efi_guid_name = "USB2 HC",
534*f334afcfSToomas Soome 	    .efi_guid = &gEfiUsb2HcProtocolGuid },
535*f334afcfSToomas Soome 	{ .efi_guid_name = "component name",
536*f334afcfSToomas Soome 	    .efi_guid = &gEfiComponentNameProtocolGuid },
537*f334afcfSToomas Soome 	{ .efi_guid_name = "component name2",
538*f334afcfSToomas Soome 	    .efi_guid = &gEfiComponentName2ProtocolGuid },
539*f334afcfSToomas Soome 	{ .efi_guid_name = "decompress",
540*f334afcfSToomas Soome 	    .efi_guid = &gEfiDecompressProtocolGuid },
541*f334afcfSToomas Soome 	{ .efi_guid_name = "ebc interpreter",
542*f334afcfSToomas Soome 	    .efi_guid = &gEfiEbcProtocolGuid },
543*f334afcfSToomas Soome 	{ .efi_guid_name = "network interface identifier",
544*f334afcfSToomas Soome 	    .efi_guid = &gEfiNetworkInterfaceIdentifierProtocolGuid },
545*f334afcfSToomas Soome 	{ .efi_guid_name = "network interface identifier_31",
546*f334afcfSToomas Soome 	    .efi_guid = &gEfiNetworkInterfaceIdentifierProtocolGuid_31 },
547*f334afcfSToomas Soome 	{ .efi_guid_name = "managed network service binding",
548*f334afcfSToomas Soome 	    .efi_guid = &gEfiManagedNetworkServiceBindingProtocolGuid },
549*f334afcfSToomas Soome 	{ .efi_guid_name = "managed network",
550*f334afcfSToomas Soome 	    .efi_guid = &gEfiManagedNetworkProtocolGuid },
551*f334afcfSToomas Soome 	{ .efi_guid_name = "form browser",
552*f334afcfSToomas Soome 	    .efi_guid = &gEfiFormBrowser2ProtocolGuid },
553*f334afcfSToomas Soome 	{ .efi_guid_name = "HII config access",
554*f334afcfSToomas Soome 	    .efi_guid = &gEfiHiiConfigAccessProtocolGuid },
555*f334afcfSToomas Soome 	{ .efi_guid_name = "HII config keyword handler",
556*f334afcfSToomas Soome 	    .efi_guid = &gEfiConfigKeywordHandlerProtocolGuid },
557*f334afcfSToomas Soome 	{ .efi_guid_name = "HII config routing",
558*f334afcfSToomas Soome 	    .efi_guid = &gEfiHiiConfigRoutingProtocolGuid },
559*f334afcfSToomas Soome 	{ .efi_guid_name = "HII database",
560*f334afcfSToomas Soome 	    .efi_guid = &gEfiHiiDatabaseProtocolGuid },
561*f334afcfSToomas Soome 	{ .efi_guid_name = "HII string",
562*f334afcfSToomas Soome 	    .efi_guid = &gEfiHiiStringProtocolGuid },
563*f334afcfSToomas Soome 	{ .efi_guid_name = "HII image",
564*f334afcfSToomas Soome 	    .efi_guid = &gEfiHiiImageProtocolGuid },
565*f334afcfSToomas Soome 	{ .efi_guid_name = "HII font",
566*f334afcfSToomas Soome 	    .efi_guid = &gEfiHiiFontProtocolGuid },
567*f334afcfSToomas Soome 	{ .efi_guid_name = "MTFTP3 service binding",
568*f334afcfSToomas Soome 	    .efi_guid = &gEfiMtftp4ServiceBindingProtocolGuid },
569*f334afcfSToomas Soome 	{ .efi_guid_name = "MTFTP4",
570*f334afcfSToomas Soome 	    .efi_guid = &gEfiMtftp4ProtocolGuid },
571*f334afcfSToomas Soome 	{ .efi_guid_name = "MTFTP6 service binding",
572*f334afcfSToomas Soome 	    .efi_guid = &gEfiMtftp6ServiceBindingProtocolGuid },
573*f334afcfSToomas Soome 	{ .efi_guid_name = "MTFTP6",
574*f334afcfSToomas Soome 	    .efi_guid = &gEfiMtftp6ProtocolGuid },
575*f334afcfSToomas Soome 	{ .efi_guid_name = "DHCP4 service binding",
576*f334afcfSToomas Soome 	    .efi_guid = &gEfiDhcp4ServiceBindingProtocolGuid },
577*f334afcfSToomas Soome 	{ .efi_guid_name = "DHCP4",
578*f334afcfSToomas Soome 	    .efi_guid = &gEfiDhcp4ProtocolGuid },
579*f334afcfSToomas Soome 	{ .efi_guid_name = "DHCP6 service binding",
580*f334afcfSToomas Soome 	    .efi_guid = &gEfiDhcp6ServiceBindingProtocolGuid },
581*f334afcfSToomas Soome 	{ .efi_guid_name = "DHCP6",
582*f334afcfSToomas Soome 	    .efi_guid = &gEfiDhcp6ProtocolGuid },
583*f334afcfSToomas Soome 	{ .efi_guid_name = "SCSI io",
584*f334afcfSToomas Soome 	    .efi_guid = &gEfiScsiIoProtocolGuid },
585*f334afcfSToomas Soome 	{ .efi_guid_name = "SCSI pass thru",
586*f334afcfSToomas Soome 	    .efi_guid = &gEfiScsiPassThruProtocolGuid },
587*f334afcfSToomas Soome 	{ .efi_guid_name = "SCSI pass thru ext",
588*f334afcfSToomas Soome 	    .efi_guid = &gEfiExtScsiPassThruProtocolGuid },
589*f334afcfSToomas Soome 	{ .efi_guid_name = "Capsule arch",
590*f334afcfSToomas Soome 	    .efi_guid = &gEfiCapsuleArchProtocolGuid },
591*f334afcfSToomas Soome 	{ .efi_guid_name = "monotonic counter arch",
592*f334afcfSToomas Soome 	    .efi_guid = &gEfiMonotonicCounterArchProtocolGuid },
593*f334afcfSToomas Soome 	{ .efi_guid_name = "realtime clock arch",
594*f334afcfSToomas Soome 	    .efi_guid = &gEfiRealTimeClockArchProtocolGuid },
595*f334afcfSToomas Soome 	{ .efi_guid_name = "variable arch",
596*f334afcfSToomas Soome 	    .efi_guid = &gEfiVariableArchProtocolGuid },
597*f334afcfSToomas Soome 	{ .efi_guid_name = "variable write arch",
598*f334afcfSToomas Soome 	    .efi_guid = &gEfiVariableWriteArchProtocolGuid },
599*f334afcfSToomas Soome 	{ .efi_guid_name = "watchdog timer arch",
600*f334afcfSToomas Soome 	    .efi_guid = &gEfiWatchdogTimerArchProtocolGuid },
601*f334afcfSToomas Soome 	{ .efi_guid_name = "BDS arch",
602*f334afcfSToomas Soome 	    .efi_guid = &gEfiBdsArchProtocolGuid },
603*f334afcfSToomas Soome 	{ .efi_guid_name = "metronome arch",
604*f334afcfSToomas Soome 	    .efi_guid = &gEfiMetronomeArchProtocolGuid },
605*f334afcfSToomas Soome 	{ .efi_guid_name = "timer arch",
606*f334afcfSToomas Soome 	    .efi_guid = &gEfiTimerArchProtocolGuid },
607*f334afcfSToomas Soome 	{ .efi_guid_name = "DPC",
608*f334afcfSToomas Soome 	    .efi_guid = &gEfiDpcProtocolGuid },
609*f334afcfSToomas Soome 	{ .efi_guid_name = "print2",
610*f334afcfSToomas Soome 	    .efi_guid = &gEfiPrint2SProtocolGuid },
611*f334afcfSToomas Soome 	{ .efi_guid_name = "device path to text",
612*f334afcfSToomas Soome 	    .efi_guid = &gEfiDevicePathToTextProtocolGuid },
613*f334afcfSToomas Soome 	{ .efi_guid_name = "reset arch",
614*f334afcfSToomas Soome 	    .efi_guid = &gEfiResetArchProtocolGuid },
615*f334afcfSToomas Soome 	{ .efi_guid_name = "CPU arch",
616*f334afcfSToomas Soome 	    .efi_guid = &gEfiCpuArchProtocolGuid },
617*f334afcfSToomas Soome 	{ .efi_guid_name = "CPU IO2",
618*f334afcfSToomas Soome 	    .efi_guid = &gEfiCpuIo2ProtocolGuid },
619*f334afcfSToomas Soome 	{ .efi_guid_name = "Legacy 8259",
620*f334afcfSToomas Soome 	    .efi_guid = &gEfiLegacy8259ProtocolGuid },
621*f334afcfSToomas Soome 	{ .efi_guid_name = "Security arch",
622*f334afcfSToomas Soome 	    .efi_guid = &gEfiSecurityArchProtocolGuid },
623*f334afcfSToomas Soome 	{ .efi_guid_name = "Security2 arch",
624*f334afcfSToomas Soome 	    .efi_guid = &gEfiSecurity2ArchProtocolGuid },
625*f334afcfSToomas Soome 	{ .efi_guid_name = "Security Policy",
626*f334afcfSToomas Soome 	    .efi_guid = &gEfiSecurityPolicyProtocolGuid },
627*f334afcfSToomas Soome 	{ .efi_guid_name = "Runtime arch",
628*f334afcfSToomas Soome 	    .efi_guid = &gEfiRuntimeArchProtocolGuid },
629*f334afcfSToomas Soome 	{ .efi_guid_name = "status code runtime",
630*f334afcfSToomas Soome 	    .efi_guid = &gEfiStatusCodeRuntimeProtocolGuid },
631*f334afcfSToomas Soome 	{ .efi_guid_name = "storage security command",
632*f334afcfSToomas Soome 	    .efi_guid = &gEfiStorageSecurityCommandProtocolGuid },
633*f334afcfSToomas Soome 	{ .efi_guid_name = "data hub",
634*f334afcfSToomas Soome 	    .efi_guid = &gEfiDataHubProtocolGuid },
635*f334afcfSToomas Soome 	{ .efi_guid_name = "PCD",
636*f334afcfSToomas Soome 	    .efi_guid = &gPcdProtocolGuid },
637*f334afcfSToomas Soome 	{ .efi_guid_name = "EFI PCD",
638*f334afcfSToomas Soome 	    .efi_guid = &gEfiPcdProtocolGuid },
639*f334afcfSToomas Soome 	{ .efi_guid_name = "firmware volume block",
640*f334afcfSToomas Soome 	    .efi_guid = &gEfiFirmwareVolumeBlockProtocolGuid },
641*f334afcfSToomas Soome 	{ .efi_guid_name = "firmware volume2",
642*f334afcfSToomas Soome 	    .efi_guid = &gEfiFirmwareVolumeBlock2ProtocolGuid },
643*f334afcfSToomas Soome 	{ .efi_guid_name = "lzma compress",
644*f334afcfSToomas Soome 	    .efi_guid = &gLzmaCompress },
645*f334afcfSToomas Soome 	{ .efi_guid_name = "MP services",
646*f334afcfSToomas Soome 	    .efi_guid = &gEfiMpServiceProtocolGuid },
647*f334afcfSToomas Soome 	{ .efi_guid_name = MTC_VARIABLE_NAME,
648*f334afcfSToomas Soome 	    .efi_guid = &gMtcVendorGuid },
649*f334afcfSToomas Soome 	{ .efi_guid_name = "Active EDID",
650*f334afcfSToomas Soome 	    .efi_guid = &gEfiEdidActiveProtocolGuid },
651*f334afcfSToomas Soome 	{ .efi_guid_name = "Discovered EDID",
652*f334afcfSToomas Soome 	    .efi_guid = &gEfiEdidDiscoveredProtocolGuid },
653*f334afcfSToomas Soome 	{ .efi_guid_name = "key management service",
654*f334afcfSToomas Soome 	    .efi_guid = &gEfiKmsProtocolGuid },
655*f334afcfSToomas Soome 	{ .efi_guid_name = "smart card reader",
656*f334afcfSToomas Soome 	    .efi_guid = &gEfiSmartCardReaderProtocolGuid },
657*f334afcfSToomas Soome 	{ .efi_guid_name = "rng source",
658*f334afcfSToomas Soome 	    .efi_guid = &gEfiRngProtocolGuid },
659*f334afcfSToomas Soome 	{ .efi_guid_name = "IPsec config",
660*f334afcfSToomas Soome 	    .efi_guid = &gEfiIpSecConfigProtocolGuid },
661*f334afcfSToomas Soome 	{ .efi_guid_name = "IPsec",
662*f334afcfSToomas Soome 	    .efi_guid = &gEfiIpSecProtocolGuid },
663*f334afcfSToomas Soome 	{ .efi_guid_name = "IPsec2",
664*f334afcfSToomas Soome 	    .efi_guid = &gEfiIpSec2ProtocolGuid },
665*f334afcfSToomas Soome 	{ .efi_guid_name = "TCG2 tpm",
666*f334afcfSToomas Soome 	    .efi_guid = &gEfiTcg2ProtocolGuid }
667eee59048SToomas Soome };
668eee59048SToomas Soome 
669eee59048SToomas Soome bool
efi_guid_to_str(const EFI_GUID * guid,char ** sp)670eee59048SToomas Soome efi_guid_to_str(const EFI_GUID *guid, char **sp)
671eee59048SToomas Soome {
672eee59048SToomas Soome 	uint32_t status;
673eee59048SToomas Soome 
674eee59048SToomas Soome 	uuid_to_string((const uuid_t *)guid, sp, &status);
675eee59048SToomas Soome 	return (status == uuid_s_ok ? true : false);
676eee59048SToomas Soome }
677eee59048SToomas Soome 
678eee59048SToomas Soome bool
efi_str_to_guid(const char * s,EFI_GUID * guid)679eee59048SToomas Soome efi_str_to_guid(const char *s, EFI_GUID *guid)
680eee59048SToomas Soome {
681eee59048SToomas Soome 	uint32_t status;
682eee59048SToomas Soome 
683eee59048SToomas Soome 	uuid_from_string(s, (uuid_t *)guid, &status);
684eee59048SToomas Soome 	return (status == uuid_s_ok ? true : false);
685eee59048SToomas Soome }
686eee59048SToomas Soome 
687eee59048SToomas Soome bool
efi_name_to_guid(const char * name,EFI_GUID * guid)688eee59048SToomas Soome efi_name_to_guid(const char *name, EFI_GUID *guid)
689eee59048SToomas Soome {
690eee59048SToomas Soome 	uint32_t i;
691eee59048SToomas Soome 
692eee59048SToomas Soome 	for (i = 0; i < nitems(efi_uuid_mapping); i++) {
693eee59048SToomas Soome 		if (strcasecmp(name, efi_uuid_mapping[i].efi_guid_name) == 0) {
694*f334afcfSToomas Soome 			*guid = *efi_uuid_mapping[i].efi_guid;
695eee59048SToomas Soome 			return (true);
696eee59048SToomas Soome 		}
697eee59048SToomas Soome 	}
698eee59048SToomas Soome 	return (efi_str_to_guid(name, guid));
699eee59048SToomas Soome }
700eee59048SToomas Soome 
701eee59048SToomas Soome bool
efi_guid_to_name(EFI_GUID * guid,char ** name)702eee59048SToomas Soome efi_guid_to_name(EFI_GUID *guid, char **name)
703eee59048SToomas Soome {
704eee59048SToomas Soome 	uint32_t i;
705eee59048SToomas Soome 	int rv;
706eee59048SToomas Soome 
707eee59048SToomas Soome 	for (i = 0; i < nitems(efi_uuid_mapping); i++) {
708eee59048SToomas Soome 		rv = uuid_equal((uuid_t *)guid,
709*f334afcfSToomas Soome 		    (uuid_t *)efi_uuid_mapping[i].efi_guid, NULL);
710eee59048SToomas Soome 		if (rv != 0) {
711eee59048SToomas Soome 			*name = strdup(efi_uuid_mapping[i].efi_guid_name);
712eee59048SToomas Soome 			if (*name == NULL)
713eee59048SToomas Soome 				return (false);
714eee59048SToomas Soome 			return (true);
715eee59048SToomas Soome 		}
716eee59048SToomas Soome 	}
717eee59048SToomas Soome 	return (efi_guid_to_str(guid, name));
718eee59048SToomas Soome }
719eee59048SToomas Soome 
720eee59048SToomas Soome void
efi_init_environment(void)721eee59048SToomas Soome efi_init_environment(void)
722eee59048SToomas Soome {
723eee59048SToomas Soome 	char var[128];
724eee59048SToomas Soome 
725*f334afcfSToomas Soome 	snprintf(var, sizeof (var), "%d.%02d", ST->Hdr.Revision >> 16,
726eee59048SToomas Soome 	    ST->Hdr.Revision & 0xffff);
727eee59048SToomas Soome 	env_setenv("efi-version", EV_VOLATILE, var, env_noset, env_nounset);
728eee59048SToomas Soome }
729eee59048SToomas Soome 
730*f334afcfSToomas Soome COMMAND_SET(efishow, "efi-show", "print some or all EFI variables",
731*f334afcfSToomas Soome     command_efi_show);
732eee59048SToomas Soome 
733eee59048SToomas Soome static int
efi_print_other_value(uint8_t * data,UINTN datasz)734eee59048SToomas Soome efi_print_other_value(uint8_t *data, UINTN datasz)
735eee59048SToomas Soome {
736eee59048SToomas Soome 	UINTN i;
737eee59048SToomas Soome 	bool is_ascii = true;
738eee59048SToomas Soome 
739eee59048SToomas Soome 	printf(" = ");
740eee59048SToomas Soome 	for (i = 0; i < datasz - 1; i++) {
741eee59048SToomas Soome 		/*
742eee59048SToomas Soome 		 * Quick hack to see if this ascii-ish string is printable
743eee59048SToomas Soome 		 * range plus tab, cr and lf.
744eee59048SToomas Soome 		 */
745*f334afcfSToomas Soome 		if ((data[i] < 32 || data[i] > 126) &&
746*f334afcfSToomas Soome 		    data[i] != 9 && data[i] != 10 && data[i] != 13) {
747eee59048SToomas Soome 			is_ascii = false;
748eee59048SToomas Soome 			break;
749eee59048SToomas Soome 		}
750eee59048SToomas Soome 	}
751eee59048SToomas Soome 	if (data[datasz - 1] != '\0')
752eee59048SToomas Soome 		is_ascii = false;
753eee59048SToomas Soome 	if (is_ascii == true) {
754eee59048SToomas Soome 		printf("%s", data);
755eee59048SToomas Soome 		if (pager_output("\n"))
756eee59048SToomas Soome 			return (CMD_WARN);
757eee59048SToomas Soome 	} else {
758eee59048SToomas Soome 		if (pager_output("\n"))
759eee59048SToomas Soome 			return (CMD_WARN);
760eee59048SToomas Soome 		/*
761eee59048SToomas Soome 		 * Dump hex bytes grouped by 4.
762eee59048SToomas Soome 		 */
763eee59048SToomas Soome 		for (i = 0; i < datasz; i++) {
764eee59048SToomas Soome 			printf("%02x ", data[i]);
765eee59048SToomas Soome 			if ((i + 1) % 4 == 0)
766eee59048SToomas Soome 				printf(" ");
767eee59048SToomas Soome 			if ((i + 1) % 20 == 0) {
768eee59048SToomas Soome 				if (pager_output("\n"))
769eee59048SToomas Soome 					return (CMD_WARN);
770eee59048SToomas Soome 			}
771eee59048SToomas Soome 		}
772eee59048SToomas Soome 		if (pager_output("\n"))
773eee59048SToomas Soome 			return (CMD_WARN);
774eee59048SToomas Soome 	}
775eee59048SToomas Soome 
776eee59048SToomas Soome 	return (CMD_OK);
777eee59048SToomas Soome }
778eee59048SToomas Soome 
779eee59048SToomas Soome /* This appears to be some sort of UEFI shell alias table. */
780eee59048SToomas Soome static int
efi_print_shell_str(const CHAR16 * varnamearg __unused,uint8_t * data,UINTN datasz __unused)7818eef2ab6SToomas Soome efi_print_shell_str(const CHAR16 *varnamearg __unused, uint8_t *data,
7828eef2ab6SToomas Soome     UINTN datasz __unused)
783eee59048SToomas Soome {
784eee59048SToomas Soome 	printf(" = %S", (CHAR16 *)data);
785eee59048SToomas Soome 	if (pager_output("\n"))
786eee59048SToomas Soome 		return (CMD_WARN);
787eee59048SToomas Soome 	return (CMD_OK);
788eee59048SToomas Soome }
789eee59048SToomas Soome 
790eee59048SToomas Soome const char *
efi_memory_type(EFI_MEMORY_TYPE type)791eee59048SToomas Soome efi_memory_type(EFI_MEMORY_TYPE type)
792eee59048SToomas Soome {
793eee59048SToomas Soome 	const char *types[] = {
794eee59048SToomas Soome 	    "Reserved",
795eee59048SToomas Soome 	    "LoaderCode",
796eee59048SToomas Soome 	    "LoaderData",
797eee59048SToomas Soome 	    "BootServicesCode",
798eee59048SToomas Soome 	    "BootServicesData",
799eee59048SToomas Soome 	    "RuntimeServicesCode",
800eee59048SToomas Soome 	    "RuntimeServicesData",
801eee59048SToomas Soome 	    "ConventionalMemory",
802eee59048SToomas Soome 	    "UnusableMemory",
803eee59048SToomas Soome 	    "ACPIReclaimMemory",
804eee59048SToomas Soome 	    "ACPIMemoryNVS",
805eee59048SToomas Soome 	    "MemoryMappedIO",
806eee59048SToomas Soome 	    "MemoryMappedIOPortSpace",
807eee59048SToomas Soome 	    "PalCode",
808eee59048SToomas Soome 	    "PersistentMemory"
809eee59048SToomas Soome 	};
8100e8ce6eeSToomas Soome 
811eee59048SToomas Soome 	switch (type) {
812eee59048SToomas Soome 	case EfiReservedMemoryType:
813eee59048SToomas Soome 	case EfiLoaderCode:
814eee59048SToomas Soome 	case EfiLoaderData:
815eee59048SToomas Soome 	case EfiBootServicesCode:
816eee59048SToomas Soome 	case EfiBootServicesData:
817eee59048SToomas Soome 	case EfiRuntimeServicesCode:
818eee59048SToomas Soome 	case EfiRuntimeServicesData:
819eee59048SToomas Soome 	case EfiConventionalMemory:
820eee59048SToomas Soome 	case EfiUnusableMemory:
821eee59048SToomas Soome 	case EfiACPIReclaimMemory:
822eee59048SToomas Soome 	case EfiACPIMemoryNVS:
823eee59048SToomas Soome 	case EfiMemoryMappedIO:
824eee59048SToomas Soome 	case EfiMemoryMappedIOPortSpace:
825eee59048SToomas Soome 	case EfiPalCode:
826eee59048SToomas Soome 	case EfiPersistentMemory:
827eee59048SToomas Soome 		return (types[type]);
8280e8ce6eeSToomas Soome 	default:
8290e8ce6eeSToomas Soome 		return ("Unknown");
830eee59048SToomas Soome 	}
831eee59048SToomas Soome }
832eee59048SToomas Soome 
833eee59048SToomas Soome /* Print memory type table. */
834eee59048SToomas Soome static int
efi_print_mem_type(const CHAR16 * varnamearg __unused,uint8_t * data,UINTN datasz)8358eef2ab6SToomas Soome efi_print_mem_type(const CHAR16 *varnamearg __unused, uint8_t *data,
8368eef2ab6SToomas Soome     UINTN datasz)
837eee59048SToomas Soome {
838eee59048SToomas Soome 	int i, n;
839eee59048SToomas Soome 	EFI_MEMORY_TYPE_INFORMATION *ti;
840eee59048SToomas Soome 
841eee59048SToomas Soome 	ti = (EFI_MEMORY_TYPE_INFORMATION *)data;
842eee59048SToomas Soome 	if (pager_output(" = \n"))
843eee59048SToomas Soome 		return (CMD_WARN);
844eee59048SToomas Soome 
845eee59048SToomas Soome 	n = datasz / sizeof (EFI_MEMORY_TYPE_INFORMATION);
846eee59048SToomas Soome 	for (i = 0; i < n && ti[i].NumberOfPages != 0; i++) {
847eee59048SToomas Soome 		printf("\t%23s pages: %u", efi_memory_type(ti[i].Type),
848eee59048SToomas Soome 		    ti[i].NumberOfPages);
849eee59048SToomas Soome 		if (pager_output("\n"))
850eee59048SToomas Soome 			return (CMD_WARN);
851eee59048SToomas Soome 	}
852eee59048SToomas Soome 
853eee59048SToomas Soome 	return (CMD_OK);
854eee59048SToomas Soome }
855eee59048SToomas Soome 
8568dff7262SToomas Soome /*
8578dff7262SToomas Soome  * Print illumos variables.
8588dff7262SToomas Soome  * We have LoaderPath and LoaderDev as CHAR16 strings.
8598dff7262SToomas Soome  */
860eee59048SToomas Soome static int
efi_print_illumos(const CHAR16 * varnamearg,uint8_t * data,UINTN datasz __unused)8618eef2ab6SToomas Soome efi_print_illumos(const CHAR16 *varnamearg, uint8_t *data,
8628eef2ab6SToomas Soome     UINTN datasz __unused)
863eee59048SToomas Soome {
864eee59048SToomas Soome 	int rv = -1;
8658dff7262SToomas Soome 	char *var = NULL;
8668dff7262SToomas Soome 
8678dff7262SToomas Soome 	if (ucs2_to_utf8(varnamearg, &var) != 0)
8688dff7262SToomas Soome 		return (CMD_ERROR);
8698dff7262SToomas Soome 
8708dff7262SToomas Soome 	if (strcmp("LoaderPath", var) == 0 ||
8718dff7262SToomas Soome 	    strcmp("LoaderDev", var) == 0) {
8728dff7262SToomas Soome 		printf(" = ");
8738dff7262SToomas Soome 		printf("%S", (CHAR16 *)data);
8748dff7262SToomas Soome 
8758dff7262SToomas Soome 		if (pager_output("\n"))
8768dff7262SToomas Soome 			rv = CMD_WARN;
8778dff7262SToomas Soome 		else
8788dff7262SToomas Soome 			rv = CMD_OK;
8798dff7262SToomas Soome 	}
880eee59048SToomas Soome 
8818dff7262SToomas Soome 	free(var);
8828dff7262SToomas Soome 	return (rv);
8838dff7262SToomas Soome }
884eee59048SToomas Soome 
8858dff7262SToomas Soome /* Print global variables. */
8868dff7262SToomas Soome static int
efi_print_global(const CHAR16 * varnamearg,uint8_t * data,UINTN datasz)8878dff7262SToomas Soome efi_print_global(const CHAR16 *varnamearg, uint8_t *data, UINTN datasz)
8888dff7262SToomas Soome {
8898dff7262SToomas Soome 	int rv = -1;
8908dff7262SToomas Soome 	char *var = NULL;
891eee59048SToomas Soome 
8928dff7262SToomas Soome 	if (ucs2_to_utf8(varnamearg, &var) != 0)
893eee59048SToomas Soome 		return (CMD_ERROR);
894eee59048SToomas Soome 
895eee59048SToomas Soome 	if (strcmp("AuditMode", var) == 0) {
896eee59048SToomas Soome 		printf(" = ");
897eee59048SToomas Soome 		printf("0x%x", *data);	/* 8-bit int */
898eee59048SToomas Soome 		goto done;
899eee59048SToomas Soome 	}
900eee59048SToomas Soome 
901eee59048SToomas Soome 	if (strcmp("BootOptionSupport", var) == 0) {
902eee59048SToomas Soome 		printf(" = ");
903eee59048SToomas Soome 		printf("0x%x", *((uint32_t *)data));	/* UINT32 */
904eee59048SToomas Soome 		goto done;
905eee59048SToomas Soome 	}
906eee59048SToomas Soome 
907eee59048SToomas Soome 	if (strcmp("BootCurrent", var) == 0 ||
908eee59048SToomas Soome 	    strcmp("BootNext", var) == 0 ||
909eee59048SToomas Soome 	    strcmp("Timeout", var) == 0) {
910eee59048SToomas Soome 		printf(" = ");
911eee59048SToomas Soome 		printf("%u", *((uint16_t *)data));	/* UINT16 */
912eee59048SToomas Soome 		goto done;
913eee59048SToomas Soome 	}
914eee59048SToomas Soome 
915eee59048SToomas Soome 	if (strcmp("BootOrder", var) == 0 ||
916eee59048SToomas Soome 	    strcmp("DriverOrder", var) == 0) {
917eee59048SToomas Soome 		int i;
918eee59048SToomas Soome 		UINT16 *u16 = (UINT16 *)data;
919eee59048SToomas Soome 
920eee59048SToomas Soome 		printf(" =");
921eee59048SToomas Soome 		for (i = 0; i < datasz / sizeof (UINT16); i++)
922eee59048SToomas Soome 			printf(" %u", u16[i]);
923eee59048SToomas Soome 		goto done;
924eee59048SToomas Soome 	}
925eee59048SToomas Soome 	if (strncmp("Boot", var, 4) == 0 ||
926eee59048SToomas Soome 	    strncmp("Driver", var, 5) == 0 ||
927eee59048SToomas Soome 	    strncmp("SysPrep", var, 7) == 0 ||
928eee59048SToomas Soome 	    strncmp("OsRecovery", var, 10) == 0) {
929eee59048SToomas Soome 		UINT16 filepathlistlen;
930eee59048SToomas Soome 		CHAR16 *text;
931eee59048SToomas Soome 		int desclen;
932eee59048SToomas Soome 		EFI_DEVICE_PATH *dp;
933eee59048SToomas Soome 
934*f334afcfSToomas Soome 		data += sizeof (UINT32);
935eee59048SToomas Soome 		filepathlistlen = *(uint16_t *)data;
936eee59048SToomas Soome 		data += sizeof (UINT16);
937eee59048SToomas Soome 		text = (CHAR16 *)data;
938eee59048SToomas Soome 
939eee59048SToomas Soome 		for (desclen = 0; text[desclen] != 0; desclen++)
940eee59048SToomas Soome 			;
941eee59048SToomas Soome 		if (desclen != 0) {
942eee59048SToomas Soome 			/* Add terminating zero and we have CHAR16. */
943eee59048SToomas Soome 			desclen = (desclen + 1) * 2;
944eee59048SToomas Soome 		}
945eee59048SToomas Soome 
946eee59048SToomas Soome 		printf(" = ");
947eee59048SToomas Soome 		printf("%S", text);
948eee59048SToomas Soome 		if (filepathlistlen != 0) {
949eee59048SToomas Soome 			/* Output pathname from new line. */
950eee59048SToomas Soome 			if (pager_output("\n")) {
951eee59048SToomas Soome 				rv = CMD_WARN;
952eee59048SToomas Soome 				goto done;
953eee59048SToomas Soome 			}
954eee59048SToomas Soome 			dp = malloc(filepathlistlen);
955eee59048SToomas Soome 			if (dp == NULL)
956eee59048SToomas Soome 				goto done;
957eee59048SToomas Soome 
958eee59048SToomas Soome 			memcpy(dp, data + desclen, filepathlistlen);
959eee59048SToomas Soome 			text = efi_devpath_name(dp);
960eee59048SToomas Soome 			if (text != NULL) {
961eee59048SToomas Soome 				printf("\t%S", text);
962eee59048SToomas Soome 				efi_free_devpath_name(text);
963eee59048SToomas Soome 			}
964eee59048SToomas Soome 			free(dp);
965eee59048SToomas Soome 		}
966eee59048SToomas Soome 		goto done;
967eee59048SToomas Soome 	}
968eee59048SToomas Soome 
969eee59048SToomas Soome 	if (strcmp("ConIn", var) == 0 ||
970eee59048SToomas Soome 	    strcmp("ConInDev", var) == 0 ||
971eee59048SToomas Soome 	    strcmp("ConOut", var) == 0 ||
972eee59048SToomas Soome 	    strcmp("ConOutDev", var) == 0 ||
973eee59048SToomas Soome 	    strcmp("ErrOut", var) == 0 ||
974eee59048SToomas Soome 	    strcmp("ErrOutDev", var) == 0) {
975eee59048SToomas Soome 		CHAR16 *text;
976eee59048SToomas Soome 
977eee59048SToomas Soome 		printf(" = ");
978eee59048SToomas Soome 		text = efi_devpath_name((EFI_DEVICE_PATH *)data);
979eee59048SToomas Soome 		if (text != NULL) {
980eee59048SToomas Soome 			printf("%S", text);
981eee59048SToomas Soome 			efi_free_devpath_name(text);
982eee59048SToomas Soome 		}
983eee59048SToomas Soome 		goto done;
984eee59048SToomas Soome 	}
985eee59048SToomas Soome 
986eee59048SToomas Soome 	if (strcmp("PlatformLang", var) == 0 ||
987eee59048SToomas Soome 	    strcmp("PlatformLangCodes", var) == 0 ||
988eee59048SToomas Soome 	    strcmp("LangCodes", var) == 0 ||
989eee59048SToomas Soome 	    strcmp("Lang", var) == 0) {
990eee59048SToomas Soome 		printf(" = ");
991eee59048SToomas Soome 		printf("%s", data);	/* ASCII string */
992eee59048SToomas Soome 		goto done;
993eee59048SToomas Soome 	}
994eee59048SToomas Soome 
995eee59048SToomas Soome 	/*
996eee59048SToomas Soome 	 * Feature bitmap from firmware to OS.
997eee59048SToomas Soome 	 * Older UEFI provides UINT32, newer UINT64.
998eee59048SToomas Soome 	 */
999eee59048SToomas Soome 	if (strcmp("OsIndicationsSupported", var) == 0) {
1000eee59048SToomas Soome 		printf(" = ");
1001eee59048SToomas Soome 		if (datasz == 4)
1002eee59048SToomas Soome 			printf("0x%x", *((uint32_t *)data));
1003eee59048SToomas Soome 		else
1004eee59048SToomas Soome 			printf("0x%jx", *((uint64_t *)data));
1005eee59048SToomas Soome 		goto done;
1006eee59048SToomas Soome 	}
1007eee59048SToomas Soome 
1008eee59048SToomas Soome 	/* Fallback for anything else. */
1009eee59048SToomas Soome 	rv = efi_print_other_value(data, datasz);
1010eee59048SToomas Soome done:
1011eee59048SToomas Soome 	if (rv == -1) {
1012eee59048SToomas Soome 		if (pager_output("\n"))
1013eee59048SToomas Soome 			rv = CMD_WARN;
1014eee59048SToomas Soome 		else
1015eee59048SToomas Soome 			rv = CMD_OK;
1016eee59048SToomas Soome 	}
1017eee59048SToomas Soome 	free(var);
1018eee59048SToomas Soome 	return (rv);
1019eee59048SToomas Soome }
1020eee59048SToomas Soome 
1021eee59048SToomas Soome static void
efi_print_var_attr(UINT32 attr)1022eee59048SToomas Soome efi_print_var_attr(UINT32 attr)
1023eee59048SToomas Soome {
1024eee59048SToomas Soome 	bool comma = false;
1025eee59048SToomas Soome 
1026eee59048SToomas Soome 	if (attr & EFI_VARIABLE_NON_VOLATILE) {
1027eee59048SToomas Soome 		printf("NV");
1028eee59048SToomas Soome 		comma = true;
1029eee59048SToomas Soome 	}
1030eee59048SToomas Soome 	if (attr & EFI_VARIABLE_BOOTSERVICE_ACCESS) {
1031eee59048SToomas Soome 		if (comma == true)
1032eee59048SToomas Soome 			printf(",");
1033eee59048SToomas Soome 		printf("BS");
1034eee59048SToomas Soome 		comma = true;
1035eee59048SToomas Soome 	}
1036eee59048SToomas Soome 	if (attr & EFI_VARIABLE_RUNTIME_ACCESS) {
1037eee59048SToomas Soome 		if (comma == true)
1038eee59048SToomas Soome 			printf(",");
1039eee59048SToomas Soome 		printf("RS");
1040eee59048SToomas Soome 		comma = true;
1041eee59048SToomas Soome 	}
1042eee59048SToomas Soome 	if (attr & EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
1043eee59048SToomas Soome 		if (comma == true)
1044eee59048SToomas Soome 			printf(",");
1045eee59048SToomas Soome 		printf("HR");
1046eee59048SToomas Soome 		comma = true;
1047eee59048SToomas Soome 	}
1048eee59048SToomas Soome 	if (attr & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) {
1049eee59048SToomas Soome 		if (comma == true)
1050eee59048SToomas Soome 			printf(",");
1051eee59048SToomas Soome 		printf("AT");
1052eee59048SToomas Soome 		comma = true;
1053eee59048SToomas Soome 	}
1054eee59048SToomas Soome }
1055eee59048SToomas Soome 
1056eee59048SToomas Soome static int
efi_print_var(CHAR16 * varnamearg,EFI_GUID * matchguid,int lflag)1057eee59048SToomas Soome efi_print_var(CHAR16 *varnamearg, EFI_GUID *matchguid, int lflag)
1058eee59048SToomas Soome {
1059eee59048SToomas Soome 	UINTN		datasz;
1060eee59048SToomas Soome 	EFI_STATUS	status;
1061eee59048SToomas Soome 	UINT32		attr;
106214634113SToomas Soome 	char		*str;
106314634113SToomas Soome 	uint8_t		*data;
1064eee59048SToomas Soome 	int		rv = CMD_OK;
1065eee59048SToomas Soome 
1066eee59048SToomas Soome 	str = NULL;
1067eee59048SToomas Soome 	datasz = 0;
1068911abd25SToomas Soome 	status = RS->GetVariable(varnamearg, matchguid, &attr, &datasz, NULL);
1069eee59048SToomas Soome 	if (status != EFI_BUFFER_TOO_SMALL) {
1070eee59048SToomas Soome 		printf("Can't get the variable: error %#lx\n",
1071*f334afcfSToomas Soome 		    DECODE_ERROR(status));
1072eee59048SToomas Soome 		return (CMD_ERROR);
1073eee59048SToomas Soome 	}
1074eee59048SToomas Soome 	data = malloc(datasz);
1075eee59048SToomas Soome 	if (data == NULL) {
1076eee59048SToomas Soome 		printf("Out of memory\n");
1077eee59048SToomas Soome 		return (CMD_ERROR);
1078eee59048SToomas Soome 	}
1079eee59048SToomas Soome 
1080911abd25SToomas Soome 	status = RS->GetVariable(varnamearg, matchguid, &attr, &datasz, data);
1081eee59048SToomas Soome 	if (status != EFI_SUCCESS) {
1082eee59048SToomas Soome 		printf("Can't get the variable: error %#lx\n",
1083*f334afcfSToomas Soome 		    DECODE_ERROR(status));
1084eee59048SToomas Soome 		free(data);
1085eee59048SToomas Soome 		return (CMD_ERROR);
1086eee59048SToomas Soome 	}
1087eee59048SToomas Soome 
1088eee59048SToomas Soome 	if (efi_guid_to_name(matchguid, &str) == false) {
1089eee59048SToomas Soome 		rv = CMD_ERROR;
1090eee59048SToomas Soome 		goto done;
1091eee59048SToomas Soome 	}
1092eee59048SToomas Soome 	printf("%s ", str);
1093eee59048SToomas Soome 	efi_print_var_attr(attr);
1094eee59048SToomas Soome 	printf(" %S", varnamearg);
1095eee59048SToomas Soome 
1096eee59048SToomas Soome 	if (lflag == 0) {
1097eee59048SToomas Soome 		if (strcmp(str, "global") == 0)
1098eee59048SToomas Soome 			rv = efi_print_global(varnamearg, data, datasz);
10998dff7262SToomas Soome 		else if (strcmp(str, "illumos") == 0)
11008dff7262SToomas Soome 			rv = efi_print_illumos(varnamearg, data, datasz);
1101eee59048SToomas Soome 		else if (strcmp(str,
1102eee59048SToomas Soome 		    EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME) == 0)
1103eee59048SToomas Soome 			rv = efi_print_mem_type(varnamearg, data, datasz);
1104eee59048SToomas Soome 		else if (strcmp(str,
1105eee59048SToomas Soome 		    "47c7b227-c42a-11d2-8e57-00a0c969723b") == 0)
1106eee59048SToomas Soome 			rv = efi_print_shell_str(varnamearg, data, datasz);
1107eee59048SToomas Soome 		else if (strcmp(str, MTC_VARIABLE_NAME) == 0) {
1108eee59048SToomas Soome 			printf(" = ");
1109eee59048SToomas Soome 			printf("%u", *((uint32_t *)data));	/* UINT32 */
1110eee59048SToomas Soome 			rv = CMD_OK;
1111eee59048SToomas Soome 			if (pager_output("\n"))
1112eee59048SToomas Soome 				rv = CMD_WARN;
1113eee59048SToomas Soome 		} else
1114eee59048SToomas Soome 			rv = efi_print_other_value(data, datasz);
1115eee59048SToomas Soome 	} else if (pager_output("\n"))
1116eee59048SToomas Soome 		rv =  CMD_WARN;
1117eee59048SToomas Soome 
1118eee59048SToomas Soome done:
1119eee59048SToomas Soome 	free(str);
1120eee59048SToomas Soome 	free(data);
1121eee59048SToomas Soome 	return (rv);
1122eee59048SToomas Soome }
1123eee59048SToomas Soome 
1124eee59048SToomas Soome static int
command_efi_show(int argc,char * argv[])1125eee59048SToomas Soome command_efi_show(int argc, char *argv[])
1126eee59048SToomas Soome {
1127eee59048SToomas Soome 	/*
1128eee59048SToomas Soome 	 * efi-show [-a]
1129eee59048SToomas Soome 	 *	print all the env
1130eee59048SToomas Soome 	 * efi-show -g UUID
1131eee59048SToomas Soome 	 *	print all the env vars tagged with UUID
1132eee59048SToomas Soome 	 * efi-show -v var
1133eee59048SToomas Soome 	 *	search all the env vars and print the ones matching var
11345882b622SToomas Soome 	 * efi-show -g UUID -v var
11355882b622SToomas Soome 	 * efi-show UUID var
1136eee59048SToomas Soome 	 *	print all the env vars that match UUID and var
1137eee59048SToomas Soome 	 */
1138eee59048SToomas Soome 	/* NB: We assume EFI_GUID is the same as uuid_t */
1139eee59048SToomas Soome 	int		aflag = 0, gflag = 0, lflag = 0, vflag = 0;
1140eee59048SToomas Soome 	int		ch, rv;
1141eee59048SToomas Soome 	unsigned	i;
1142eee59048SToomas Soome 	EFI_STATUS	status;
1143eee59048SToomas Soome 	EFI_GUID	varguid = ZERO_GUID;
1144eee59048SToomas Soome 	EFI_GUID	matchguid = ZERO_GUID;
1145eee59048SToomas Soome 	CHAR16		*varname;
1146eee59048SToomas Soome 	CHAR16		*newnm;
1147eee59048SToomas Soome 	CHAR16		varnamearg[128];
1148eee59048SToomas Soome 	UINTN		varalloc;
1149eee59048SToomas Soome 	UINTN		varsz;
1150eee59048SToomas Soome 
1151eee59048SToomas Soome 	optind = 1;
1152eee59048SToomas Soome 	optreset = 1;
1153eee59048SToomas Soome 	opterr = 1;
1154eee59048SToomas Soome 
1155eee59048SToomas Soome 	while ((ch = getopt(argc, argv, "ag:lv:")) != -1) {
1156eee59048SToomas Soome 		switch (ch) {
1157eee59048SToomas Soome 		case 'a':
1158eee59048SToomas Soome 			aflag = 1;
1159eee59048SToomas Soome 			break;
1160eee59048SToomas Soome 		case 'g':
1161eee59048SToomas Soome 			gflag = 1;
1162eee59048SToomas Soome 			if (efi_name_to_guid(optarg, &matchguid) == false) {
1163eee59048SToomas Soome 				printf("uuid %s could not be parsed\n", optarg);
1164eee59048SToomas Soome 				return (CMD_ERROR);
1165eee59048SToomas Soome 			}
1166eee59048SToomas Soome 			break;
1167eee59048SToomas Soome 		case 'l':
1168eee59048SToomas Soome 			lflag = 1;
1169eee59048SToomas Soome 			break;
1170eee59048SToomas Soome 		case 'v':
1171eee59048SToomas Soome 			vflag = 1;
1172eee59048SToomas Soome 			if (strlen(optarg) >= nitems(varnamearg)) {
11732b811402SToomas Soome 				printf("Variable %s is longer than %zu "
1174eee59048SToomas Soome 				    "characters\n", optarg, nitems(varnamearg));
1175eee59048SToomas Soome 				return (CMD_ERROR);
1176eee59048SToomas Soome 			}
1177eee59048SToomas Soome 			cpy8to16(optarg, varnamearg, nitems(varnamearg));
1178eee59048SToomas Soome 			break;
1179eee59048SToomas Soome 		default:
1180eee59048SToomas Soome 			return (CMD_ERROR);
1181eee59048SToomas Soome 		}
1182eee59048SToomas Soome 	}
1183eee59048SToomas Soome 
1184eee59048SToomas Soome 	if (argc == 1)		/* default is -a */
1185eee59048SToomas Soome 		aflag = 1;
1186eee59048SToomas Soome 
1187eee59048SToomas Soome 	if (aflag && (gflag || vflag)) {
1188eee59048SToomas Soome 		printf("-a isn't compatible with -g or -v\n");
1189eee59048SToomas Soome 		return (CMD_ERROR);
1190eee59048SToomas Soome 	}
1191eee59048SToomas Soome 
1192eee59048SToomas Soome 	if (aflag && optind < argc) {
1193eee59048SToomas Soome 		printf("-a doesn't take any args\n");
1194eee59048SToomas Soome 		return (CMD_ERROR);
1195eee59048SToomas Soome 	}
1196eee59048SToomas Soome 
1197eee59048SToomas Soome 	argc -= optind;
1198eee59048SToomas Soome 	argv += optind;
1199eee59048SToomas Soome 
1200eee59048SToomas Soome 	pager_open();
1201eee59048SToomas Soome 	if (vflag && gflag) {
1202eee59048SToomas Soome 		rv = efi_print_var(varnamearg, &matchguid, lflag);
1203eee59048SToomas Soome 		if (rv == CMD_WARN)
1204eee59048SToomas Soome 			rv = CMD_OK;
1205eee59048SToomas Soome 		pager_close();
1206eee59048SToomas Soome 		return (rv);
1207eee59048SToomas Soome 	}
1208eee59048SToomas Soome 
1209eee59048SToomas Soome 	if (argc == 2) {
1210eee59048SToomas Soome 		optarg = argv[0];
1211eee59048SToomas Soome 		if (strlen(optarg) >= nitems(varnamearg)) {
12122b811402SToomas Soome 			printf("Variable %s is longer than %zu characters\n",
1213eee59048SToomas Soome 			    optarg, nitems(varnamearg));
1214eee59048SToomas Soome 			pager_close();
1215eee59048SToomas Soome 			return (CMD_ERROR);
1216eee59048SToomas Soome 		}
1217eee59048SToomas Soome 		for (i = 0; i < strlen(optarg); i++)
1218eee59048SToomas Soome 			varnamearg[i] = optarg[i];
1219eee59048SToomas Soome 		varnamearg[i] = 0;
1220eee59048SToomas Soome 		optarg = argv[1];
1221eee59048SToomas Soome 		if (efi_name_to_guid(optarg, &matchguid) == false) {
1222eee59048SToomas Soome 			printf("uuid %s could not be parsed\n", optarg);
1223eee59048SToomas Soome 			pager_close();
1224eee59048SToomas Soome 			return (CMD_ERROR);
1225eee59048SToomas Soome 		}
1226eee59048SToomas Soome 		rv = efi_print_var(varnamearg, &matchguid, lflag);
1227eee59048SToomas Soome 		if (rv == CMD_WARN)
1228eee59048SToomas Soome 			rv = CMD_OK;
1229eee59048SToomas Soome 		pager_close();
1230eee59048SToomas Soome 		return (rv);
1231eee59048SToomas Soome 	}
1232eee59048SToomas Soome 
1233eee59048SToomas Soome 	if (argc > 0) {
1234eee59048SToomas Soome 		printf("Too many args: %d\n", argc);
1235eee59048SToomas Soome 		pager_close();
1236eee59048SToomas Soome 		return (CMD_ERROR);
1237eee59048SToomas Soome 	}
1238eee59048SToomas Soome 
1239eee59048SToomas Soome 	/*
1240eee59048SToomas Soome 	 * Initiate the search -- note the standard takes pain
1241eee59048SToomas Soome 	 * to specify the initial call must be a poiner to a NULL
1242eee59048SToomas Soome 	 * character.
1243eee59048SToomas Soome 	 */
1244eee59048SToomas Soome 	varalloc = 1024;
1245eee59048SToomas Soome 	varname = malloc(varalloc);
1246eee59048SToomas Soome 	if (varname == NULL) {
1247eee59048SToomas Soome 		printf("Can't allocate memory to get variables\n");
1248eee59048SToomas Soome 		pager_close();
1249eee59048SToomas Soome 		return (CMD_ERROR);
1250eee59048SToomas Soome 	}
1251eee59048SToomas Soome 	varname[0] = 0;
1252eee59048SToomas Soome 	while (1) {
1253eee59048SToomas Soome 		varsz = varalloc;
1254911abd25SToomas Soome 		status = RS->GetNextVariableName(&varsz, varname, &varguid);
1255eee59048SToomas Soome 		if (status == EFI_BUFFER_TOO_SMALL) {
1256eee59048SToomas Soome 			varalloc = varsz;
1257eee59048SToomas Soome 			newnm = realloc(varname, varalloc);
1258eee59048SToomas Soome 			if (newnm == NULL) {
1259eee59048SToomas Soome 				printf("Can't allocate memory to get "
1260eee59048SToomas Soome 				    "variables\n");
1261eee59048SToomas Soome 				rv = CMD_ERROR;
1262eee59048SToomas Soome 				break;
1263eee59048SToomas Soome 			}
1264eee59048SToomas Soome 			varname = newnm;
1265eee59048SToomas Soome 			continue; /* Try again with bigger buffer */
1266eee59048SToomas Soome 		}
1267eee59048SToomas Soome 		if (status == EFI_NOT_FOUND) {
1268eee59048SToomas Soome 			rv = CMD_OK;
1269eee59048SToomas Soome 			break;
1270eee59048SToomas Soome 		}
1271eee59048SToomas Soome 		if (status != EFI_SUCCESS) {
1272eee59048SToomas Soome 			rv = CMD_ERROR;
1273eee59048SToomas Soome 			break;
1274eee59048SToomas Soome 		}
1275eee59048SToomas Soome 
1276eee59048SToomas Soome 		if (aflag) {
1277eee59048SToomas Soome 			rv = efi_print_var(varname, &varguid, lflag);
1278eee59048SToomas Soome 			if (rv != CMD_OK) {
1279eee59048SToomas Soome 				if (rv == CMD_WARN)
1280eee59048SToomas Soome 					rv = CMD_OK;
1281eee59048SToomas Soome 				break;
1282eee59048SToomas Soome 			}
1283eee59048SToomas Soome 			continue;
1284eee59048SToomas Soome 		}
1285eee59048SToomas Soome 		if (vflag) {
1286eee59048SToomas Soome 			if (wcscmp(varnamearg, varname) == 0) {
1287eee59048SToomas Soome 				rv = efi_print_var(varname, &varguid, lflag);
1288eee59048SToomas Soome 				if (rv != CMD_OK) {
1289eee59048SToomas Soome 					if (rv == CMD_WARN)
1290eee59048SToomas Soome 						rv = CMD_OK;
1291eee59048SToomas Soome 					break;
1292eee59048SToomas Soome 				}
1293eee59048SToomas Soome 				continue;
1294eee59048SToomas Soome 			}
1295eee59048SToomas Soome 		}
1296eee59048SToomas Soome 		if (gflag) {
1297eee59048SToomas Soome 			rv = uuid_equal((uuid_t *)&varguid,
1298eee59048SToomas Soome 			    (uuid_t *)&matchguid, NULL);
1299eee59048SToomas Soome 			if (rv != 0) {
1300eee59048SToomas Soome 				rv = efi_print_var(varname, &varguid, lflag);
1301eee59048SToomas Soome 				if (rv != CMD_OK) {
1302eee59048SToomas Soome 					if (rv == CMD_WARN)
1303eee59048SToomas Soome 						rv = CMD_OK;
1304eee59048SToomas Soome 					break;
1305eee59048SToomas Soome 				}
1306eee59048SToomas Soome 				continue;
1307eee59048SToomas Soome 			}
1308eee59048SToomas Soome 		}
1309eee59048SToomas Soome 	}
1310eee59048SToomas Soome 	free(varname);
1311eee59048SToomas Soome 	pager_close();
1312eee59048SToomas Soome 
1313eee59048SToomas Soome 	return (rv);
1314eee59048SToomas Soome }
1315eee59048SToomas Soome 
1316eee59048SToomas Soome COMMAND_SET(efiset, "efi-set", "set EFI variables", command_efi_set);
1317eee59048SToomas Soome 
1318eee59048SToomas Soome static int
command_efi_set(int argc,char * argv[])1319eee59048SToomas Soome command_efi_set(int argc, char *argv[])
1320eee59048SToomas Soome {
1321eee59048SToomas Soome 	char *uuid, *var, *val;
1322eee59048SToomas Soome 	CHAR16 wvar[128];
1323eee59048SToomas Soome 	EFI_GUID guid;
13242b811402SToomas Soome #if defined(ENABLE_UPDATES)
1325eee59048SToomas Soome 	EFI_STATUS err;
13262b811402SToomas Soome #endif
1327eee59048SToomas Soome 
1328eee59048SToomas Soome 	if (argc != 4) {
1329eee59048SToomas Soome 		printf("efi-set uuid var new-value\n");
1330eee59048SToomas Soome 		return (CMD_ERROR);
1331eee59048SToomas Soome 	}
1332eee59048SToomas Soome 	uuid = argv[1];
1333eee59048SToomas Soome 	var = argv[2];
1334eee59048SToomas Soome 	val = argv[3];
1335eee59048SToomas Soome 	if (efi_name_to_guid(uuid, &guid) == false) {
1336eee59048SToomas Soome 		printf("Invalid uuid %s\n", uuid);
1337eee59048SToomas Soome 		return (CMD_ERROR);
1338eee59048SToomas Soome 	}
1339eee59048SToomas Soome 	cpy8to16(var, wvar, nitems(wvar));
13402b811402SToomas Soome #if defined(ENABLE_UPDATES)
1341911abd25SToomas Soome 	err = RS->SetVariable(wvar, &guid, EFI_VARIABLE_NON_VOLATILE |
1342eee59048SToomas Soome 	    EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
1343eee59048SToomas Soome 	    strlen(val) + 1, val);
1344eee59048SToomas Soome 	if (EFI_ERROR(err)) {
1345eee59048SToomas Soome 		printf("Failed to set variable: error %lu\n",
1346*f334afcfSToomas Soome 		    DECODE_ERROR(err));
1347eee59048SToomas Soome 		return (CMD_ERROR);
1348eee59048SToomas Soome 	}
1349eee59048SToomas Soome #else
1350eee59048SToomas Soome 	printf("would set %s %s = %s\n", uuid, var, val);
1351eee59048SToomas Soome #endif
1352eee59048SToomas Soome 	return (CMD_OK);
1353eee59048SToomas Soome }
1354eee59048SToomas Soome 
1355*f334afcfSToomas Soome COMMAND_SET(efiunset, "efi-unset", "delete / unset EFI variables",
1356*f334afcfSToomas Soome     command_efi_unset);
1357eee59048SToomas Soome 
1358eee59048SToomas Soome static int
command_efi_unset(int argc,char * argv[])1359eee59048SToomas Soome command_efi_unset(int argc, char *argv[])
1360eee59048SToomas Soome {
1361eee59048SToomas Soome 	char *uuid, *var;
1362eee59048SToomas Soome 	CHAR16 wvar[128];
1363eee59048SToomas Soome 	EFI_GUID guid;
13642b811402SToomas Soome #if defined(ENABLE_UPDATES)
1365eee59048SToomas Soome 	EFI_STATUS err;
13662b811402SToomas Soome #endif
1367eee59048SToomas Soome 
1368eee59048SToomas Soome 	if (argc != 3) {
1369eee59048SToomas Soome 		printf("efi-unset uuid var\n");
1370eee59048SToomas Soome 		return (CMD_ERROR);
1371eee59048SToomas Soome 	}
1372eee59048SToomas Soome 	uuid = argv[1];
1373eee59048SToomas Soome 	var = argv[2];
1374eee59048SToomas Soome 	if (efi_name_to_guid(uuid, &guid) == false) {
1375eee59048SToomas Soome 		printf("Invalid uuid %s\n", uuid);
1376eee59048SToomas Soome 		return (CMD_ERROR);
1377eee59048SToomas Soome 	}
1378eee59048SToomas Soome 	cpy8to16(var, wvar, nitems(wvar));
13792b811402SToomas Soome #if defined(ENABLE_UPDATES)
1380911abd25SToomas Soome 	err = RS->SetVariable(wvar, &guid, 0, 0, NULL);
1381eee59048SToomas Soome 	if (EFI_ERROR(err)) {
1382eee59048SToomas Soome 		printf("Failed to unset variable: error %lu\n",
1383*f334afcfSToomas Soome 		    DECODE_ERROR(err));
1384eee59048SToomas Soome 		return (CMD_ERROR);
1385eee59048SToomas Soome 	}
1386eee59048SToomas Soome #else
1387eee59048SToomas Soome 	printf("would unset %s %s \n", uuid, var);
1388eee59048SToomas Soome #endif
1389eee59048SToomas Soome 	return (CMD_OK);
1390eee59048SToomas Soome }
1391eee59048SToomas Soome 
1392eee59048SToomas Soome /*
1393eee59048SToomas Soome  * Loader interaction words and extras
1394eee59048SToomas Soome  *
1395911abd25SToomas Soome  *	efi-setenv  ( value n name n guid n attr -- 0 | -1)
1396911abd25SToomas Soome  *	efi-getenv  ( guid n addr n -- addr' n' | -1 )
1397911abd25SToomas Soome  *	efi-unsetenv ( name n guid n'' -- )
1398eee59048SToomas Soome  */
1399eee59048SToomas Soome 
1400eee59048SToomas Soome /*
1401eee59048SToomas Soome  * efi-setenv
1402911abd25SToomas Soome  *	efi-setenv  ( value n name n guid n attr -- 0 | -1)
1403eee59048SToomas Soome  *
1404eee59048SToomas Soome  * Set environment variables using the SetVariable EFI runtime service.
1405eee59048SToomas Soome  *
1406eee59048SToomas Soome  * Value and guid are passed through in binary form (so guid needs to be
1407eee59048SToomas Soome  * converted to binary form from its string form). Name is converted from
1408eee59048SToomas Soome  * ASCII to CHAR16. Since ficl doesn't have support for internationalization,
1409eee59048SToomas Soome  * there's no native CHAR16 interface provided.
1410eee59048SToomas Soome  *
1411eee59048SToomas Soome  * attr is an int in the bitmask of the following attributes for this variable.
1412eee59048SToomas Soome  *
1413eee59048SToomas Soome  *	1	Non volatile
1414eee59048SToomas Soome  *	2	Boot service access
1415eee59048SToomas Soome  *	4	Run time access
1416eee59048SToomas Soome  * (corresponding to the same bits in the UEFI spec).
1417eee59048SToomas Soome  */
1418eee59048SToomas Soome static void
ficlEfiSetenv(ficlVm * pVM)1419eee59048SToomas Soome ficlEfiSetenv(ficlVm *pVM)
1420eee59048SToomas Soome {
1421eee59048SToomas Soome 	char	*value = NULL, *guid = NULL;
1422eee59048SToomas Soome 	CHAR16	*name = NULL;
1423eee59048SToomas Soome 	int	i;
1424eee59048SToomas Soome 	char	*namep, *valuep, *guidp;
1425eee59048SToomas Soome 	int	names, values, guids, attr;
1426eee59048SToomas Soome 	EFI_STATUS status;
1427eee59048SToomas Soome 	uuid_t	u;
1428eee59048SToomas Soome 	uint32_t ustatus;
1429eee59048SToomas Soome 	char	*error = NULL;
1430eee59048SToomas Soome 	ficlStack *pStack = ficlVmGetDataStack(pVM);
1431eee59048SToomas Soome 
1432eee59048SToomas Soome 	FICL_STACK_CHECK(pStack, 6, 0);
1433eee59048SToomas Soome 
1434eee59048SToomas Soome 	attr = ficlStackPopInteger(pStack);
1435eee59048SToomas Soome 	guids = ficlStackPopInteger(pStack);
1436*f334afcfSToomas Soome 	guidp = (char *)ficlStackPopPointer(pStack);
1437eee59048SToomas Soome 	names = ficlStackPopInteger(pStack);
1438*f334afcfSToomas Soome 	namep = (char *)ficlStackPopPointer(pStack);
1439eee59048SToomas Soome 	values = ficlStackPopInteger(pStack);
1440*f334afcfSToomas Soome 	valuep = (char *)ficlStackPopPointer(pStack);
1441eee59048SToomas Soome 
1442eee59048SToomas Soome 	guid = ficlMalloc(guids);
1443eee59048SToomas Soome 	if (guid == NULL)
1444eee59048SToomas Soome 		goto out;
1445eee59048SToomas Soome 	memcpy(guid, guidp, guids);
1446eee59048SToomas Soome 	uuid_from_string(guid, &u, &ustatus);
1447eee59048SToomas Soome 	if (ustatus != uuid_s_ok) {
1448eee59048SToomas Soome 		switch (ustatus) {
1449eee59048SToomas Soome 		case uuid_s_bad_version:
1450eee59048SToomas Soome 			error = "uuid: bad string";
1451eee59048SToomas Soome 			break;
1452eee59048SToomas Soome 		case uuid_s_invalid_string_uuid:
1453eee59048SToomas Soome 			error = "uuid: invalid string";
1454eee59048SToomas Soome 			break;
1455eee59048SToomas Soome 		case uuid_s_no_memory:
1456eee59048SToomas Soome 			error = "Out of memory";
1457eee59048SToomas Soome 			break;
1458eee59048SToomas Soome 		default:
1459eee59048SToomas Soome 			error = "uuid: Unknown error";
1460eee59048SToomas Soome 			break;
1461eee59048SToomas Soome 		}
1462eee59048SToomas Soome 		ficlStackPushInteger(pStack, -1);
1463eee59048SToomas Soome 		goto out;
1464eee59048SToomas Soome 	}
1465eee59048SToomas Soome 
1466eee59048SToomas Soome 	name = ficlMalloc((names + 1) * sizeof (CHAR16));
1467eee59048SToomas Soome 	if (name == NULL) {
1468eee59048SToomas Soome 		error = "Out of memory";
1469eee59048SToomas Soome 		goto out;
1470eee59048SToomas Soome 	}
1471eee59048SToomas Soome 	for (i = 0; i < names; i++)
1472eee59048SToomas Soome 		name[i] = namep[i];
1473eee59048SToomas Soome 	name[names] = 0;
1474eee59048SToomas Soome 
1475eee59048SToomas Soome 	value = ficlMalloc(values + 1);
1476eee59048SToomas Soome 	if (value == NULL) {
1477eee59048SToomas Soome 		error = "Out of memory";
1478eee59048SToomas Soome 		goto out;
1479eee59048SToomas Soome 	}
1480eee59048SToomas Soome 	memcpy(value, valuep, values);
1481eee59048SToomas Soome 
1482911abd25SToomas Soome 	status = RS->SetVariable(name, (EFI_GUID *)&u, attr, values, value);
1483eee59048SToomas Soome 	if (status == EFI_SUCCESS) {
1484eee59048SToomas Soome 		ficlStackPushInteger(pStack, 0);
1485eee59048SToomas Soome 	} else {
1486eee59048SToomas Soome 		ficlStackPushInteger(pStack, -1);
1487911abd25SToomas Soome 		error = "Error: SetVariable failed";
1488eee59048SToomas Soome 	}
1489eee59048SToomas Soome 
1490eee59048SToomas Soome out:
1491eee59048SToomas Soome 	ficlFree(name);
1492eee59048SToomas Soome 	ficlFree(value);
1493eee59048SToomas Soome 	ficlFree(guid);
1494eee59048SToomas Soome 	if (error != NULL)
1495eee59048SToomas Soome 		ficlVmThrowError(pVM, error);
1496eee59048SToomas Soome }
1497eee59048SToomas Soome 
1498eee59048SToomas Soome static void
ficlEfiGetenv(ficlVm * pVM)1499eee59048SToomas Soome ficlEfiGetenv(ficlVm *pVM)
1500eee59048SToomas Soome {
1501eee59048SToomas Soome 	char	*name, *value;
1502eee59048SToomas Soome 	char	*namep;
1503eee59048SToomas Soome 	int	names;
1504eee59048SToomas Soome 
1505eee59048SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 2);
1506eee59048SToomas Soome 
1507eee59048SToomas Soome 	names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
1508*f334afcfSToomas Soome 	namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
1509eee59048SToomas Soome 
1510eee59048SToomas Soome 	name = ficlMalloc(names+1);
1511eee59048SToomas Soome 	if (name == NULL)
1512eee59048SToomas Soome 		ficlVmThrowError(pVM, "Error: out of memory");
1513eee59048SToomas Soome 	strncpy(name, namep, names);
1514eee59048SToomas Soome 	name[names] = '\0';
1515eee59048SToomas Soome 
1516eee59048SToomas Soome 	value = getenv(name);
1517eee59048SToomas Soome 	ficlFree(name);
1518eee59048SToomas Soome 
1519*f334afcfSToomas Soome 	if (value != NULL) {
1520eee59048SToomas Soome 		ficlStackPushPointer(ficlVmGetDataStack(pVM), value);
1521eee59048SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), strlen(value));
1522eee59048SToomas Soome 	} else {
1523eee59048SToomas Soome 		ficlStackPushInteger(ficlVmGetDataStack(pVM), -1);
1524eee59048SToomas Soome 	}
1525eee59048SToomas Soome }
1526eee59048SToomas Soome 
1527eee59048SToomas Soome static void
ficlEfiUnsetenv(ficlVm * pVM)1528eee59048SToomas Soome ficlEfiUnsetenv(ficlVm *pVM)
1529eee59048SToomas Soome {
1530eee59048SToomas Soome 	char	*name;
1531eee59048SToomas Soome 	char	*namep;
1532eee59048SToomas Soome 	int	names;
1533eee59048SToomas Soome 
1534eee59048SToomas Soome 	FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 0);
1535eee59048SToomas Soome 
1536eee59048SToomas Soome 	names = ficlStackPopInteger(ficlVmGetDataStack(pVM));
1537*f334afcfSToomas Soome 	namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
1538eee59048SToomas Soome 
1539eee59048SToomas Soome 	name = ficlMalloc(names+1);
1540eee59048SToomas Soome 	if (name == NULL)
1541eee59048SToomas Soome 		ficlVmThrowError(pVM, "Error: out of memory");
1542eee59048SToomas Soome 	strncpy(name, namep, names);
1543eee59048SToomas Soome 	name[names] = '\0';
1544eee59048SToomas Soome 
1545eee59048SToomas Soome 	unsetenv(name);
1546eee59048SToomas Soome 	ficlFree(name);
1547eee59048SToomas Soome }
1548eee59048SToomas Soome 
1549eee59048SToomas Soome /*
1550eee59048SToomas Soome  * Build platform extensions into the system dictionary
1551eee59048SToomas Soome  */
1552eee59048SToomas Soome static void
ficlEfiCompilePlatform(ficlSystem * pSys)1553eee59048SToomas Soome ficlEfiCompilePlatform(ficlSystem *pSys)
1554eee59048SToomas Soome {
1555eee59048SToomas Soome 	ficlDictionary *dp = ficlSystemGetDictionary(pSys);
1556eee59048SToomas Soome 
1557eee59048SToomas Soome 	FICL_SYSTEM_ASSERT(pSys, dp);
1558eee59048SToomas Soome 
1559eee59048SToomas Soome 	ficlDictionarySetPrimitive(dp, "efi-setenv", ficlEfiSetenv,
1560eee59048SToomas Soome 	    FICL_WORD_DEFAULT);
1561eee59048SToomas Soome 	ficlDictionarySetPrimitive(dp, "efi-getenv", ficlEfiGetenv,
1562eee59048SToomas Soome 	    FICL_WORD_DEFAULT);
1563eee59048SToomas Soome 	ficlDictionarySetPrimitive(dp, "efi-unsetenv", ficlEfiUnsetenv,
1564eee59048SToomas Soome 	    FICL_WORD_DEFAULT);
1565eee59048SToomas Soome }
1566eee59048SToomas Soome 
1567eee59048SToomas Soome FICL_COMPILE_SET(ficlEfiCompilePlatform);
1568