[PATCH 1/2] kexec: add phys_offset field

Dave Anderson anderson at redhat.com
Thu Apr 29 13:55:39 EDT 2010


----- "Mika Westerberg" <ext-mika.1.westerberg at nokia.com> wrote:

> So how about following? This allows ARM (and maybe some future archs as well) to
> redefine phys_to_virt() but default implementation should work with
> others.
> 
> Thanks,
> MW

Looks like a reasonable approach to me.  

BTW, your phys_to_virt() function comments read: "virt_to_phys".

Thanks,
  Dave

> 
> >From dcfda0e78ae9bfe3c9ff5d186c660e5ce1892fbb Mon Sep 17 00:00:00 2001
> From: Mika Westerberg <ext-mika.1.westerberg at nokia.com>
> Date: Thu, 29 Apr 2010 11:07:14 +0300
> Subject: [PATCH] kexec: introduce phys_to_virt() function
> 
> This function is used by ELF crashdump code which prepares crash memory headers
> for the dump capture kernel. Most architecture can use default version which
> just adds PAGE_OFFSET to the virtual address but some architectures might need
> some special handling.
> 
> Signed-off-by: Mika Westerberg <ext-mika.1.westerberg at nokia.com>
> ---
>  kexec/Makefile        |    2 ++
>  kexec/crashdump-elf.c |    2 +-
>  kexec/crashdump.h     |    3 +++
>  kexec/phys_to_virt.c  |   16 ++++++++++++++++
>  4 files changed, 22 insertions(+), 1 deletions(-)
>  create mode 100644 kexec/phys_to_virt.c
> 
> diff --git a/kexec/Makefile b/kexec/Makefile
> index 4e091ba..77f37ae 100644
> --- a/kexec/Makefile
> +++ b/kexec/Makefile
> @@ -39,6 +39,8 @@ $(ARCH)_PROC_IOMEM		= kexec/proc_iomem.c
>  KEXEC_SRCS += $($(ARCH)_PROC_IOMEM)
>  $(ARCH)_VIRT_TO_PHYS		= kexec/virt_to_phys.c
>  KEXEC_SRCS += $($(ARCH)_VIRT_TO_PHYS)
> +$(ARCH)_PHYS_TO_VIRT		= kexec/phys_to_virt.c
> +KEXEC_SRCS += $($(ARCH)_PHYS_TO_VIRT)
>  $(ARCH)_ADD_SEGMENT		= kexec/add_segment.c
>  KEXEC_SRCS += $($(ARCH)_ADD_SEGMENT)
>  $(ARCH)_ADD_BUFFER		= kexec/add_buffer.c
> diff --git a/kexec/crashdump-elf.c b/kexec/crashdump-elf.c
> index 6bcef8d..f000e42 100644
> --- a/kexec/crashdump-elf.c
> +++ b/kexec/crashdump-elf.c
> @@ -236,7 +236,7 @@ int FUNC(struct kexec_info *info,
>  		 * memory region.
>  		 */
>  		phdr->p_paddr = mstart;
> -		phdr->p_vaddr = mstart + elf_info->page_offset;
> +		phdr->p_vaddr = phys_to_virt(elf_info, mstart);
>  		phdr->p_filesz	= phdr->p_memsz	= mend - mstart + 1;
>  		/* Do we need any alignment of segments? */
>  		phdr->p_align	= 0;
> diff --git a/kexec/crashdump.h b/kexec/crashdump.h
> index 30d6f29..b6e60cc 100644
> --- a/kexec/crashdump.h
> +++ b/kexec/crashdump.h
> @@ -46,6 +46,9 @@ int crash_create_elf64_headers(struct kexec_info
> *info,
>  
>  unsigned long crash_architecture(struct crash_elf_info *elf_info);
>  
> +unsigned long phys_to_virt(struct crash_elf_info *elf_info,
> +			   unsigned long paddr);
> +
>  int xen_present(void);
>  unsigned long xen_architecture(struct crash_elf_info *elf_info);
>  int xen_get_nr_phys_cpus(void);
> diff --git a/kexec/phys_to_virt.c b/kexec/phys_to_virt.c
> new file mode 100644
> index 0000000..2370e56
> --- /dev/null
> +++ b/kexec/phys_to_virt.c
> @@ -0,0 +1,16 @@
> +#include "kexec.h"
> +#include "crashdump.h"
> +
> +/**
> + * virt_to_phys() - translate physical address to virtual address
> + * @paddr: physical address to translate
> + *
> + * For most architectures physical address is simply virtual address minus
> + * PAGE_OFFSET. Architectures that don't follow this convention should provide
> + * their own implementation.
> + */
> +unsigned long
> +phys_to_virt(struct crash_elf_info *elf_info, unsigned long paddr)
> +{
> +	return paddr + elf_info->page_offset;
> +}
> -- 
> 1.5.6.5



More information about the kexec mailing list