Index: head/sys/amd64/amd64/xen-locore.S =================================================================== --- head/sys/amd64/amd64/xen-locore.S +++ head/sys/amd64/amd64/xen-locore.S @@ -47,7 +47,7 @@ ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION, .asciz, __XSTRING(__FreeBSD_version)) ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz, "xen-3.0") ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE, .quad, KERNBASE) - ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, .quad, KERNBASE) /* Xen honours elf->p_paddr; compensate for this */ + ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, .quad, 0) ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, .quad, xen_start) ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad, hypercall_page) ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW, .quad, HYPERVISOR_VIRT_START) Index: head/sys/conf/ldscript.amd64 =================================================================== --- head/sys/conf/ldscript.amd64 +++ head/sys/conf/ldscript.amd64 @@ -8,7 +8,12 @@ /* Read-only sections, merged into text segment: */ kernphys = CONSTANT (MAXPAGESIZE); . = kernbase + kernphys + SIZEOF_HEADERS; - .interp : { *(.interp) } + /* + * Use the AT keyword in order to set the right LMA that contains + * the physical address where the section should be loaded. This is + * needed for the Xen loader which honours the LMA. + */ + .interp : AT (kernphys + SIZEOF_HEADERS) { *(.interp) } .hash : { *(.hash) } .gnu.hash : { *(.gnu.hash) } .dynsym : { *(.dynsym) }