efi: Add an EFI_SECURE_BOOT flag to indicate secure boot mode
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH v2 2/5 efi: Add an EFI_SECURE_BOOT flag to indicate secure boot mode
From: David Howells <[email protected]>
UEFI machines can be booted in Secure Boot mode. Add an EFI_SECURE_BOOT flag that can be passed to efi_enabled() to find out whether secure boot is enabled.
Move the switch-statement in x86's setup_arch() that inteprets the secure_boot boot parameter to generic code and set the bit there.
Suggested-by Ard Biesheuvel <[email protected]>
Signed-off-by David Howells <[email protected]>
Reviewed-by Ard Biesheuvel <[email protected]>
[Rebased for context; efi_is_table_address was moved to arch/x86]
Signed-off-by Jeremy Cline <[email protected]>
--- arch/x86/kernel/setup.c | 14 +----------- drivers/firmware/efi/Makefile | 1 + drivers/firmware/efi/secureboot.c | 38 +++++++++++++++++++++++++++++++ include/linux/efi.h | 18 ++++++++++----- 4 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 drivers/firmware/efi/secureboot.c
arch/x86/kernel/setup.c +1 -13
@@ -1179,19 +1179,7 @@ void __init setup_arch(char **cmdline_p)/* Allocate bigger log buffer */ setup_log_buf (1 ); -if (efi_enabled (EFI_BOOT )) { -switch (boot_params.secure_boot) { -case efi_secureboot_mode_disabled: -pr_info ("Secure boot disabled\n" ); -break ; -case efi_secureboot_mode_enabled: -pr_info ("Secure boot enabled\n" ); -break ; -default : -pr_info ("Secure boot could not be determined\n" ); -break ; - } - } +efi_set_secure_boot (boot_params.secure_boot);reserve_initrd ();
drivers/firmware/efi/Makefile +1 -0
@@ -24,6 +24,7 @@ obj-$(CONFIG_EFI_FAKE_MEMMAP) += fake_mem.o obj-$(CONFIG_EFI_BOOTLOADER_CONTROL) += efibc.o obj-$(CONFIG_EFI_TEST) += test/ obj-$(CONFIG_EFI_DEV_PATH_PARSER) += dev-path-parser.o +obj-$(CONFIG_EFI) += secureboot.o obj-$(CONFIG_APPLE_PROPERTIES) += apple-properties.o obj-$(CONFIG_EFI_RCI2_TABLE) += rci2-table.o
drivers/firmware/efi/secureboot.c new file +38 -0
@@ -0,0 +1,38 @@ +/* Core kernel secure boot support. +* +* Copyright (C) 2017 Red Hat, Inc. All Rights Reserved. +* Written by David Howells ([email protected]) +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public Licence +* as published by the Free Software Foundation; either version +* 2 of the Licence, or (at your option) any later version. +*/ + +#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt + +#include <linux/efi.h> +#include <linux/kernel.h> +#include <linux/printk.h> + +/* +* Decide what to do when UEFI secure boot mode is enabled. +*/ +void __init efi_set_secure_boot (enum efi_secureboot_mode mode) +{ +if (efi_enabled (EFI_BOOT )) { +switch (mode) { +case efi_secureboot_mode_disabled: +pr_info ("Secure boot disabled\n" ); +break ; +case efi_secureboot_mode_enabled: +set_bit (EFI_SECURE_BOOT , &efi.flags); +pr_info ("Secure boot enabled\n" ); +break ; +default : +pr_warning ("Secure boot could not be determined (mode %u)\n" , + mode); +break ; + } + } +}
include/linux/efi.h +12 -6
@@ -1202,6 +1202,14 @@ extern int __init efi_setup_pcdp_console(char *);#define EFI_DBG 8/* Print additional debug info at runtime */ #define EFI_NX_PE_DATA 9/* Can runtime data regions be mapped non-executable? */ #define EFI_MEM_ATTR 10/* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */ +#define EFI_SECURE_BOOT 11/* Are we in Secure Boot mode? */ + +enum efi_secureboot_mode { + efi_secureboot_mode_unset, + efi_secureboot_mode_unknown, + efi_secureboot_mode_disabled, + efi_secureboot_mode_enabled, +};#ifdef CONFIG_EFI /*
@@ -1212,6 +1220,8 @@ static inline bool efi_enabled(int feature) return test_bit(feature, &efi.flags) != 0; }extern void efi_reboot (enum reboot_mode reboot_mode,const char *__unused); + +extern void __init efi_set_secure_boot (enum efi_secureboot_mode mode);#else static inline bool efi_enabled (int feature) {
@@ -1225,6 +1235,8 @@ efi_capsule_pending(int *reset_type) {return false; } + +static inline void efi_set_secure_boot (enum efi_secureboot_mode mode) {}#endif extern int efi_status_to_err (efi_status_t status);
@@ -1616,12 +1628,6 @@ static inline bool efi_runtime_disabled(void) { return true; }extern void efi_call_virt_check_flags (unsigned long flags,const char *call);extern unsigned long efi_call_virt_save_flags (void ); -enum efi_secureboot_mode { - efi_secureboot_mode_unset, - efi_secureboot_mode_unknown, - efi_secureboot_mode_disabled, - efi_secureboot_mode_enabled, -};enum efi_secureboot_mode efi_get_secureboot (efi_system_table_t *sys_table);#ifdef CONFIG_RESET_ATTACK_MITIGATION
Signature · 1 line
2.21.0