[PATCH 1/2] kexec: add phys_offset field

Mika Westerberg ext-mika.1.westerberg at nokia.com
Wed Apr 28 10:01:33 EDT 2010

On Tue, Apr 27, 2010 at 03:08:54PM +0200, ext Dave Anderson wrote:
> ----- "Mika Westerberg" <ext-mika.1.westerberg at nokia.com> wrote:
> > 
> > Idea here was to make sure that virtual addresses in PT_LOAD segments are
> > calculated correctly based on PHYS_OFFSET field. For example with OMAP3,
> > physical memory starts at 0x80000000 so for 0xc0000000 (PAGE_OFFSET) 
> > we get:
> > 
> > 	phdr->p_vaddr = 0x80000000 + 0xc0000000 = 0x40000000
> > 
> > which is not correct. But taking PHYS_OFFSET into equation we get
> > 
> > 	phdr->p_vaddr = 0x80000000 + 0xc0000000 - 0x80000000 = 0xc0000000
> > 
> > which is correct.
> Yes, I understand completely -- we've been there...  ;-)
> The issue is that there would be a disconnect between the actual kernel
> virtual addresses used in the vmlinux file vs. your "calculated" virtual
> addresses in the header, and to me that goes against the grain of what
> the p_vaddr field is supposed to mean. 
> The ELF spec defines them:
>   p_vaddr  This member gives the virtual address at which the first
>            byte of the segment resides in memory.
>   p_paddr  On systems for which physical addressing is relevant, this
>            member is reserved for the segment's physical address.
>            Because System V ignores physical addressing for application
>            programs, this member has unspecified contents for executable
>            files and shared objects.
> To me, the term "virtual address" means the virtual addresses used by the
> executable.  Your scheme "calculates" a p_vaddr based upon the p_paddr.

Sorry, I have to ask some clarifications to understand this.

If the kernel image is linked at virtual address 0xc0008000 which is the case
with ARM kernel for example. Then how following is legitimate kernel virtual

	phdr->p_vaddr = mstart + elf_info->page_offset;

if the first physical memory region starts for example at 0x80000000, and
PAGE_OFFSET is 0xc0000000 we get:

	phdr->p_vaddr = 0x80000000 + 0xc0000000

this results virtual address 0x40000000 (in 32-bit) for the kernel direct mapped
region, which I think is not the same as used by the executable (the vmlinux

% objdump -h vmlinux

vmlinux:     file format elf32-little

Idx Name          Size      VMA       LMA       File off  Algn
  0 .note.gnu.build-id 00000024  00000000  00000000  00008000  2**2
  1 .init         0001f6ed  c0008000  c0008000  00010000  2**5
                  CONTENTS, ALLOC, LOAD, CODE
  2 .text         0031706a  c0028000  c0028000  00030000  2**6

Am I missing something?

Thanks again,

More information about the kexec mailing list