[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] Elf loader fixes




This is a good start as the PHYS vs. VIRT stuff in the ELF loader
is all a bit overloaded. However, I believe these changes aren't
quite complete and for example would break the released OpenSolaris Xen
client.  It has multiple PT_LOAD sections in the Elf file,
some with p_vaddr == p_paddr on purpose and some which don't. We rely on a
"boot loader" (ie grub or domain builder) that only cares about p_paddr.
The identity mapped PT_LOAD section contains the OS entry point and
has the code to remap the other of the sections to the final VA by
creating/installing new page table entries.

For example, I think the xc_load_elf.c change:

@@ -189,7 +189,18 @@

         for ( done = 0; done < phdr->p_filesz; done += chunksz )
         {
-            pa = (phdr->p_paddr + done) - dsi->v_start;
+            if (phdr->p_paddr == phdr->p_vaddr) {
+                /*
+                 * Bug compatibility alert: In older linux kernels
+                 * p_paddr is broken, it doesn't contain the physical
+                 * address but instead is identical to p_vaddr.  Thus
+                 * we can't use it directly, instead we'll guess it
+                 * using dsi->v_start.
+                 */
+                pa = (phdr->p_vaddr + done) - dsi->v_start;
+            } else {
+                pa = (phdr->p_paddr + done);
+            }
             va = xc_map_foreign_range(
                 xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
             chunksz = phdr->p_filesz - done;

needs to have the line:
        pa = (phdr->p_paddr + done);
be more like:
        pa = (phdr->p_paddr + done) - kernstart;

or better yet add a dsi->p_start and dsi->p_end to use. The same
applies to your change to xen/common/elf.c for dom0.

To save you downloading OpenSolaris. Here's sample values from
the domU/dom0 ELF image:

In the xenguest section we currently specify VIRT_BASE=0x40000000, as
there was no PHYS_BASE=. In the flavor of your other changes, I'd expect
you could add PHYS_BASE= and OpenSolaris would change to use that.

  e_entry:            0x40800000

Program Header[0]:
    p_vaddr:      0x40800000      p_flags:    [ PF_X  PF_W  PF_R ]
    p_paddr:      0x40800000      p_type:     [ PT_LOAD ]
    p_filesz:     0xe95c          p_memsz:    0xe95c
    p_offset:     0xd4            p_align:    0

Program Header[1]:
    p_vaddr:      0xfb400000      p_flags:    [ PF_X  PF_R ]
    p_paddr:      0x40000000      p_type:     [ PT_LOAD ]
    p_filesz:     0x2aa362        p_memsz:    0x2aa362
    p_offset:     0xea40          p_align:    0

Program Header[2]:
    p_vaddr:      0xfb800000      p_flags:    [ PF_X  PF_W  PF_R ]
    p_paddr:      0x40400000      p_type:     [ PT_LOAD ]
    p_filesz:     0x16515         p_memsz:    0x94a44
    p_offset:     0x2b8dc0        p_align:    0

Here's sample values we use for the 64 bit Xen OS image:

  e_entry:            0x40800000

Program Header[0]:
    p_vaddr:      0x40800000      p_flags:    [ PF_X  PF_W  PF_R ]
    p_paddr:      0x40800000      p_type:     [ PT_LOAD ]
    p_filesz:     0xed28          p_memsz:    0xed28
    p_offset:     0x190           p_align:    0

Program Header[1]:
    p_vaddr:      0xfffffffffb800000  p_flags:    [ PF_X  PF_R ]
    p_paddr:      0x40000000      p_type:     [ PT_LOAD ]
    p_filesz:     0x39adca        p_memsz:    0x39adca
    p_offset:     0xeec0          p_align:    0

Program Header[2]:
    p_vaddr:      0xfffffffffbc00000  p_flags:    [ PF_X  PF_W  PF_R ]
    p_paddr:      0x40400000      p_type:     [ PT_LOAD ]
    p_filesz:     0x20fe9         p_memsz:    0xe36c0
    p_offset:     0x3a9cc0        p_align:    0


Joe

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.