Index | Thread | Search

From:
Jonathan Matthew <jonathan@d14n.org>
Subject:
arm64/efiboot: add mach fwsetup
To:
tech@openbsd.org
Date:
Thu, 28 Aug 2025 14:58:28 +1000

Download raw body.

Thread
This is basically the same diff as for amd64's efiboot.  It's only useful
on machines with actual EFI firmware, so things like the Ampere Altra,
Overdrive 1000, etc.  u-boot doesn't implement this feature.

ok?

I notice we don't have a boot/boot.conf man page on arm64.  Should we have
one?


Index: efiboot/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/stand/efiboot/conf.c,v
diff -u -p -u -p -r1.49 conf.c
--- efiboot/conf.c	23 Jun 2024 15:37:31 -0000	1.49
+++ efiboot/conf.c	28 Aug 2025 03:40:00 -0000
@@ -47,7 +47,7 @@
 #include "efipxe.h"
 #include "softraid_arm64.h"
 
-const char version[] = "1.20";
+const char version[] = "1.21";
 int	debug = 0;
 
 struct fs_ops file_system[] = {
Index: efiboot/efiboot.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/stand/efiboot/efiboot.c,v
diff -u -p -u -p -r1.63 efiboot.c
--- efiboot/efiboot.c	13 Jan 2025 16:58:09 -0000	1.63
+++ efiboot/efiboot.c	28 Aug 2025 03:40:00 -0000
@@ -44,6 +44,8 @@
 #include "efidt.h"
 #include "fdt.h"
 
+#define EFI_OS_INDICATIONS_BOOT_TO_FW_UI	1ULL
+
 EFI_SYSTEM_TABLE	*ST;
 EFI_BOOT_SERVICES	*BS;
 EFI_RUNTIME_SERVICES	*RS;
@@ -1262,12 +1264,14 @@ retry:
 int Xacpi_efi(void);
 int Xdtb_efi(void);
 int Xexit_efi(void);
+int Xfwsetup_efi(void);
 int Xpoweroff_efi(void);
 
 const struct cmd_table cmd_machine[] = {
 	{ "acpi",	CMDT_CMD, Xacpi_efi },
 	{ "dtb",	CMDT_CMD, Xdtb_efi },
 	{ "exit",	CMDT_CMD, Xexit_efi },
+	{ "fwsetup",	CMDT_CMD, Xfwsetup_efi },
 	{ "poweroff",	CMDT_CMD, Xpoweroff_efi },
 	{ NULL, 0 }
 };
@@ -1299,6 +1303,44 @@ int
 Xexit_efi(void)
 {
 	BS->Exit(IH, 0, 0, NULL);
+	for (;;)
+		continue;
+	return (0);
+}
+
+int
+Xfwsetup_efi(void)
+{
+	UINT64 osind;
+	UINTN osind_size = sizeof(osind);
+	UINT32 osind_attrs = 0x1 | 0x2 | 0x4;
+	EFI_GUID global = EFI_GLOBAL_VARIABLE;
+	EFI_STATUS status;
+
+	status = RS->GetVariable(L"OsIndicationsSupported", &global, NULL,
+	    &osind_size, &osind);
+	if (status == EFI_NOT_FOUND) {
+		printf("not supported on this machine.\n");
+		return (-1);
+	} else if (status != EFI_SUCCESS) {
+		printf("%s: %d\n", __func__, status);
+		return (-1);
+	}
+
+	if ((osind & EFI_OS_INDICATIONS_BOOT_TO_FW_UI) == 0) {
+		printf("not supported on this machine.\n");
+		return (-1);
+	}
+
+	osind = EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
+	status = RS->SetVariable(L"OsIndications", &global, osind_attrs,
+	    sizeof(osind), &osind);
+	if (status != EFI_SUCCESS) {
+		printf("%s: %d\n", __func__, status);
+		return (-1);
+	}
+
+	RS->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL);
 	for (;;)
 		continue;
 	return (0);