From: Borislav Petkov <bp@alien8.de>
To: Dave Young <dyoung@redhat.com>
Cc: mjg59@srcf.ucam.org, linux-efi@vger.kernel.org,
toshi.kani@hp.com, matt@console-pimps.org, greg@kroah.com,
x86@kernel.org, kexec@lists.infradead.org,
linux-kernel@vger.kernel.org,
James.Bottomley@HansenPartnership.com, horms@verge.net.au,
ebiederm@xmission.com, hpa@zytor.com, vgoyal@redhat.com
Subject: Re: [PATCH v5 08/14] efi: export efi runtime memory mapping to sysfs
Date: Wed, 11 Dec 2013 19:55:20 +0100 [thread overview]
Message-ID: <20131211185520.GG23793@pd.tnic> (raw)
In-Reply-To: <1386582147-9802-9-git-send-email-dyoung@redhat.com>
On Mon, Dec 09, 2013 at 05:42:21PM +0800, Dave Young wrote:
> kexec kernel will need exactly same mapping for
> efi runtime memory ranges. Thus here export the
> runtime ranges mapping to sysfs, kexec-tools
> will assemble them and pass to 2nd kernel via
> setup_data.
>
> Introducing a new directory /sys/firmware/efi/runtime-map
> Just like /sys/firmware/memmap. Containing below attribute
> in each file of that directory:
> attribute num_pages phys_addr type virt_addr
>
> Matt: s/efi-runtime-map.c/runtime-map.c
> change dir name to runtime-map
> update to use desc_size in efi_runtime_map
> cleaup the code, add function efi_save_runtime_map
> improve err handling
>
> Matt: changelog fix;
> Documentation fixes.
> only export runtime-map sysfs file in case CONFIG_KEXEC
> Add macros for sysfs _show functions
> move functions to front of .c, remove forward declarations.
>
> Boris: Documentation grammer/spelling fix
> better error handling for krealloc
> other code improvements.
> move efi_runtime_map_init to subsys_initcall.
> set efi_kobj = NULL in case efisubsys_init fails. And then efi_runtime_map_init
> will bail out.
> Kconfig EFI_RUNTIME_MAP depends on X86 && KEXEC && EFI
>
> Signed-off-by: Dave Young <dyoung@redhat.com>
> ---
> .../ABI/testing/sysfs-firmware-efi-runtime-map | 36 +++++
> arch/x86/platform/efi/efi.c | 28 ++++
> drivers/firmware/efi/Kconfig | 11 ++
> drivers/firmware/efi/Makefile | 1 +
> drivers/firmware/efi/efi.c | 4 +-
> drivers/firmware/efi/runtime-map.c | 176 +++++++++++++++++++++
> include/linux/efi.h | 6 +
> 7 files changed, 261 insertions(+), 1 deletion(-)
> create mode 100644 Documentation/ABI/testing/sysfs-firmware-efi-runtime-map
> create mode 100644 drivers/firmware/efi/runtime-map.c
>
> diff --git a/Documentation/ABI/testing/sysfs-firmware-efi-runtime-map b/Documentation/ABI/testing/sysfs-firmware-efi-runtime-map
> new file mode 100644
> index 0000000..2ab7dd2
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-firmware-efi-runtime-map
> @@ -0,0 +1,36 @@
> +What: /sys/firmware/efi/runtime-map/
> +Date: December 2013
> +Contact: Dave Young <dyoung@redhat.com>
> +Description:
This could start at the same line as Description
> + Switching efi runtime services to virtual mode requires
> + that all efi memory ranges which have the runtime attribute
> + bit set to be mapped to virtual addresses.
> +
> + The efi runtime services can only be switched to virtual
> + mode once without rebooting. The kexec kernel must maintain
> + the same physical to virtual address mappings as the first
> + kernel. The mappings are exported to sysfs so userspace tools
> + can reassemble them and pass them into the kexec kernel.
> +
> + /sys/firmware/efi/runtime-map/ is the directory the kernel
> + exports that information in.
> +
> + subdirectories are named with the number of the memory range:
> +
> + /sys/firmware/efi/runtime-map/0
> + /sys/firmware/efi/runtime-map/1
> + /sys/firmware/efi/runtime-map/2
> + /sys/firmware/efi/runtime-map/3
> + ...
> +
> + Each subdirectory contains five files:
> +
> + attribute : The attributes of the memory range.
> + num_pages : The size of the memory range in pages.
> + phys_addr : The physical address of the memory range.
> + type : The type of the memory range.
> + virt_addr : The virtual address of the memory range.
> +
> + Above values are all hexadecimal numbers with the '0x' prefix.
> +
Superfluous newline.
> +Users: Kexec
> diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
> index 3e8b760..8289e0c 100644
> --- a/arch/x86/platform/efi/efi.c
> +++ b/arch/x86/platform/efi/efi.c
> @@ -76,6 +76,9 @@ static __initdata efi_config_table_type_t arch_tables[] = {
> {NULL_GUID, NULL, NULL},
> };
>
> +void *efi_runtime_map;
> +int nr_efi_runtime_map;
> +
> /*
> * Returns 1 if 'facility' is enabled, 0 otherwise.
> */
> @@ -810,6 +813,19 @@ static void __init efi_merge_regions(void)
> }
> }
>
> +static int __init save_runtime_map(efi_memory_desc_t *md, int idx)
> +{
> + void *p;
> + p = krealloc(efi_runtime_map, (idx + 1) * memmap.desc_size, GFP_KERNEL);
> + if (!p)
> + return -ENOMEM;
> +
> + efi_runtime_map = p;
> + memcpy(efi_runtime_map + idx * memmap.desc_size, md, memmap.desc_size);
> +
> + return 0;
> +}
> +
> /*
> * Map efi memory ranges for runtime serivce and update new_memmap with virtual
> * addresses.
> @@ -820,6 +836,7 @@ static void * __init efi_map_regions(int *count)
> void *p, *tmp, *new_memmap = NULL;
> unsigned long size;
> u64 end, systab;
> + int err = 0;
>
> for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
> md = p;
> @@ -848,10 +865,21 @@ static void * __init efi_map_regions(int *count)
> new_memmap = tmp;
> memcpy(new_memmap + (*count * memmap.desc_size), md,
> memmap.desc_size);
> + if (md->type != EFI_BOOT_SERVICES_CODE &&
> + md->type != EFI_BOOT_SERVICES_DATA) {
> + err = save_runtime_map(md, nr_efi_runtime_map);
> + if (err)
> + goto out_save_runtime;
> + nr_efi_runtime_map++;
> + }
So why don't you move that code to save_runtime_map?
It would looks like this:
...
new_memmap = tmp;
memcpy(new_memmap + (*count * memmap.desc_size), md,
memmap.desc_size);
save_runtime_map(md);
(*count)++;
[nr_efi_runtime_map is global, no need to pass it to save_runtime_map() ]
and the EFI_BOOT* tests can be done in save_runtime_map and also the
error handling can happen there. This way efi_map_regions() won't
need to know about anything. This way, you can later move the whole
save_runtime_map() function to efi-kexec.c just by taking it without any
need for untangling.
> +out_save_runtime:
> + kfree(efi_runtime_map);
> + nr_efi_runtime_map = 0;
> + efi_runtime_map = NULL;
This can go there too.
> out_krealloc:
> kfree(new_memmap);
> return NULL;
> diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
> index 3150aa4..3d8d6f6 100644
> --- a/drivers/firmware/efi/Kconfig
> +++ b/drivers/firmware/efi/Kconfig
> @@ -39,4 +39,15 @@ config EFI_VARS_PSTORE_DEFAULT_DISABLE
> config UEFI_CPER
> def_bool n
>
> +config EFI_RUNTIME_MAP
> + bool "Export efi runtime maps to sysfs" if EXPERT
What's with the EXPERT? It depends on KEXEC already.
> + depends on X86 && EFI && KEXEC
> + default y
> + help
> + Export efi runtime memory maps to /sys/firmware/efi/runtime-map.
> + That memory map is used for example by kexec to set up efi virtual
> + mapping the 2nd kernel, but can also be used for debugging purposes.
> +
> + See also Documentation/ABI/testing/sysfs-firmware-efi-runtime-map.
> +
> endmenu
...
> +static int __init efi_runtime_map_init(void)
> +{
> + int i, j, ret = 0;
> + struct efi_runtime_map_entry *entry;
> +
> + if (!efi_kobj)
> + return 0;
> +
> + if (!efi_runtime_map)
> + return 0;
> +
> + map_entries = kzalloc(nr_efi_runtime_map * sizeof(entry), GFP_KERNEL);
> + if (!map_entries) {
> + ret = -ENOMEM;
> + goto out;
> + }
> +
> + for (i = 0; i < nr_efi_runtime_map; i++) {
> + entry = add_sysfs_runtime_map_entry(i);
> + if (IS_ERR(entry)) {
> + ret = PTR_ERR(entry);
> + goto out_add_entry;
> + }
> + *(map_entries + i) = entry;
> + }
> +
> + return 0;
> +out_add_entry:
> + for (j = i - 1; j > 0; j--) {
> + entry = *(map_entries + j);
> + kobject_put(&entry->kobj);
> + }
> + if (map_kset)
> + kset_unregister(map_kset);
> +out:
> + return ret;
> +}
> +
> +subsys_initcall(efi_runtime_map_init);
Let me repeat myself:
Why an initcall? Can't we run this from efisubsys_init()?
--
Regards/Gruss,
Boris.
Sent from a fat crate under my desk. Formatting is fine.
--
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
WARNING: multiple messages have this Message-ID (diff)
From: Borislav Petkov <bp-Gina5bIWoIWzQB+pC5nmwQ@public.gmane.org>
To: Dave Young <dyoung-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-efi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
mjg59-1xO5oi07KQx4cg9Nei1l7Q@public.gmane.org,
hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org,
James.Bottomley-d9PhHud1JfjCXq6kfMZ53/egYHeGw8Jk@public.gmane.org,
vgoyal-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org,
horms-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org,
kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
greg-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org,
matt-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org,
toshi.kani-VXdhtT5mjnY@public.gmane.org
Subject: Re: [PATCH v5 08/14] efi: export efi runtime memory mapping to sysfs
Date: Wed, 11 Dec 2013 19:55:20 +0100 [thread overview]
Message-ID: <20131211185520.GG23793@pd.tnic> (raw)
In-Reply-To: <1386582147-9802-9-git-send-email-dyoung-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
On Mon, Dec 09, 2013 at 05:42:21PM +0800, Dave Young wrote:
> kexec kernel will need exactly same mapping for
> efi runtime memory ranges. Thus here export the
> runtime ranges mapping to sysfs, kexec-tools
> will assemble them and pass to 2nd kernel via
> setup_data.
>
> Introducing a new directory /sys/firmware/efi/runtime-map
> Just like /sys/firmware/memmap. Containing below attribute
> in each file of that directory:
> attribute num_pages phys_addr type virt_addr
>
> Matt: s/efi-runtime-map.c/runtime-map.c
> change dir name to runtime-map
> update to use desc_size in efi_runtime_map
> cleaup the code, add function efi_save_runtime_map
> improve err handling
>
> Matt: changelog fix;
> Documentation fixes.
> only export runtime-map sysfs file in case CONFIG_KEXEC
> Add macros for sysfs _show functions
> move functions to front of .c, remove forward declarations.
>
> Boris: Documentation grammer/spelling fix
> better error handling for krealloc
> other code improvements.
> move efi_runtime_map_init to subsys_initcall.
> set efi_kobj = NULL in case efisubsys_init fails. And then efi_runtime_map_init
> will bail out.
> Kconfig EFI_RUNTIME_MAP depends on X86 && KEXEC && EFI
>
> Signed-off-by: Dave Young <dyoung-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> ---
> .../ABI/testing/sysfs-firmware-efi-runtime-map | 36 +++++
> arch/x86/platform/efi/efi.c | 28 ++++
> drivers/firmware/efi/Kconfig | 11 ++
> drivers/firmware/efi/Makefile | 1 +
> drivers/firmware/efi/efi.c | 4 +-
> drivers/firmware/efi/runtime-map.c | 176 +++++++++++++++++++++
> include/linux/efi.h | 6 +
> 7 files changed, 261 insertions(+), 1 deletion(-)
> create mode 100644 Documentation/ABI/testing/sysfs-firmware-efi-runtime-map
> create mode 100644 drivers/firmware/efi/runtime-map.c
>
> diff --git a/Documentation/ABI/testing/sysfs-firmware-efi-runtime-map b/Documentation/ABI/testing/sysfs-firmware-efi-runtime-map
> new file mode 100644
> index 0000000..2ab7dd2
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-firmware-efi-runtime-map
> @@ -0,0 +1,36 @@
> +What: /sys/firmware/efi/runtime-map/
> +Date: December 2013
> +Contact: Dave Young <dyoung-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> +Description:
This could start at the same line as Description
> + Switching efi runtime services to virtual mode requires
> + that all efi memory ranges which have the runtime attribute
> + bit set to be mapped to virtual addresses.
> +
> + The efi runtime services can only be switched to virtual
> + mode once without rebooting. The kexec kernel must maintain
> + the same physical to virtual address mappings as the first
> + kernel. The mappings are exported to sysfs so userspace tools
> + can reassemble them and pass them into the kexec kernel.
> +
> + /sys/firmware/efi/runtime-map/ is the directory the kernel
> + exports that information in.
> +
> + subdirectories are named with the number of the memory range:
> +
> + /sys/firmware/efi/runtime-map/0
> + /sys/firmware/efi/runtime-map/1
> + /sys/firmware/efi/runtime-map/2
> + /sys/firmware/efi/runtime-map/3
> + ...
> +
> + Each subdirectory contains five files:
> +
> + attribute : The attributes of the memory range.
> + num_pages : The size of the memory range in pages.
> + phys_addr : The physical address of the memory range.
> + type : The type of the memory range.
> + virt_addr : The virtual address of the memory range.
> +
> + Above values are all hexadecimal numbers with the '0x' prefix.
> +
Superfluous newline.
> +Users: Kexec
> diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
> index 3e8b760..8289e0c 100644
> --- a/arch/x86/platform/efi/efi.c
> +++ b/arch/x86/platform/efi/efi.c
> @@ -76,6 +76,9 @@ static __initdata efi_config_table_type_t arch_tables[] = {
> {NULL_GUID, NULL, NULL},
> };
>
> +void *efi_runtime_map;
> +int nr_efi_runtime_map;
> +
> /*
> * Returns 1 if 'facility' is enabled, 0 otherwise.
> */
> @@ -810,6 +813,19 @@ static void __init efi_merge_regions(void)
> }
> }
>
> +static int __init save_runtime_map(efi_memory_desc_t *md, int idx)
> +{
> + void *p;
> + p = krealloc(efi_runtime_map, (idx + 1) * memmap.desc_size, GFP_KERNEL);
> + if (!p)
> + return -ENOMEM;
> +
> + efi_runtime_map = p;
> + memcpy(efi_runtime_map + idx * memmap.desc_size, md, memmap.desc_size);
> +
> + return 0;
> +}
> +
> /*
> * Map efi memory ranges for runtime serivce and update new_memmap with virtual
> * addresses.
> @@ -820,6 +836,7 @@ static void * __init efi_map_regions(int *count)
> void *p, *tmp, *new_memmap = NULL;
> unsigned long size;
> u64 end, systab;
> + int err = 0;
>
> for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
> md = p;
> @@ -848,10 +865,21 @@ static void * __init efi_map_regions(int *count)
> new_memmap = tmp;
> memcpy(new_memmap + (*count * memmap.desc_size), md,
> memmap.desc_size);
> + if (md->type != EFI_BOOT_SERVICES_CODE &&
> + md->type != EFI_BOOT_SERVICES_DATA) {
> + err = save_runtime_map(md, nr_efi_runtime_map);
> + if (err)
> + goto out_save_runtime;
> + nr_efi_runtime_map++;
> + }
So why don't you move that code to save_runtime_map?
It would looks like this:
...
new_memmap = tmp;
memcpy(new_memmap + (*count * memmap.desc_size), md,
memmap.desc_size);
save_runtime_map(md);
(*count)++;
[nr_efi_runtime_map is global, no need to pass it to save_runtime_map() ]
and the EFI_BOOT* tests can be done in save_runtime_map and also the
error handling can happen there. This way efi_map_regions() won't
need to know about anything. This way, you can later move the whole
save_runtime_map() function to efi-kexec.c just by taking it without any
need for untangling.
> +out_save_runtime:
> + kfree(efi_runtime_map);
> + nr_efi_runtime_map = 0;
> + efi_runtime_map = NULL;
This can go there too.
> out_krealloc:
> kfree(new_memmap);
> return NULL;
> diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
> index 3150aa4..3d8d6f6 100644
> --- a/drivers/firmware/efi/Kconfig
> +++ b/drivers/firmware/efi/Kconfig
> @@ -39,4 +39,15 @@ config EFI_VARS_PSTORE_DEFAULT_DISABLE
> config UEFI_CPER
> def_bool n
>
> +config EFI_RUNTIME_MAP
> + bool "Export efi runtime maps to sysfs" if EXPERT
What's with the EXPERT? It depends on KEXEC already.
> + depends on X86 && EFI && KEXEC
> + default y
> + help
> + Export efi runtime memory maps to /sys/firmware/efi/runtime-map.
> + That memory map is used for example by kexec to set up efi virtual
> + mapping the 2nd kernel, but can also be used for debugging purposes.
> +
> + See also Documentation/ABI/testing/sysfs-firmware-efi-runtime-map.
> +
> endmenu
...
> +static int __init efi_runtime_map_init(void)
> +{
> + int i, j, ret = 0;
> + struct efi_runtime_map_entry *entry;
> +
> + if (!efi_kobj)
> + return 0;
> +
> + if (!efi_runtime_map)
> + return 0;
> +
> + map_entries = kzalloc(nr_efi_runtime_map * sizeof(entry), GFP_KERNEL);
> + if (!map_entries) {
> + ret = -ENOMEM;
> + goto out;
> + }
> +
> + for (i = 0; i < nr_efi_runtime_map; i++) {
> + entry = add_sysfs_runtime_map_entry(i);
> + if (IS_ERR(entry)) {
> + ret = PTR_ERR(entry);
> + goto out_add_entry;
> + }
> + *(map_entries + i) = entry;
> + }
> +
> + return 0;
> +out_add_entry:
> + for (j = i - 1; j > 0; j--) {
> + entry = *(map_entries + j);
> + kobject_put(&entry->kobj);
> + }
> + if (map_kset)
> + kset_unregister(map_kset);
> +out:
> + return ret;
> +}
> +
> +subsys_initcall(efi_runtime_map_init);
Let me repeat myself:
Why an initcall? Can't we run this from efisubsys_init()?
--
Regards/Gruss,
Boris.
Sent from a fat crate under my desk. Formatting is fine.
--
WARNING: multiple messages have this Message-ID (diff)
From: Borislav Petkov <bp@alien8.de>
To: Dave Young <dyoung@redhat.com>
Cc: linux-kernel@vger.kernel.org, linux-efi@vger.kernel.org,
x86@kernel.org, mjg59@srcf.ucam.org, hpa@zytor.com,
James.Bottomley@HansenPartnership.com, vgoyal@redhat.com,
ebiederm@xmission.com, horms@verge.net.au,
kexec@lists.infradead.org, greg@kroah.com,
matt@console-pimps.org, toshi.kani@hp.com
Subject: Re: [PATCH v5 08/14] efi: export efi runtime memory mapping to sysfs
Date: Wed, 11 Dec 2013 19:55:20 +0100 [thread overview]
Message-ID: <20131211185520.GG23793@pd.tnic> (raw)
In-Reply-To: <1386582147-9802-9-git-send-email-dyoung@redhat.com>
On Mon, Dec 09, 2013 at 05:42:21PM +0800, Dave Young wrote:
> kexec kernel will need exactly same mapping for
> efi runtime memory ranges. Thus here export the
> runtime ranges mapping to sysfs, kexec-tools
> will assemble them and pass to 2nd kernel via
> setup_data.
>
> Introducing a new directory /sys/firmware/efi/runtime-map
> Just like /sys/firmware/memmap. Containing below attribute
> in each file of that directory:
> attribute num_pages phys_addr type virt_addr
>
> Matt: s/efi-runtime-map.c/runtime-map.c
> change dir name to runtime-map
> update to use desc_size in efi_runtime_map
> cleaup the code, add function efi_save_runtime_map
> improve err handling
>
> Matt: changelog fix;
> Documentation fixes.
> only export runtime-map sysfs file in case CONFIG_KEXEC
> Add macros for sysfs _show functions
> move functions to front of .c, remove forward declarations.
>
> Boris: Documentation grammer/spelling fix
> better error handling for krealloc
> other code improvements.
> move efi_runtime_map_init to subsys_initcall.
> set efi_kobj = NULL in case efisubsys_init fails. And then efi_runtime_map_init
> will bail out.
> Kconfig EFI_RUNTIME_MAP depends on X86 && KEXEC && EFI
>
> Signed-off-by: Dave Young <dyoung@redhat.com>
> ---
> .../ABI/testing/sysfs-firmware-efi-runtime-map | 36 +++++
> arch/x86/platform/efi/efi.c | 28 ++++
> drivers/firmware/efi/Kconfig | 11 ++
> drivers/firmware/efi/Makefile | 1 +
> drivers/firmware/efi/efi.c | 4 +-
> drivers/firmware/efi/runtime-map.c | 176 +++++++++++++++++++++
> include/linux/efi.h | 6 +
> 7 files changed, 261 insertions(+), 1 deletion(-)
> create mode 100644 Documentation/ABI/testing/sysfs-firmware-efi-runtime-map
> create mode 100644 drivers/firmware/efi/runtime-map.c
>
> diff --git a/Documentation/ABI/testing/sysfs-firmware-efi-runtime-map b/Documentation/ABI/testing/sysfs-firmware-efi-runtime-map
> new file mode 100644
> index 0000000..2ab7dd2
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-firmware-efi-runtime-map
> @@ -0,0 +1,36 @@
> +What: /sys/firmware/efi/runtime-map/
> +Date: December 2013
> +Contact: Dave Young <dyoung@redhat.com>
> +Description:
This could start at the same line as Description
> + Switching efi runtime services to virtual mode requires
> + that all efi memory ranges which have the runtime attribute
> + bit set to be mapped to virtual addresses.
> +
> + The efi runtime services can only be switched to virtual
> + mode once without rebooting. The kexec kernel must maintain
> + the same physical to virtual address mappings as the first
> + kernel. The mappings are exported to sysfs so userspace tools
> + can reassemble them and pass them into the kexec kernel.
> +
> + /sys/firmware/efi/runtime-map/ is the directory the kernel
> + exports that information in.
> +
> + subdirectories are named with the number of the memory range:
> +
> + /sys/firmware/efi/runtime-map/0
> + /sys/firmware/efi/runtime-map/1
> + /sys/firmware/efi/runtime-map/2
> + /sys/firmware/efi/runtime-map/3
> + ...
> +
> + Each subdirectory contains five files:
> +
> + attribute : The attributes of the memory range.
> + num_pages : The size of the memory range in pages.
> + phys_addr : The physical address of the memory range.
> + type : The type of the memory range.
> + virt_addr : The virtual address of the memory range.
> +
> + Above values are all hexadecimal numbers with the '0x' prefix.
> +
Superfluous newline.
> +Users: Kexec
> diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
> index 3e8b760..8289e0c 100644
> --- a/arch/x86/platform/efi/efi.c
> +++ b/arch/x86/platform/efi/efi.c
> @@ -76,6 +76,9 @@ static __initdata efi_config_table_type_t arch_tables[] = {
> {NULL_GUID, NULL, NULL},
> };
>
> +void *efi_runtime_map;
> +int nr_efi_runtime_map;
> +
> /*
> * Returns 1 if 'facility' is enabled, 0 otherwise.
> */
> @@ -810,6 +813,19 @@ static void __init efi_merge_regions(void)
> }
> }
>
> +static int __init save_runtime_map(efi_memory_desc_t *md, int idx)
> +{
> + void *p;
> + p = krealloc(efi_runtime_map, (idx + 1) * memmap.desc_size, GFP_KERNEL);
> + if (!p)
> + return -ENOMEM;
> +
> + efi_runtime_map = p;
> + memcpy(efi_runtime_map + idx * memmap.desc_size, md, memmap.desc_size);
> +
> + return 0;
> +}
> +
> /*
> * Map efi memory ranges for runtime serivce and update new_memmap with virtual
> * addresses.
> @@ -820,6 +836,7 @@ static void * __init efi_map_regions(int *count)
> void *p, *tmp, *new_memmap = NULL;
> unsigned long size;
> u64 end, systab;
> + int err = 0;
>
> for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
> md = p;
> @@ -848,10 +865,21 @@ static void * __init efi_map_regions(int *count)
> new_memmap = tmp;
> memcpy(new_memmap + (*count * memmap.desc_size), md,
> memmap.desc_size);
> + if (md->type != EFI_BOOT_SERVICES_CODE &&
> + md->type != EFI_BOOT_SERVICES_DATA) {
> + err = save_runtime_map(md, nr_efi_runtime_map);
> + if (err)
> + goto out_save_runtime;
> + nr_efi_runtime_map++;
> + }
So why don't you move that code to save_runtime_map?
It would looks like this:
...
new_memmap = tmp;
memcpy(new_memmap + (*count * memmap.desc_size), md,
memmap.desc_size);
save_runtime_map(md);
(*count)++;
[nr_efi_runtime_map is global, no need to pass it to save_runtime_map() ]
and the EFI_BOOT* tests can be done in save_runtime_map and also the
error handling can happen there. This way efi_map_regions() won't
need to know about anything. This way, you can later move the whole
save_runtime_map() function to efi-kexec.c just by taking it without any
need for untangling.
> +out_save_runtime:
> + kfree(efi_runtime_map);
> + nr_efi_runtime_map = 0;
> + efi_runtime_map = NULL;
This can go there too.
> out_krealloc:
> kfree(new_memmap);
> return NULL;
> diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
> index 3150aa4..3d8d6f6 100644
> --- a/drivers/firmware/efi/Kconfig
> +++ b/drivers/firmware/efi/Kconfig
> @@ -39,4 +39,15 @@ config EFI_VARS_PSTORE_DEFAULT_DISABLE
> config UEFI_CPER
> def_bool n
>
> +config EFI_RUNTIME_MAP
> + bool "Export efi runtime maps to sysfs" if EXPERT
What's with the EXPERT? It depends on KEXEC already.
> + depends on X86 && EFI && KEXEC
> + default y
> + help
> + Export efi runtime memory maps to /sys/firmware/efi/runtime-map.
> + That memory map is used for example by kexec to set up efi virtual
> + mapping the 2nd kernel, but can also be used for debugging purposes.
> +
> + See also Documentation/ABI/testing/sysfs-firmware-efi-runtime-map.
> +
> endmenu
...
> +static int __init efi_runtime_map_init(void)
> +{
> + int i, j, ret = 0;
> + struct efi_runtime_map_entry *entry;
> +
> + if (!efi_kobj)
> + return 0;
> +
> + if (!efi_runtime_map)
> + return 0;
> +
> + map_entries = kzalloc(nr_efi_runtime_map * sizeof(entry), GFP_KERNEL);
> + if (!map_entries) {
> + ret = -ENOMEM;
> + goto out;
> + }
> +
> + for (i = 0; i < nr_efi_runtime_map; i++) {
> + entry = add_sysfs_runtime_map_entry(i);
> + if (IS_ERR(entry)) {
> + ret = PTR_ERR(entry);
> + goto out_add_entry;
> + }
> + *(map_entries + i) = entry;
> + }
> +
> + return 0;
> +out_add_entry:
> + for (j = i - 1; j > 0; j--) {
> + entry = *(map_entries + j);
> + kobject_put(&entry->kobj);
> + }
> + if (map_kset)
> + kset_unregister(map_kset);
> +out:
> + return ret;
> +}
> +
> +subsys_initcall(efi_runtime_map_init);
Let me repeat myself:
Why an initcall? Can't we run this from efisubsys_init()?
--
Regards/Gruss,
Boris.
Sent from a fat crate under my desk. Formatting is fine.
--
next prev parent reply other threads:[~2013-12-11 18:55 UTC|newest]
Thread overview: 183+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-09 9:42 [PATCH v5 00/14] kexec kernel efi runtime support Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 01/14] x86/mm: sparse warning fix for early_memremap Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 15:05 ` Borislav Petkov
2013-12-09 15:05 ` Borislav Petkov
2013-12-09 15:05 ` Borislav Petkov
2013-12-10 2:12 ` Dave Young
2013-12-10 2:12 ` Dave Young
2013-12-10 2:12 ` Dave Young
2013-12-11 10:20 ` Matt Fleming
2013-12-11 10:20 ` Matt Fleming
2013-12-11 10:20 ` Matt Fleming
2013-12-11 11:12 ` Borislav Petkov
2013-12-11 11:12 ` Borislav Petkov
2013-12-12 2:06 ` Dave Young
2013-12-12 2:06 ` Dave Young
2013-12-12 2:06 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 02/14] efi: use early_memremap and early_memunmap Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-11 10:39 ` Matt Fleming
2013-12-11 10:39 ` Matt Fleming
2013-12-11 10:39 ` Matt Fleming
2013-12-11 11:02 ` Leif Lindholm
2013-12-11 11:02 ` Leif Lindholm
2013-12-11 11:32 ` Matt Fleming
2013-12-11 11:32 ` Matt Fleming
2013-12-11 11:32 ` Matt Fleming
2013-12-11 15:17 ` Mark Salter
2013-12-11 15:17 ` Mark Salter
2013-12-11 15:17 ` Mark Salter
2013-12-13 15:51 ` Leif Lindholm
2013-12-13 15:51 ` Leif Lindholm
2013-12-16 1:50 ` Dave Young
2013-12-16 1:50 ` Dave Young
2013-12-16 1:50 ` Dave Young
2013-12-12 2:04 ` Dave Young
2013-12-12 2:04 ` Dave Young
2013-12-12 2:04 ` Dave Young
2013-12-11 17:38 ` Borislav Petkov
2013-12-11 17:38 ` Borislav Petkov
2013-12-11 17:38 ` Borislav Petkov
2013-12-09 9:42 ` [PATCH v5 03/14] efi: remove unused variables in __map_region Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 04/14] efi: add a wrapper function efi_map_region_fixed Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 05/14] efi: reserve boot service fix Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 06/14] efi: cleanup efi_enter_virtual_mode function Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 07/14] efi: export more efi table variable to sysfs Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-11 18:32 ` Borislav Petkov
2013-12-11 18:32 ` Borislav Petkov
2013-12-11 18:32 ` Borislav Petkov
2013-12-12 2:15 ` Dave Young
2013-12-12 2:15 ` Dave Young
2013-12-12 2:15 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 08/14] efi: export efi runtime memory mapping " Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-11 18:55 ` Borislav Petkov [this message]
2013-12-11 18:55 ` Borislav Petkov
2013-12-11 18:55 ` Borislav Petkov
2013-12-12 2:36 ` Dave Young
2013-12-12 2:36 ` Dave Young
2013-12-12 2:36 ` Dave Young
2013-12-12 7:13 ` Dave Young
2013-12-12 7:13 ` Dave Young
2013-12-12 7:13 ` Dave Young
2013-12-12 20:36 ` Borislav Petkov
2013-12-12 20:36 ` Borislav Petkov
2013-12-13 7:20 ` Dave Young
2013-12-13 7:20 ` Dave Young
2013-12-13 7:20 ` Dave Young
2013-12-12 20:53 ` Borislav Petkov
2013-12-12 20:53 ` Borislav Petkov
2013-12-12 20:53 ` Borislav Petkov
2013-12-13 7:26 ` Dave Young
2013-12-13 7:26 ` Dave Young
2013-12-13 7:26 ` Dave Young
2013-12-13 12:30 ` Matt Fleming
2013-12-13 12:30 ` Matt Fleming
2013-12-13 12:30 ` Matt Fleming
2013-12-16 1:33 ` Dave Young
2013-12-16 1:33 ` Dave Young
2013-12-16 1:33 ` Dave Young
2013-12-16 3:02 ` Dave Young
2013-12-16 3:02 ` Dave Young
2013-12-16 3:02 ` Dave Young
2013-12-16 6:02 ` Dave Young
2013-12-16 6:02 ` Dave Young
2013-12-16 6:02 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 09/14] efi: passing kexec necessary efi data via setup_data Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-11 12:13 ` Matt Fleming
2013-12-11 12:13 ` Matt Fleming
2013-12-11 12:13 ` Matt Fleming
2013-12-11 14:05 ` Borislav Petkov
2013-12-11 14:05 ` Borislav Petkov
2013-12-11 14:05 ` Borislav Petkov
2013-12-12 2:11 ` Dave Young
2013-12-12 2:11 ` Dave Young
2013-12-12 2:11 ` Dave Young
2013-12-12 2:10 ` Dave Young
2013-12-12 2:10 ` Dave Young
2013-12-12 2:10 ` Dave Young
2013-12-11 22:20 ` Borislav Petkov
2013-12-11 22:20 ` Borislav Petkov
2013-12-11 22:20 ` Borislav Petkov
2013-12-12 3:06 ` Dave Young
2013-12-12 3:06 ` Dave Young
2013-12-12 3:06 ` Dave Young
2013-12-12 6:25 ` Dave Young
2013-12-12 6:25 ` Dave Young
2013-12-12 6:25 ` Dave Young
2013-12-12 7:17 ` Dave Young
2013-12-12 7:17 ` Dave Young
2013-12-12 7:17 ` Dave Young
2013-12-12 21:04 ` Borislav Petkov
2013-12-12 21:04 ` Borislav Petkov
2013-12-12 21:04 ` Borislav Petkov
2013-12-13 7:27 ` Dave Young
2013-12-13 7:27 ` Dave Young
2013-12-13 7:27 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 10/14] efi: only print saved efi runtime maps instead of all memmap ranges for kexec Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-13 16:01 ` Borislav Petkov
2013-12-13 16:01 ` Borislav Petkov
2013-12-16 2:00 ` Dave Young
2013-12-16 2:00 ` Dave Young
2013-12-16 2:00 ` Dave Young
2013-12-16 11:33 ` Borislav Petkov
2013-12-16 11:33 ` Borislav Petkov
2013-12-16 11:33 ` Borislav Petkov
2013-12-17 6:34 ` Dave Young
2013-12-17 6:34 ` Dave Young
2013-12-17 6:34 ` Dave Young
2013-12-17 15:58 ` Borislav Petkov
2013-12-17 15:58 ` Borislav Petkov
2013-12-17 15:58 ` Borislav Petkov
2013-12-18 2:06 ` Dave Young
2013-12-18 2:06 ` Dave Young
2013-12-18 2:06 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 11/14] x86: add xloadflags bit for efi runtime support on kexec Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` [PATCH v5 12/14] x86: export x86 boot_params to sysfs Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-13 20:04 ` Borislav Petkov
2013-12-13 20:04 ` Borislav Petkov
2013-12-13 20:04 ` Borislav Petkov
2013-12-09 9:42 ` [PATCH v5 13/14] x86: reserve setup_data ranges late after parsing memmap cmdline Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-13 20:04 ` Borislav Petkov
2013-12-13 20:04 ` Borislav Petkov
2013-12-13 20:04 ` Borislav Petkov
2013-12-09 9:42 ` [PATCH v5 14/14] x86: kdebugfs do not use __va for getting setup_data virt addr Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-09 9:42 ` Dave Young
2013-12-10 23:25 ` [PATCH v5 00/14] kexec kernel efi runtime support Andrew Morton
2013-12-10 23:25 ` Andrew Morton
2013-12-10 23:25 ` Andrew Morton
2013-12-10 23:32 ` Borislav Petkov
2013-12-10 23:32 ` Borislav Petkov
2013-12-10 23:38 ` H. Peter Anvin
2013-12-10 23:38 ` H. Peter Anvin
2013-12-10 23:38 ` H. Peter Anvin
2013-12-11 12:37 ` Matt Fleming
2013-12-11 12:37 ` Matt Fleming
2013-12-11 12:37 ` Matt Fleming
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131211185520.GG23793@pd.tnic \
--to=bp@alien8.de \
--cc=James.Bottomley@HansenPartnership.com \
--cc=dyoung@redhat.com \
--cc=ebiederm@xmission.com \
--cc=greg@kroah.com \
--cc=horms@verge.net.au \
--cc=hpa@zytor.com \
--cc=kexec@lists.infradead.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=matt@console-pimps.org \
--cc=mjg59@srcf.ucam.org \
--cc=toshi.kani@hp.com \
--cc=vgoyal@redhat.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.