Hi,

 From my limited understanding, the current functionality of booting xen 
relies on the old-style elfnote:
__xen_guest section.  When I remove the old style elf note so it tries 
the new style ones, it fails to boot.

hypcalls is an absolute address, not a page number, so the new style 
macro is already wrong.
I changed it to 0x2 so it matches the old booting elfnote.

Thanks,
Damien

On 10/7/26 8:00 am, Samuel Thibault wrote:
> Bradley Morgan, le sam. 04 juil. 2026 15:11:53 +0100, a ecrit:
>> On July 4, 2026 4:58:52 AM GMT+01:00, Damien Zammit <[email protected]>
>> wrote:
>>> Bump the version of gnumach xen, and also fix 64b booting.
>>> ---
>>> i386/xen/xen_boothdr.S |  6 +++---
>>> x86_64/xen_boothdr.S   | 11 ++++++-----
>>> 2 files changed, 9 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/i386/xen/xen_boothdr.S b/i386/xen/xen_boothdr.S
>>> index 4704c66f..6cc9e3d9 100644
>>> --- a/i386/xen/xen_boothdr.S
>>> +++ b/i386/xen/xen_boothdr.S
>>> @@ -20,7 +20,7 @@
>>>
>>> .section __xen_guest
>>>     .ascii  "GUEST_OS=GNU Mach"
>>> -   .ascii  ",GUEST_VERSION=1.3"
>>> +   .ascii  ",GUEST_VERSION=1.8"
>>>     .ascii  ",XEN_VER=xen-3.0"
>>>     .ascii  ",VIRT_BASE=0xC0000000"
>>>     .ascii  ",ELF_PADDR_OFFSET=0xC0000000"
>>> @@ -61,12 +61,12 @@
>>> .popsection                         ;
>>>
>>>     ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,              .asciz, "GNU Mach")
>>> -   ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,         .asciz, "1.3")
>>> +   ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,         .asciz, "1.8")
>>>     ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,           .asciz, "xen-3.0")
>>>     ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,             .long,  _START)
>>>     ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,          .long,  _START)
>>>     ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,                 .long,  start)
>>> -   ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE,        .long,  hypcalls)
>>> +   ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE,        .long,  0x2)
>> Why? This could break boot if xen tries to write stubs to 0x2..
> Yes, I'm completely surprised by this.
>
> The XEN_ELFNOTE_HYPERCALL_PAGE macro happens to be 2, but that's just a
> convention. We are really supposed to tell the hypervisor which page we
> use for hypercall.
>
>>> #if PAE
>>>     ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,              .asciz, 
>>> "yes[extended-cr3]")
>>> #else
>>> diff --git a/x86_64/xen_boothdr.S b/x86_64/xen_boothdr.S
>>> index da40a5c0..0924aa20 100644
>>> --- a/x86_64/xen_boothdr.S
>>> +++ b/x86_64/xen_boothdr.S
>>> @@ -20,11 +20,12 @@
>>>
>>> .section __xen_guest
>>>     .ascii  "GUEST_OS=GNU Mach"
>>> -   .ascii  ",GUEST_VERSION=1.3"
>>> +   .ascii  ",GUEST_VERSION=1.8"
>>>     .ascii  ",XEN_VER=xen-3.0"
>>> -   .ascii  ",VIRT_BASE=0x40000000"
>>> -   .ascii  ",ELF_PADDR_OFFSET=0x40000000"
>>> +   .ascii  ",VIRT_BASE=0xffffffff80000000"
>>> +   .ascii  ",ELF_PADDR_OFFSET=0xffffffff80000000"
>>>     .ascii  ",HYPERCALL_PAGE=0x2"
>>> +   .ascii  ",ENTRY=0xffffffff80000000"
>>>     .ascii  ",LOADER=generic"
>>> #ifndef     MACH_PSEUDO_PHYS
>>>     .ascii  ",FEATURES=!auto_translated_physmap"
>>> @@ -51,12 +52,12 @@
>>> .popsection                         ;
>>>
>>>     ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,              .asciz, "GNU Mach")
>>> -   ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,         .asciz, "1.3")
>>> +   ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,         .asciz, "1.8")
>>>     ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,           .asciz, "xen-3.0")
>>>     ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,             .quad,  _START)
>>>     ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,          .quad,  _START)
>>>     ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,                 .quad,  start)
>>> -   ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE,        .quad,  hypcalls)
>>> +   ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE,        .quad,  0x2)
>>>     ELFNOTE(Xen, XEN_ELFNOTE_LOADER,                .asciz, "generic")
>>>     ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,              .asciz, ""
>>> #ifndef MACH_PSEUDO_PHYS
>>>
>> Thanks!
>>


Reply via email to