EFI updates for v3.20
Subsystems (7)
Linus,
Please pull the latest x86-efi-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-efi-for-linus
# HEAD: 3c01b74e818a7a3b2ee9b0d584cca0bc154a031c Merge tag 'efi-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mfleming/efi into x86/efi
Main changes:
- Move efivarfs from the misc filesystem section to pseudo filesystem
- Expose firmware platform size in sysfs
- Improve robustness of get_memory_map() by removing assumptions on the size of efi_memory_desc_t.
- various cleanups and fixes
The biggest risk is the get_memory_map() change, which changes the way that both the arm64 and x86 EFI boot stub build the early memory map. There are no known regressions with it at the moment, BYMMV.
out-of-topic modifications in x86-efi-for-linus:
--------------------------------------------------
arch/arm64/kernel/efi-stub.c # ddeeefe2dfbe: arm64/efi: efistub: Apply __
block/partitions/efi.c # 26e022727f5e: efi: Rename efi_guid_unparse
drivers/firmware/efi/Kconfig # 0e4ca02b3fc0: efi: Update the URLs for efi
drivers/firmware/efi/efi.c # 11629305043c: efi: Don't look for chosen@0
# 613782b08752: firmware: efi: Remove unneed
# 2859dff97e54: efi: Expose underlying UEFI
# 26e022727f5e: efi: Rename efi_guid_unparse
drivers/firmware/efi/efivars.c # 26e022727f5e: efi: Rename efi_guid_unparse
drivers/firmware/efi/libstub/Makefile# ddeeefe2dfbe: arm64/efi: efistub: Apply __
drivers/firmware/efi/libstub/arm-stub.c# ddeeefe2dfbe: arm64/efi: efistub: Apply __
drivers/firmware/efi/libstub/efi-stub-helper.c# d1a8d66b9177: efi/libstub: Call get_memory
# ddeeefe2dfbe: arm64/efi: efistub: Apply __
drivers/firmware/efi/runtime-map.c # 86d68a58d00d: efi: Small leak on error in
drivers/rtc/rtc-efi.c # 822a02792876: efi: rtc-efi: Mark UIE as un
fs/Kconfig # 62c204ddfe96: fs: Make efivarfs a pseudo f
fs/efivarfs/Kconfig # 62c204ddfe96: fs: Make efivarfs a pseudo f
fs/efivarfs/super.c # 26e022727f5e: efi: Rename efi_guid_unparseThanks,
Ingo
------------------>
Ard Biesheuvel (3):
arm64/efi: efistub: Apply __init annotation
efi: rtc-efi: Mark UIE as unsupported
efi/libstub: Call get_memory_map() to obtain map and desc sizes
Borislav Petkov (1):
efi: Rename efi_guid_unparse to efi_guid_to_str
Dan Carpenter (1):
efi: Small leak on error in runtime map code
Ivan Khoronzhuk (1):
firmware: efi: Remove unneeded guid unparse
Leif Lindholm (2):
fs: Make efivarfs a pseudo filesystem, built by default with EFI
efi: Don't look for chosen@0 node on DT platforms
Peter Jones (1):
efi: Update the URLs for efibootmgr
Steve McIntyre (1):
efi: Expose underlying UEFI firmware platform size to userland
arch/arm64/kernel/efi-stub.c | 14 +++++++------- block/partitions/efi.c | 2 +- drivers/firmware/efi/Kconfig | 4 ++-- drivers/firmware/efi/efi.c | 17 ++++++++++------- drivers/firmware/efi/efivars.c | 6 +++--- drivers/firmware/efi/libstub/Makefile | 14 ++++++++++++++ drivers/firmware/efi/libstub/arm-stub.c | 8 ++++---- drivers/firmware/efi/libstub/efi-stub-helper.c | 18 +++++++++++------- drivers/firmware/efi/runtime-map.c | 2 +- drivers/rtc/rtc-efi.c | 1 + fs/Kconfig | 2 +- fs/efivarfs/Kconfig | 1 + fs/efivarfs/super.c | 2 +- include/linux/efi.h | 2 +- 14 files changed, 58 insertions(+), 35 deletions(-)
arch/arm64/kernel/efi-stub.c +7 -7
@@ -13,13 +13,13 @@#include <asm/efi.h> #include <asm/sections.h> -efi_status_t handle_kernel_image (efi_system_table_t *sys_table, -unsigned long *image_addr, -unsigned long *image_size, -unsigned long *reserve_addr, -unsigned long *reserve_size, -unsigned long dram_base, -efi_loaded_image_t *image) +efi_status_t __init handle_kernel_image (efi_system_table_t *sys_table, +unsigned long *image_addr, +unsigned long *image_size, +unsigned long *reserve_addr, +unsigned long *reserve_size, +unsigned long dram_base, +efi_loaded_image_t *image) {efi_status_t status;unsigned long kernel_size, kernel_memsize =0 ;
block/partitions/efi.c +1 -1
@@ -715,7 +715,7 @@ int efi_partition(struct parsed_partitions *state) state->parts[i +1 ].flags =ADDPART_FLAG_RAID ; info = &state->parts[i +1 ].info; -efi_guid_unparse (&ptes[i].unique_partition_guid, info->uuid); +efi_guid_to_str (&ptes[i].unique_partition_guid, info->uuid);/* Naively convert UTF16-LE to 7 bits. */ label_max = min(ARRAY_SIZE(info->volname) - 1,
drivers/firmware/efi/Kconfig +2 -2
@@ -12,11 +12,11 @@ config EFI_VARS Note that using this driver in concert with efibootmgr requires at least test release version 0.5.0-test3 or later, which is - available from Matt Domsch's website located at: + available from: <http://linux.dell.com/efibootmgr/testing/efibootmgr-0.5.0-test3.tar.gz> Subsequent efibootmgr releases may be found at: - <http://linux.dell.com/efibootmgr> + <http://github.com/vathpela/efibootmgr> config EFI_VARS_PSTORE tristate "Register efivars backend for pstore"
drivers/firmware/efi/efi.c +10 -7
@@ -115,15 +115,24 @@ EFI_ATTR_SHOW(fw_vendor);EFI_ATTR_SHOW (runtime);EFI_ATTR_SHOW (config_table); +static ssize_t fw_platform_size_show (struct kobject *kobj, +struct kobj_attribute *attr,char *buf) +{ +return sprintf (buf,"%d\n" ,efi_enabled (EFI_64BIT ) ?64 :32 ); +} +static struct kobj_attribute efi_attr_fw_vendor =__ATTR_RO (fw_vendor);static struct kobj_attribute efi_attr_runtime =__ATTR_RO (runtime);static struct kobj_attribute efi_attr_config_table =__ATTR_RO (config_table); +static struct kobj_attribute efi_attr_fw_platform_size = +__ATTR_RO (fw_platform_size);static struct attribute *efi_subsys_attrs[] = { &efi_attr_systab.attr, &efi_attr_fw_vendor.attr, &efi_attr_runtime.attr, &efi_attr_config_table.attr, + &efi_attr_fw_platform_size.attr,NULL , };
@@ -272,15 +281,10 @@ static __init int match_config_table(efi_guid_t *guid,unsigned long table, efi_config_table_type_t *table_types) { - u8 str[EFI_VARIABLE_GUID_LEN + 1]; int i;if (table_types) { -efi_guid_unparse (guid, str); -for (i =0 ;efi_guidcmp (table_types[i].guid,NULL_GUID ); i++) { -efi_guid_unparse (&table_types[i].guid, str); -if (!efi_guidcmp (*guid, table_types[i].guid)) { *(table_types[i].ptr) = table; pr_cont(" %s=0x%lx ",
@@ -403,8 +407,7 @@ static int __init fdt_find_uefi_params(unsigned long node, const char *uname,u64 val;int i, len; -if (depth !=1 || - (strcmp (uname,"chosen" ) !=0 &&strcmp (uname,"chosen@0" ) !=0 )) +if (depth !=1 ||strcmp (uname,"chosen" ) !=0 )return 0 ;for (i =0 ; i <ARRAY_SIZE (dt_params); i++) {
drivers/firmware/efi/efivars.c +3 -3
@@ -39,7 +39,7 @@* fix locking per Peter Chubb's findings * * 25 Mar 2002 - Matt Domsch <[email protected]> -* move uuid_unparse() to include/asm-ia64/efi.h:efi_guid_unparse() +* move uuid_unparse() to include/asm-ia64/efi.h:efi_guid_to_str() * * 12 Feb 2002 - Matt Domsch <[email protected]> * use list_for_each_safe when deleting vars.
@@ -128,7 +128,7 @@ efivar_guid_read(struct efivar_entry *entry, char *buf)if (!entry || !buf)return 0 ; -efi_guid_unparse (&var->VendorGuid, str); +efi_guid_to_str (&var->VendorGuid, str); str +=strlen (str); str +=sprintf (str,"\n" );
@@ -569,7 +569,7 @@ efivar_create_sysfs_entry(struct efivar_entry *new_var)private variables from another's. */ *(short_name +strlen (short_name)) ='-' ; -efi_guid_unparse (&new_var->var.VendorGuid, +efi_guid_to_str (&new_var->var.VendorGuid, short_name +strlen (short_name)); new_var->kobj.kset = efivars_kset;
drivers/firmware/efi/libstub/Makefile +14 -0
@@ -24,3 +24,17 @@ lib-y := efi-stub-helper.o lib-$(CONFIG_EFI_ARMSTUB) += arm-stub.o fdt.o CFLAGS_fdt.o += -I$(srctree)/scripts/dtc/libfdt/ + +# +# arm64 puts the stub in the kernel proper, which will unnecessarily retain all +# code indefinitely unless it is annotated as __init/__initdata/__initconst etc. +# So let's apply the __init annotations at the section level, by prefixing +# the section names directly. This will ensure that even all the inline string +# literals are covered. +# +extra-$(CONFIG_ARM64) := $(lib-y) +lib-$(CONFIG_ARM64) := $(patsubst %.o,%.init.o,$(lib-y)) + +OBJCOPYFLAGS := --prefix-alloc-sections=.init +$(obj)/%.init.o: $(obj)/%.o FORCE + $(call if_changed,objcopy)
drivers/firmware/efi/libstub/arm-stub.c +4 -4
@@ -17,10 +17,10 @@#include "efistub.h" -static int __init efi_secureboot_enabled (efi_system_table_t *sys_table_arg) +static int efi_secureboot_enabled (efi_system_table_t *sys_table_arg) { -static efi_guid_t const var_guid__initconst =EFI_GLOBAL_VARIABLE_GUID ; -static efi_char16_t const var_name[]__initconst = { +static efi_guid_t const var_guid =EFI_GLOBAL_VARIABLE_GUID ; +static efi_char16_t const var_name[] = {'S' ,'e' ,'c' ,'u' ,'r' ,'e' ,'B' ,'o' ,'o' ,'t' ,0 };efi_get_variable_t *f_getvar = sys_table_arg->runtime->get_variable;
@@ -164,7 +164,7 @@ efi_status_t handle_kernel_image(efi_system_table_t *sys_table,* for both archictectures, with the arch-specific code provided in the * handle_kernel_image() function. */ -unsigned long __init efi_entry (void *handle,efi_system_table_t *sys_table, +unsigned long efi_entry (void *handle,efi_system_table_t *sys_table,unsigned long *image_addr) {efi_loaded_image_t *image;
drivers/firmware/efi/libstub/efi-stub-helper.c +11 -7
@@ -66,25 +66,29 @@ efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg,unsigned long key;u32 desc_version; - *map_size =sizeof (*m) *32 ; -again: + *map_size =0 ; + *desc_size =0 ; + key =0 ; + status =efi_call_early (get_memory_map, map_size,NULL , + &key, desc_size, &desc_version); +if (status !=EFI_BUFFER_TOO_SMALL ) +return EFI_LOAD_ERROR ; +/* * Add an additional efi_memory_desc_t because we're doing an * allocation which may be in a new descriptor region. */ - *map_size +=sizeof (*m); + *map_size += *desc_size; status =efi_call_early (allocate_pool,EFI_LOADER_DATA , *map_size, (void **)&m);if (status !=EFI_SUCCESS ) goto fail; - *desc_size =0 ; - key =0 ; status =efi_call_early (get_memory_map, map_size, m, &key, desc_size, &desc_version);if (status ==EFI_BUFFER_TOO_SMALL ) {efi_call_early (free_pool, m); - goto again; +return EFI_LOAD_ERROR ; }if (status !=EFI_SUCCESS )
@@ -101,7 +105,7 @@ efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg, } -unsigned long __init get_dram_base (efi_system_table_t *sys_table_arg) +unsigned long get_dram_base (efi_system_table_t *sys_table_arg) {efi_status_t status;unsigned long map_size;
drivers/firmware/efi/runtime-map.c +1 -1
@@ -191,7 +191,7 @@ int __init efi_runtime_map_init(struct kobject *efi_kobj)return 0 ; out_add_entry: -for (j = i -1 ; j >0 ; j--) { +for (j = i -1 ; j >=0 ; j--) { entry = *(map_entries + j);kobject_put (&entry->kobj); }
drivers/rtc/rtc-efi.c +1 -0
@@ -218,6 +218,7 @@ static int __init efi_rtc_probe(struct platform_device *dev)if (IS_ERR (rtc))return PTR_ERR (rtc); + rtc->uie_unsupported =1 ;platform_set_drvdata (dev, rtc);return 0 ;
fs/Kconfig +1 -1
@@ -165,6 +165,7 @@ config HUGETLB_PAGE def_bool HUGETLBFS source "fs/configfs/Kconfig" +source "fs/efivarfs/Kconfig" endmenu
@@ -209,7 +210,6 @@ source "fs/sysv/Kconfig" source "fs/ufs/Kconfig" source "fs/exofs/Kconfig" source "fs/f2fs/Kconfig" -source "fs/efivarfs/Kconfig" endif # MISC_FILESYSTEMS
fs/efivarfs/Kconfig +1 -0
@@ -1,6 +1,7 @@ config EFIVAR_FS tristate "EFI Variable filesystem" depends on EFI + default m help efivarfs is a replacement filesystem for the old EFI variable support via sysfs, as it doesn't suffer from the
fs/efivarfs/super.c +1 -1
@@ -140,7 +140,7 @@ static int efivarfs_callback(efi_char16_t *name16, efi_guid_t vendor, name[len] ='-' ; -efi_guid_unparse (&entry->var.VendorGuid, name + len +1 ); +efi_guid_to_str (&entry->var.VendorGuid, name + len +1 ); name[len +EFI_VARIABLE_GUID_LEN +1 ] ='\0' ;
include/linux/efi.h +1 -1
@@ -848,7 +848,7 @@ efi_guidcmp (efi_guid_t left, efi_guid_t right) }static inline char * -efi_guid_unparse (efi_guid_t *guid,char *out) +efi_guid_to_str (efi_guid_t *guid,char *out) {sprintf (out,"%pUl" , guid->b);return out;