[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |