diff --git a/zfsbootmenu/bin/firmware-setup b/zfsbootmenu/bin/firmware-setup new file mode 100755 index 000000000..1a6ac3ad2 --- /dev/null +++ b/zfsbootmenu/bin/firmware-setup @@ -0,0 +1,44 @@ +#!/bin/bash + +source /lib/zfsbootmenu-core.sh >/dev/null 2>&1 || exit 1 + +if ! is_efi_system; then + zdebug "efivarfs unsupported" + return 1 +elif [ ! -r /sys/firmware/efi/efivars/OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8c ]; then + zdebug "OsIndicationsSupported unsupported" + return 1 +elif [ ! -r /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c ]; then + zdebug "OsIndications unsupported" + return 1 +fi + +# Check if the EFI_OS_INDICATIONS_BOOT_TO_FW_UI = 0x01 bit is set +if ! (( $(od -An -t u1 -j4 -N1 \ + /sys/firmware/efi/efivars/OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8c \ + | tr -dc '0-9') & 1 )); then + zdebug "EFI reboot to firmware UI unsupported" + return 1 +fi + +mount_efivarfs rw +if [ ! -w /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c ]; then + zdebug "OsIndications not writable" + return 1 +fi + +mapfile -t osindications < <(od -An -t x1 -v -w1 \ + /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c | tr -dc '[:alnum:]\n') + +# set the required flags: +# EFI_VARIABLE_NON_VOLATILE = 0x01 +# EFI_VARIABLE_BOOTSERVICE_ACCESS = 0x02 +# EFI_VARIABLE_RUNTIME_ACCESS = 0x04 +osindications[0]=$(( 0x"${osindications[0]}" | 0x07 )) + +# Set the EFI_OS_INDICATIONS_BOOT_TO_FW_UI = 0x01 bit +osindications[4]=$(( 0x"${osindications[4]}" | 0x01 )) + +printf "$(printf '\\x%02x' "${osindications[@]}")" > /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c + +reboot