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_unparse

 Thanks,

        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(-)

diff --git a/arch/arm64/kernel/efi-stub.c b/arch/arm64/kernel/efi-stub.c
index d27dd982ff26..f5374065ad53 100644
--- a/arch/arm64/kernel/efi-stub.c
+++ b/arch/arm64/kernel/efi-stub.c
@@ -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;
diff --git a/block/partitions/efi.c b/block/partitions/efi.c
index 56d08fd75b1a..26cb624ace05 100644
--- a/block/partitions/efi.c
+++ b/block/partitions/efi.c
@@ -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,
diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
index f712d47f30d8..8de4da5c9ab6 100644
--- a/drivers/firmware/efi/Kconfig
+++ b/drivers/firmware/efi/Kconfig
@@ -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"
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
index 9035c1b74d58..fccb464928c3 100644
--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -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++) {
diff --git a/drivers/firmware/efi/efivars.c b/drivers/firmware/efi/efivars.c
index f256ecd8a176..7b2e0496e0c0 100644
--- a/drivers/firmware/efi/efivars.c
+++ b/drivers/firmware/efi/efivars.c
@@ -39,7 +39,7 @@
  *   fix locking per Peter Chubb's findings
  *
  *  25 Mar 2002 - Matt Domsch <matt_dom...@dell.com>
- *   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 <matt_dom...@dell.com>
  *   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;
diff --git a/drivers/firmware/efi/libstub/Makefile 
b/drivers/firmware/efi/libstub/Makefile
index b14bc2b9fb4d..8902f52e0998 100644
--- a/drivers/firmware/efi/libstub/Makefile
+++ b/drivers/firmware/efi/libstub/Makefile
@@ -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)
diff --git a/drivers/firmware/efi/libstub/arm-stub.c 
b/drivers/firmware/efi/libstub/arm-stub.c
index eb48a1a1a576..2b3814702dcf 100644
--- a/drivers/firmware/efi/libstub/arm-stub.c
+++ b/drivers/firmware/efi/libstub/arm-stub.c
@@ -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;
diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c 
b/drivers/firmware/efi/libstub/efi-stub-helper.c
index a920fec8fe88..d073e3946383 100644
--- a/drivers/firmware/efi/libstub/efi-stub-helper.c
+++ b/drivers/firmware/efi/libstub/efi-stub-helper.c
@@ -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;
diff --git a/drivers/firmware/efi/runtime-map.c 
b/drivers/firmware/efi/runtime-map.c
index 018c29a26615..87b8e3b900d2 100644
--- a/drivers/firmware/efi/runtime-map.c
+++ b/drivers/firmware/efi/runtime-map.c
@@ -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);
        }
diff --git a/drivers/rtc/rtc-efi.c b/drivers/rtc/rtc-efi.c
index b37b0c80bd5a..cb989cd00b14 100644
--- a/drivers/rtc/rtc-efi.c
+++ b/drivers/rtc/rtc-efi.c
@@ -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;
diff --git a/fs/Kconfig b/fs/Kconfig
index 664991afe0c0..a6bb530b1ec5 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -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
 
diff --git a/fs/efivarfs/Kconfig b/fs/efivarfs/Kconfig
index 367bbb10c543..c2499ef174a2 100644
--- a/fs/efivarfs/Kconfig
+++ b/fs/efivarfs/Kconfig
@@ -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
diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
index 6dad1176ec52..ddbce42548c9 100644
--- a/fs/efivarfs/super.c
+++ b/fs/efivarfs/super.c
@@ -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';
 
diff --git a/include/linux/efi.h b/include/linux/efi.h
index 0238d612750e..b674837e2b98 100644
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -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;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to