2015-02-09

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.unique_partition_guid, info->uuid);

+ efi_guid_to_str(&ptes.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.guid, NULL_GUID); i++) {

- efi_guid_unparse(&table_types.guid, str);

-

if (!efi_guidcmp(*guid, table_types.guid)) {

*(table_types.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_Domsch@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_Domsch@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 majordomo@vger.kernel.org

More majordomo info at http://vger.kernel.org/majordomo-info.html

Please read the FAQ at http://www.tux.org/lkml/

Show more