On Thu, Sep 15, 2011 at 8:12 PM, Simon Horman <horms at verge.net.au> wrote: > Previously virt_to_phys() assumed that physical memory always started > at address 0. This is not always the case. I think most boards have NOR Flash or ROM mapped at physical address 0. For more information please have a look at: arch/sh/boards/mach-ecovec24/setup.c > --- a/kexec/arch/sh/kexec-sh.c > +++ b/kexec/arch/sh/kexec-sh.c > @@ -188,10 +188,18 @@ void kexec_sh_setup_zero_page(char *zero_page_buf, size_t zero_page_size, > ?unsigned long virt_to_phys(unsigned long addr) > ?{ > ? ? ? ?unsigned long seg = addr & 0xe0000000; > + ? ? ? unsigned long long start, end; > + ? ? ? int ret; > + > + ? ? ? /* Assume there is only one "System RAM" region */ > + ? ? ? ret = parse_iomem_single("System RAM\n", &start, &end); > + ? ? ? if (ret) > + ? ? ? ? ? ? ? die("Could not parse System RAM region in /proc/iomem\n"); > + > ? ? ? ?if (seg != 0x80000000 && seg != 0xc0000000) > ? ? ? ? ? ? ? ?die("Virtual address %p is not in P1 or P2\n", (void *)addr); > > - ? ? ? return addr - seg; > + ? ? ? return addr - seg + start; > ?} This will most likely also change how 29-bit platforms translate their addresses, not sure if that's what you want to do. Thanks, / magnus