Re: [patch 5/7 v2] export efi runtime memory mapping to sysfs

2013-11-19 Thread Matt Fleming
On Mon, 18 Nov, at 10:16:41AM, Dave Young wrote:
> Matt, desc_version is already in boot_params.efi_info, so kexec-tools
> can get the version from there. I do not need to export it as another
> file.
 
OK, cool.

> I think for now we do not need worry much about the compatibility
> issue, do you think I need add version checking in kexec-tools
> currently? like below?
> 
> if (desc_version != 1) /* current version is 1? */
>   error out it is not supported

Yes, something like that. If you already have kexec-specific ways of
checking a version number then that's fine. Just make sure that, if the
EFI memory descriptor structure is extended in the future and more files
are exported for each descriptor, kexec-tools say "I don't know how to
build a data structure for from these files".

-- 
Matt Fleming, Intel Open Source Technology Center
--
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/


Re: [patch 5/7 v2] export efi runtime memory mapping to sysfs

2013-11-19 Thread Matt Fleming
On Mon, 18 Nov, at 10:16:41AM, Dave Young wrote:
 Matt, desc_version is already in boot_params.efi_info, so kexec-tools
 can get the version from there. I do not need to export it as another
 file.
 
OK, cool.

 I think for now we do not need worry much about the compatibility
 issue, do you think I need add version checking in kexec-tools
 currently? like below?
 
 if (desc_version != 1) /* current version is 1? */
   error out it is not supported

Yes, something like that. If you already have kexec-specific ways of
checking a version number then that's fine. Just make sure that, if the
EFI memory descriptor structure is extended in the future and more files
are exported for each descriptor, kexec-tools say I don't know how to
build a data structure for from these files.

-- 
Matt Fleming, Intel Open Source Technology Center
--
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/


Re: [patch 5/7 v2] export efi runtime memory mapping to sysfs

2013-11-17 Thread Dave Young
> > > +/*
> > > + * These are default attributes that are added for every memmap entry.
> > > + */
> > > +static struct attribute *def_attrs[] = {
> > > + _type_attr.attr,
> > > + _phys_addr_attr.attr,
> > > + _virt_addr_attr.attr,
> > > + _num_pages_attr.attr,
> > > + _attribute_attr.attr,
> > > + NULL
> > > +};
> > 
> > If the UEFI spec ever releases an update for the memory descriptor
> > structure, and bumps 'memmap.desc_version', how are we going to signal
> > the incompatibility to legacy versions of kexec tools?
> 
> Hmm, that is a problem. I will consider to export memmap according to
> what firmware provided with extra desc_version instead of using attrs from 
> kernel
> data structure efi_memory_desc_t
> 

Matt, desc_version is already in boot_params.efi_info, so kexec-tools can get
the version from there. I do not need to export it as another file.

I think for now we do not need worry much about the compatibility issue, do you
think I need add version checking in kexec-tools currently? like below?

if (desc_version != 1) /* current version is 1? */
error out it is not supported

--
Thanks
Dave
--
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/


Re: [patch 5/7 v2] export efi runtime memory mapping to sysfs

2013-11-17 Thread Dave Young
   +/*
   + * These are default attributes that are added for every memmap entry.
   + */
   +static struct attribute *def_attrs[] = {
   + map_type_attr.attr,
   + map_phys_addr_attr.attr,
   + map_virt_addr_attr.attr,
   + map_num_pages_attr.attr,
   + map_attribute_attr.attr,
   + NULL
   +};
  
  If the UEFI spec ever releases an update for the memory descriptor
  structure, and bumps 'memmap.desc_version', how are we going to signal
  the incompatibility to legacy versions of kexec tools?
 
 Hmm, that is a problem. I will consider to export memmap according to
 what firmware provided with extra desc_version instead of using attrs from 
 kernel
 data structure efi_memory_desc_t
 

Matt, desc_version is already in boot_params.efi_info, so kexec-tools can get
the version from there. I do not need to export it as another file.

I think for now we do not need worry much about the compatibility issue, do you
think I need add version checking in kexec-tools currently? like below?

if (desc_version != 1) /* current version is 1? */
error out it is not supported

--
Thanks
Dave
--
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/


Re: [patch 5/7 v2] export efi runtime memory mapping to sysfs

2013-11-13 Thread Dave Young
On 11/13/13 at 03:50pm, Matt Fleming wrote:
> On Tue, 05 Nov, at 04:20:12PM, dyo...@redhat.com 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 directly /sys/firmware/efi/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
> > 
> > It will not work for efi 32bit. Only x86_64 currently.
> > 
> > Signed-off-by: Dave Young 
> > ---
> >  Documentation/ABI/testing/sysfs-efi-runtime-map |   45 ++
> >  arch/x86/include/asm/efi.h  |3 
> >  arch/x86/platform/efi/efi.c |   11 +
> >  drivers/firmware/efi/Kconfig|   10 +
> >  drivers/firmware/efi/Makefile   |1 
> >  drivers/firmware/efi/efi-runtime-map.c  |  164 
> > 
> >  drivers/firmware/efi/efi.c  |3 
> >  include/linux/efi.h |6 
> >  8 files changed, 242 insertions(+), 1 deletion(-)
> 
> [...]
> 
> > @@ -852,6 +855,14 @@ static void efi_map_regions(void **new_m
> >  
> > memcpy(*new_memmap + (*count * memmap.desc_size), md,
> >memmap.desc_size);
> > +   if (md->type != EFI_BOOT_SERVICES_CODE &&
> > +   md->type != EFI_BOOT_SERVICES_DATA) {
> > +   efi_runtime_map = krealloc(efi_runtime_map,
> > +   (nr_efi_runtime_map + 1) *
> > +   sizeof(efi_memory_desc_t), GFP_KERNEL);
> > +   *(efi_runtime_map + nr_efi_runtime_map) = *md;
> > +   nr_efi_runtime_map++;
> > +   }
> > (*count)++;
> > }
> 
> You really need to be using 'memmap.desc_size' here and not
> sizeof(efi_memory_desc_t) as the two may differ. Also, you should be
> checking for failure of krealloc() and using memcpy() instead of
> directly dereferencing 'md'.

I'm a bit confused with the desc_size and sizeof(efi_memory_desc_t),
Because I intended to same struct efi_memory_desc_t in userspace to pass the
setup_data, so I worry about if desc_size will cause problems.

Will double check it.

> 
> > --- linux-2.6.orig/drivers/firmware/efi/Makefile
> > +++ linux-2.6/drivers/firmware/efi/Makefile
> > @@ -4,3 +4,4 @@
> >  obj-y  += efi.o vars.o
> >  obj-$(CONFIG_EFI_VARS) += efivars.o
> >  obj-$(CONFIG_EFI_VARS_PSTORE)  += efi-pstore.o
> > +obj-$(CONFIG_EFI_RUNTIME_MAP)  += efi-runtime-map.o
> > --- /dev/null
> > +++ linux-2.6/drivers/firmware/efi/efi-runtime-map.c
> 
> Small nit but I wouldn't bother prefixing the filename with "efi-",
> since you can't build this file as a module.

Ok, will do

> 
> > +/*
> > + * These are default attributes that are added for every memmap entry.
> > + */
> > +static struct attribute *def_attrs[] = {
> > +   _type_attr.attr,
> > +   _phys_addr_attr.attr,
> > +   _virt_addr_attr.attr,
> > +   _num_pages_attr.attr,
> > +   _attribute_attr.attr,
> > +   NULL
> > +};
> 
> If the UEFI spec ever releases an update for the memory descriptor
> structure, and bumps 'memmap.desc_version', how are we going to signal
> the incompatibility to legacy versions of kexec tools?

Hmm, that is a problem. I will consider to export memmap according to
what firmware provided with extra desc_version instead of using attrs from 
kernel
data structure efi_memory_desc_t

Now it's clear for previous question about desc_size and 
sizeof(efi_memory_desc_t)
Will switch to use desc_size.

> 
> -- 
> Matt Fleming, Intel Open Source Technology Center
--
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/


Re: [patch 5/7 v2] export efi runtime memory mapping to sysfs

2013-11-13 Thread Matt Fleming
On Tue, 05 Nov, at 04:20:12PM, dyo...@redhat.com 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 directly /sys/firmware/efi/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
> 
> It will not work for efi 32bit. Only x86_64 currently.
> 
> Signed-off-by: Dave Young 
> ---
>  Documentation/ABI/testing/sysfs-efi-runtime-map |   45 ++
>  arch/x86/include/asm/efi.h  |3 
>  arch/x86/platform/efi/efi.c |   11 +
>  drivers/firmware/efi/Kconfig|   10 +
>  drivers/firmware/efi/Makefile   |1 
>  drivers/firmware/efi/efi-runtime-map.c  |  164 
> 
>  drivers/firmware/efi/efi.c  |3 
>  include/linux/efi.h |6 
>  8 files changed, 242 insertions(+), 1 deletion(-)

[...]

> @@ -852,6 +855,14 @@ static void efi_map_regions(void **new_m
>  
>   memcpy(*new_memmap + (*count * memmap.desc_size), md,
>  memmap.desc_size);
> + if (md->type != EFI_BOOT_SERVICES_CODE &&
> + md->type != EFI_BOOT_SERVICES_DATA) {
> + efi_runtime_map = krealloc(efi_runtime_map,
> + (nr_efi_runtime_map + 1) *
> + sizeof(efi_memory_desc_t), GFP_KERNEL);
> + *(efi_runtime_map + nr_efi_runtime_map) = *md;
> + nr_efi_runtime_map++;
> + }
>   (*count)++;
>   }

You really need to be using 'memmap.desc_size' here and not
sizeof(efi_memory_desc_t) as the two may differ. Also, you should be
checking for failure of krealloc() and using memcpy() instead of
directly dereferencing 'md'.

> --- linux-2.6.orig/drivers/firmware/efi/Makefile
> +++ linux-2.6/drivers/firmware/efi/Makefile
> @@ -4,3 +4,4 @@
>  obj-y+= efi.o vars.o
>  obj-$(CONFIG_EFI_VARS)   += efivars.o
>  obj-$(CONFIG_EFI_VARS_PSTORE)+= efi-pstore.o
> +obj-$(CONFIG_EFI_RUNTIME_MAP)+= efi-runtime-map.o
> --- /dev/null
> +++ linux-2.6/drivers/firmware/efi/efi-runtime-map.c

Small nit but I wouldn't bother prefixing the filename with "efi-",
since you can't build this file as a module.

> +/*
> + * These are default attributes that are added for every memmap entry.
> + */
> +static struct attribute *def_attrs[] = {
> + _type_attr.attr,
> + _phys_addr_attr.attr,
> + _virt_addr_attr.attr,
> + _num_pages_attr.attr,
> + _attribute_attr.attr,
> + NULL
> +};

If the UEFI spec ever releases an update for the memory descriptor
structure, and bumps 'memmap.desc_version', how are we going to signal
the incompatibility to legacy versions of kexec tools?

-- 
Matt Fleming, Intel Open Source Technology Center
--
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/


Re: [patch 5/7 v2] export efi runtime memory mapping to sysfs

2013-11-13 Thread Matt Fleming
On Tue, 05 Nov, at 04:20:12PM, dyo...@redhat.com 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 directly /sys/firmware/efi/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
 
 It will not work for efi 32bit. Only x86_64 currently.
 
 Signed-off-by: Dave Young dyo...@redhat.com
 ---
  Documentation/ABI/testing/sysfs-efi-runtime-map |   45 ++
  arch/x86/include/asm/efi.h  |3 
  arch/x86/platform/efi/efi.c |   11 +
  drivers/firmware/efi/Kconfig|   10 +
  drivers/firmware/efi/Makefile   |1 
  drivers/firmware/efi/efi-runtime-map.c  |  164 
 
  drivers/firmware/efi/efi.c  |3 
  include/linux/efi.h |6 
  8 files changed, 242 insertions(+), 1 deletion(-)

[...]

 @@ -852,6 +855,14 @@ static void efi_map_regions(void **new_m
  
   memcpy(*new_memmap + (*count * memmap.desc_size), md,
  memmap.desc_size);
 + if (md-type != EFI_BOOT_SERVICES_CODE 
 + md-type != EFI_BOOT_SERVICES_DATA) {
 + efi_runtime_map = krealloc(efi_runtime_map,
 + (nr_efi_runtime_map + 1) *
 + sizeof(efi_memory_desc_t), GFP_KERNEL);
 + *(efi_runtime_map + nr_efi_runtime_map) = *md;
 + nr_efi_runtime_map++;
 + }
   (*count)++;
   }

You really need to be using 'memmap.desc_size' here and not
sizeof(efi_memory_desc_t) as the two may differ. Also, you should be
checking for failure of krealloc() and using memcpy() instead of
directly dereferencing 'md'.

 --- linux-2.6.orig/drivers/firmware/efi/Makefile
 +++ linux-2.6/drivers/firmware/efi/Makefile
 @@ -4,3 +4,4 @@
  obj-y+= efi.o vars.o
  obj-$(CONFIG_EFI_VARS)   += efivars.o
  obj-$(CONFIG_EFI_VARS_PSTORE)+= efi-pstore.o
 +obj-$(CONFIG_EFI_RUNTIME_MAP)+= efi-runtime-map.o
 --- /dev/null
 +++ linux-2.6/drivers/firmware/efi/efi-runtime-map.c

Small nit but I wouldn't bother prefixing the filename with efi-,
since you can't build this file as a module.

 +/*
 + * These are default attributes that are added for every memmap entry.
 + */
 +static struct attribute *def_attrs[] = {
 + map_type_attr.attr,
 + map_phys_addr_attr.attr,
 + map_virt_addr_attr.attr,
 + map_num_pages_attr.attr,
 + map_attribute_attr.attr,
 + NULL
 +};

If the UEFI spec ever releases an update for the memory descriptor
structure, and bumps 'memmap.desc_version', how are we going to signal
the incompatibility to legacy versions of kexec tools?

-- 
Matt Fleming, Intel Open Source Technology Center
--
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/


Re: [patch 5/7 v2] export efi runtime memory mapping to sysfs

2013-11-13 Thread Dave Young
On 11/13/13 at 03:50pm, Matt Fleming wrote:
 On Tue, 05 Nov, at 04:20:12PM, dyo...@redhat.com 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 directly /sys/firmware/efi/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
  
  It will not work for efi 32bit. Only x86_64 currently.
  
  Signed-off-by: Dave Young dyo...@redhat.com
  ---
   Documentation/ABI/testing/sysfs-efi-runtime-map |   45 ++
   arch/x86/include/asm/efi.h  |3 
   arch/x86/platform/efi/efi.c |   11 +
   drivers/firmware/efi/Kconfig|   10 +
   drivers/firmware/efi/Makefile   |1 
   drivers/firmware/efi/efi-runtime-map.c  |  164 
  
   drivers/firmware/efi/efi.c  |3 
   include/linux/efi.h |6 
   8 files changed, 242 insertions(+), 1 deletion(-)
 
 [...]
 
  @@ -852,6 +855,14 @@ static void efi_map_regions(void **new_m
   
  memcpy(*new_memmap + (*count * memmap.desc_size), md,
 memmap.desc_size);
  +   if (md-type != EFI_BOOT_SERVICES_CODE 
  +   md-type != EFI_BOOT_SERVICES_DATA) {
  +   efi_runtime_map = krealloc(efi_runtime_map,
  +   (nr_efi_runtime_map + 1) *
  +   sizeof(efi_memory_desc_t), GFP_KERNEL);
  +   *(efi_runtime_map + nr_efi_runtime_map) = *md;
  +   nr_efi_runtime_map++;
  +   }
  (*count)++;
  }
 
 You really need to be using 'memmap.desc_size' here and not
 sizeof(efi_memory_desc_t) as the two may differ. Also, you should be
 checking for failure of krealloc() and using memcpy() instead of
 directly dereferencing 'md'.

I'm a bit confused with the desc_size and sizeof(efi_memory_desc_t),
Because I intended to same struct efi_memory_desc_t in userspace to pass the
setup_data, so I worry about if desc_size will cause problems.

Will double check it.

 
  --- linux-2.6.orig/drivers/firmware/efi/Makefile
  +++ linux-2.6/drivers/firmware/efi/Makefile
  @@ -4,3 +4,4 @@
   obj-y  += efi.o vars.o
   obj-$(CONFIG_EFI_VARS) += efivars.o
   obj-$(CONFIG_EFI_VARS_PSTORE)  += efi-pstore.o
  +obj-$(CONFIG_EFI_RUNTIME_MAP)  += efi-runtime-map.o
  --- /dev/null
  +++ linux-2.6/drivers/firmware/efi/efi-runtime-map.c
 
 Small nit but I wouldn't bother prefixing the filename with efi-,
 since you can't build this file as a module.

Ok, will do

 
  +/*
  + * These are default attributes that are added for every memmap entry.
  + */
  +static struct attribute *def_attrs[] = {
  +   map_type_attr.attr,
  +   map_phys_addr_attr.attr,
  +   map_virt_addr_attr.attr,
  +   map_num_pages_attr.attr,
  +   map_attribute_attr.attr,
  +   NULL
  +};
 
 If the UEFI spec ever releases an update for the memory descriptor
 structure, and bumps 'memmap.desc_version', how are we going to signal
 the incompatibility to legacy versions of kexec tools?

Hmm, that is a problem. I will consider to export memmap according to
what firmware provided with extra desc_version instead of using attrs from 
kernel
data structure efi_memory_desc_t

Now it's clear for previous question about desc_size and 
sizeof(efi_memory_desc_t)
Will switch to use desc_size.

 
 -- 
 Matt Fleming, Intel Open Source Technology Center
--
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/


[patch 5/7 v2] export efi runtime memory mapping to sysfs

2013-11-05 Thread dyoung
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 directly /sys/firmware/efi/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

It will not work for efi 32bit. Only x86_64 currently.

Signed-off-by: Dave Young 
---
 Documentation/ABI/testing/sysfs-efi-runtime-map |   45 ++
 arch/x86/include/asm/efi.h  |3 
 arch/x86/platform/efi/efi.c |   11 +
 drivers/firmware/efi/Kconfig|   10 +
 drivers/firmware/efi/Makefile   |1 
 drivers/firmware/efi/efi-runtime-map.c  |  164 
 drivers/firmware/efi/efi.c  |3 
 include/linux/efi.h |6 
 8 files changed, 242 insertions(+), 1 deletion(-)

--- linux-2.6.orig/arch/x86/platform/efi/efi.c
+++ linux-2.6/arch/x86/platform/efi/efi.c
@@ -76,6 +76,9 @@ static __initdata efi_config_table_type_
{NULL_GUID, NULL, NULL},
 };
 
+efi_memory_desc_t *efi_runtime_map;
+int nr_efi_runtime_map;
+
 /*
  * Returns 1 if 'facility' is enabled, 0 otherwise.
  */
@@ -852,6 +855,14 @@ static void efi_map_regions(void **new_m
 
memcpy(*new_memmap + (*count * memmap.desc_size), md,
   memmap.desc_size);
+   if (md->type != EFI_BOOT_SERVICES_CODE &&
+   md->type != EFI_BOOT_SERVICES_DATA) {
+   efi_runtime_map = krealloc(efi_runtime_map,
+   (nr_efi_runtime_map + 1) *
+   sizeof(efi_memory_desc_t), GFP_KERNEL);
+   *(efi_runtime_map + nr_efi_runtime_map) = *md;
+   nr_efi_runtime_map++;
+   }
(*count)++;
}
 
--- linux-2.6.orig/drivers/firmware/efi/Kconfig
+++ linux-2.6/drivers/firmware/efi/Kconfig
@@ -36,4 +36,14 @@ config EFI_VARS_PSTORE_DEFAULT_DISABLE
  backend for pstore by default. This setting can be overridden
  using the efivars module's pstore_disable parameter.
 
+config EFI_RUNTIME_MAP
+   bool "Add efi runtime map to sysfs" if EXPERT
+   default X86 && EFI
+   help
+ Add the efi runtime memory map 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-efi-runtime-map.
+
 endmenu
--- linux-2.6.orig/drivers/firmware/efi/Makefile
+++ linux-2.6/drivers/firmware/efi/Makefile
@@ -4,3 +4,4 @@
 obj-y  += efi.o vars.o
 obj-$(CONFIG_EFI_VARS) += efivars.o
 obj-$(CONFIG_EFI_VARS_PSTORE)  += efi-pstore.o
+obj-$(CONFIG_EFI_RUNTIME_MAP)  += efi-runtime-map.o
--- /dev/null
+++ linux-2.6/drivers/firmware/efi/efi-runtime-map.c
@@ -0,0 +1,164 @@
+/*
+ * linux/drivers/efi/efi-runtime-map.c
+ * Copyright (C) 2013 Red Hat, Inc., Dave Young 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License v2.0 as published by
+ * the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct efi_runtime_map_entry {
+   efi_memory_desc_t md;
+   struct kobject kobj;   /* kobject for each entry */
+};
+
+static struct efi_runtime_map_entry *map_entries;
+
+static ssize_t map_attr_show(struct kobject *kobj,
+   struct attribute *attr, char *buf);
+static ssize_t type_show(struct efi_runtime_map_entry *entry, char *buf);
+static ssize_t phys_addr_show(struct efi_runtime_map_entry *entry, char *buf);
+static ssize_t virt_addr_show(struct efi_runtime_map_entry *entry, char *buf);
+static ssize_t num_pages_show(struct efi_runtime_map_entry *entry, char *buf);
+static ssize_t attribute_show(struct efi_runtime_map_entry *entry, char *buf);
+
+struct map_attribute {
+   struct attribute attr;
+   ssize_t (*show)(struct efi_runtime_map_entry *entry, char *buf);
+};
+
+static struct map_attribute map_type_attr = __ATTR_RO(type);
+static struct map_attribute map_phys_addr_attr   = __ATTR_RO(phys_addr);
+static struct map_attribute map_virt_addr_attr  = __ATTR_RO(virt_addr);
+static struct map_attribute map_num_pages_attr  = __ATTR_RO(num_pages);
+static struct map_attribute map_attribute_attr  = __ATTR_RO(attribute);
+
+/*
+ * These are default 

[patch 5/7 v2] export efi runtime memory mapping to sysfs

2013-11-05 Thread dyoung
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 directly /sys/firmware/efi/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

It will not work for efi 32bit. Only x86_64 currently.

Signed-off-by: Dave Young dyo...@redhat.com
---
 Documentation/ABI/testing/sysfs-efi-runtime-map |   45 ++
 arch/x86/include/asm/efi.h  |3 
 arch/x86/platform/efi/efi.c |   11 +
 drivers/firmware/efi/Kconfig|   10 +
 drivers/firmware/efi/Makefile   |1 
 drivers/firmware/efi/efi-runtime-map.c  |  164 
 drivers/firmware/efi/efi.c  |3 
 include/linux/efi.h |6 
 8 files changed, 242 insertions(+), 1 deletion(-)

--- linux-2.6.orig/arch/x86/platform/efi/efi.c
+++ linux-2.6/arch/x86/platform/efi/efi.c
@@ -76,6 +76,9 @@ static __initdata efi_config_table_type_
{NULL_GUID, NULL, NULL},
 };
 
+efi_memory_desc_t *efi_runtime_map;
+int nr_efi_runtime_map;
+
 /*
  * Returns 1 if 'facility' is enabled, 0 otherwise.
  */
@@ -852,6 +855,14 @@ static void efi_map_regions(void **new_m
 
memcpy(*new_memmap + (*count * memmap.desc_size), md,
   memmap.desc_size);
+   if (md-type != EFI_BOOT_SERVICES_CODE 
+   md-type != EFI_BOOT_SERVICES_DATA) {
+   efi_runtime_map = krealloc(efi_runtime_map,
+   (nr_efi_runtime_map + 1) *
+   sizeof(efi_memory_desc_t), GFP_KERNEL);
+   *(efi_runtime_map + nr_efi_runtime_map) = *md;
+   nr_efi_runtime_map++;
+   }
(*count)++;
}
 
--- linux-2.6.orig/drivers/firmware/efi/Kconfig
+++ linux-2.6/drivers/firmware/efi/Kconfig
@@ -36,4 +36,14 @@ config EFI_VARS_PSTORE_DEFAULT_DISABLE
  backend for pstore by default. This setting can be overridden
  using the efivars module's pstore_disable parameter.
 
+config EFI_RUNTIME_MAP
+   bool Add efi runtime map to sysfs if EXPERT
+   default X86  EFI
+   help
+ Add the efi runtime memory map 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-efi-runtime-map.
+
 endmenu
--- linux-2.6.orig/drivers/firmware/efi/Makefile
+++ linux-2.6/drivers/firmware/efi/Makefile
@@ -4,3 +4,4 @@
 obj-y  += efi.o vars.o
 obj-$(CONFIG_EFI_VARS) += efivars.o
 obj-$(CONFIG_EFI_VARS_PSTORE)  += efi-pstore.o
+obj-$(CONFIG_EFI_RUNTIME_MAP)  += efi-runtime-map.o
--- /dev/null
+++ linux-2.6/drivers/firmware/efi/efi-runtime-map.c
@@ -0,0 +1,164 @@
+/*
+ * linux/drivers/efi/efi-runtime-map.c
+ * Copyright (C) 2013 Red Hat, Inc., Dave Young dyo...@redhat.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License v2.0 as published by
+ * the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include linux/string.h
+#include linux/kernel.h
+#include linux/module.h
+#include linux/types.h
+#include linux/efi.h
+#include linux/slab.h
+
+struct efi_runtime_map_entry {
+   efi_memory_desc_t md;
+   struct kobject kobj;   /* kobject for each entry */
+};
+
+static struct efi_runtime_map_entry *map_entries;
+
+static ssize_t map_attr_show(struct kobject *kobj,
+   struct attribute *attr, char *buf);
+static ssize_t type_show(struct efi_runtime_map_entry *entry, char *buf);
+static ssize_t phys_addr_show(struct efi_runtime_map_entry *entry, char *buf);
+static ssize_t virt_addr_show(struct efi_runtime_map_entry *entry, char *buf);
+static ssize_t num_pages_show(struct efi_runtime_map_entry *entry, char *buf);
+static ssize_t attribute_show(struct efi_runtime_map_entry *entry, char *buf);
+
+struct map_attribute {
+   struct attribute attr;
+   ssize_t (*show)(struct efi_runtime_map_entry *entry, char *buf);
+};
+
+static struct map_attribute map_type_attr = __ATTR_RO(type);
+static struct map_attribute map_phys_addr_attr   = __ATTR_RO(phys_addr);
+static struct map_attribute map_virt_addr_attr  = __ATTR_RO(virt_addr);
+static struct map_attribute map_num_pages_attr  = __ATTR_RO(num_pages);