qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH qemu 1/2] Don't reverse bFLT endianess when not needed
  2025-07-16 21:57 [PATCH qemu 0/2] Add support for flat m68k binaries ~wojtekka
@ 2025-07-16 19:24 ` ~wojtekka
  2025-07-17  6:48   ` Laurent Vivier
  2025-07-16 20:03 ` [PATCH qemu 2/2] Fill out m68k PIC register ~wojtekka
  1 sibling, 1 reply; 5+ messages in thread
From: ~wojtekka @ 2025-07-16 19:24 UTC (permalink / raw)
  To: qemu-devel; +Cc: Laurent Vivier, qemu-trivial

From: Wojtek Kaniewski <wojtekka@toxygen.net>

bFLT format is big-endian. get_user_ual() returns host value so for
little-endian target and little-endian host it's necessary to reverse
words using ntohl(). For big-endian targets we end up with incorrect
endianess:

    $ qemu-m68k-static ./test
    BINFMT_FLAT: reloc outside program 0x801f0000 (0 - 0x41f0/0x1e40)
    Aborted (core dumped)

For comparison the output of `flthdr` follows:

    $ m68k-elf-flthdr -P ./test
    ./test
        Magic:        bFLT
        Rev:          4
        Build Date:   Tue Jul 15 23:02:00 2025
        Entry:        0x44
        Data Start:   0x1e80
        Data End:     0x205c
        BSS End:      0x40a0
        Stack Size:   0x1000
        Reloc Start:  0x205c
        Reloc Count:  0x17
        Flags:        0x2 ( Has-PIC-GOT )
        Relocs:
        #	reloc      (  address )	data
        0	0x00001f80 (0x00001f80)	3c200000
                  ^^^^^^^^
        1	0x00001f84 (0x00001f84)	3c300000
        2	0x00001f88 (0x00001f88)	3c200000
        ...

Signed-off-by: Wojtek Kaniewski <wojtekka@toxygen.net>
---
 linux-user/flatload.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/linux-user/flatload.c b/linux-user/flatload.c
index 4beb3ed1b9..afaff4ac44 100644
--- a/linux-user/flatload.c
+++ b/linux-user/flatload.c
@@ -413,7 +413,9 @@ static int load_flat_file(struct linux_binprm * bprm,
                relocated first).  */
             if (get_user_ual(relval, reloc + i * sizeof(abi_ulong)))
                 return -EFAULT;
+#if !TARGET_BIG_ENDIAN
             relval = ntohl(relval);
+#endif
             if (flat_set_persistent(relval, &persistent))
                 continue;
             addr = flat_get_relocate_addr(relval);
-- 
2.45.3



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH qemu 2/2] Fill out m68k PIC register
  2025-07-16 21:57 [PATCH qemu 0/2] Add support for flat m68k binaries ~wojtekka
  2025-07-16 19:24 ` [PATCH qemu 1/2] Don't reverse bFLT endianess when not needed ~wojtekka
@ 2025-07-16 20:03 ` ~wojtekka
  1 sibling, 0 replies; 5+ messages in thread
From: ~wojtekka @ 2025-07-16 20:03 UTC (permalink / raw)
  To: qemu-devel; +Cc: Laurent Vivier, qemu-trivial

From: Wojtek Kaniewski <wojtekka@toxygen.net>

D5 is expected to be set to data address on m68k without MMU. See
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/m68k/include/asm/flat.h
for reference.

Signed-off-by: Wojtek Kaniewski <wojtekka@toxygen.net>
---
 linux-user/elfload.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index ea214105ff..b151ebcba2 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1756,6 +1756,7 @@ static uint32_t get_elf_hwcap(void)
 static inline void init_thread(struct target_pt_regs *regs,
                                struct image_info *infop)
 {
+    regs->d5 = infop->start_data;   /* For uClinux PIC binaries. */
     regs->usp = infop->start_stack;
     regs->sr = 0;
     regs->pc = infop->entry;
-- 
2.45.3


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH qemu 0/2] Add support for flat m68k binaries
@ 2025-07-16 21:57 ~wojtekka
  2025-07-16 19:24 ` [PATCH qemu 1/2] Don't reverse bFLT endianess when not needed ~wojtekka
  2025-07-16 20:03 ` [PATCH qemu 2/2] Fill out m68k PIC register ~wojtekka
  0 siblings, 2 replies; 5+ messages in thread
From: ~wojtekka @ 2025-07-16 21:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Laurent Vivier, qemu-trivial

Flat m68k binaries apparently don't work out of the box and those two
tiny patches fixed that for me. On top of that they didn't break
support for ARM flat binaries (tested with test_arm_bflt.py) nor m68k
ELF binaries (tested static busybox from Debian). Unfortunately
I wasn't able to find any root filesystem for m68k uClinux so I didn't
prepare any test similar to test_arm_bflt.py.

Wojtek Kaniewski (2):
  Don't reverse bFLT endianess when not needed
  Fill out m68k PIC register

 linux-user/elfload.c  | 1 +
 linux-user/flatload.c | 2 ++
 2 files changed, 3 insertions(+)

-- 
2.45.3


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH qemu 1/2] Don't reverse bFLT endianess when not needed
  2025-07-16 19:24 ` [PATCH qemu 1/2] Don't reverse bFLT endianess when not needed ~wojtekka
@ 2025-07-17  6:48   ` Laurent Vivier
  2025-08-06 15:14     ` Wojtek Kaniewski
  0 siblings, 1 reply; 5+ messages in thread
From: Laurent Vivier @ 2025-07-17  6:48 UTC (permalink / raw)
  To: ~wojtekka, qemu-devel; +Cc: qemu-trivial



Le 16/07/2025 à 21:24, ~wojtekka a écrit :
> From: Wojtek Kaniewski <wojtekka@toxygen.net>
> 
> bFLT format is big-endian. get_user_ual() returns host value so for
> little-endian target and little-endian host it's necessary to reverse
> words using ntohl(). For big-endian targets we end up with incorrect
> endianess:
> 
>      $ qemu-m68k-static ./test
>      BINFMT_FLAT: reloc outside program 0x801f0000 (0 - 0x41f0/0x1e40)
>      Aborted (core dumped)
> 
> For comparison the output of `flthdr` follows:
> 
>      $ m68k-elf-flthdr -P ./test
>      ./test
>          Magic:        bFLT
>          Rev:          4
>          Build Date:   Tue Jul 15 23:02:00 2025
>          Entry:        0x44
>          Data Start:   0x1e80
>          Data End:     0x205c
>          BSS End:      0x40a0
>          Stack Size:   0x1000
>          Reloc Start:  0x205c
>          Reloc Count:  0x17
>          Flags:        0x2 ( Has-PIC-GOT )
>          Relocs:
>          #	reloc      (  address )	data
>          0	0x00001f80 (0x00001f80)	3c200000
>                    ^^^^^^^^
>          1	0x00001f84 (0x00001f84)	3c300000
>          2	0x00001f88 (0x00001f88)	3c200000
>          ...
> 
> Signed-off-by: Wojtek Kaniewski <wojtekka@toxygen.net>
> ---
>   linux-user/flatload.c | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/linux-user/flatload.c b/linux-user/flatload.c
> index 4beb3ed1b9..afaff4ac44 100644
> --- a/linux-user/flatload.c
> +++ b/linux-user/flatload.c
> @@ -413,7 +413,9 @@ static int load_flat_file(struct linux_binprm * bprm,
>                  relocated first).  */
>               if (get_user_ual(relval, reloc + i * sizeof(abi_ulong)))
>                   return -EFAULT;
> +#if !TARGET_BIG_ENDIAN
>               relval = ntohl(relval);
> +#endif
>               if (flat_set_persistent(relval, &persistent))
>                   continue;
>               addr = flat_get_relocate_addr(relval);

I think the ntohl() should be removed totally and flat_set_persistent() 
should use put_user_ual().

Could you test this?

Thanks,
Laurent



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH qemu 1/2] Don't reverse bFLT endianess when not needed
  2025-07-17  6:48   ` Laurent Vivier
@ 2025-08-06 15:14     ` Wojtek Kaniewski
  0 siblings, 0 replies; 5+ messages in thread
From: Wojtek Kaniewski @ 2025-08-06 15:14 UTC (permalink / raw)
  To: Laurent Vivier, qemu-devel; +Cc: qemu-trivial

On Thu, 2025-07-17 at 08:48 +0200, Laurent Vivier wrote:
> Le 16/07/2025 à 21:24, ~wojtekka a écrit :
> > From: Wojtek Kaniewski <wojtekka@toxygen.net>
> > 
> > bFLT format is big-endian. get_user_ual() returns host value so for
> > little-endian target and little-endian host it's necessary to
> > reverse
> > words using ntohl(). For big-endian targets we end up with
> > incorrect
> > endianess:
> > 
> >      $ qemu-m68k-static ./test
> >      BINFMT_FLAT: reloc outside program 0x801f0000 (0 -
> > 0x41f0/0x1e40)
> >      Aborted (core dumped)
> > 
> > For comparison the output of `flthdr` follows:
> > 
> >      $ m68k-elf-flthdr -P ./test
> >      ./test
> >          Magic:        bFLT
> >          Rev:          4
> >          Build Date:   Tue Jul 15 23:02:00 2025
> >          Entry:        0x44
> >          Data Start:   0x1e80
> >          Data End:     0x205c
> >          BSS End:      0x40a0
> >          Stack Size:   0x1000
> >          Reloc Start:  0x205c
> >          Reloc Count:  0x17
> >          Flags:        0x2 ( Has-PIC-GOT )
> >          Relocs:
> >          #	reloc      (  address )	data
> >          0	0x00001f80 (0x00001f80)	3c200000
> >                    ^^^^^^^^
> >          1	0x00001f84 (0x00001f84)	3c300000
> >          2	0x00001f88 (0x00001f88)	3c200000
> >          ...
> > 
> > Signed-off-by: Wojtek Kaniewski <wojtekka@toxygen.net>
> > ---
> >   linux-user/flatload.c | 2 ++
> >   1 file changed, 2 insertions(+)
> > 
> > diff --git a/linux-user/flatload.c b/linux-user/flatload.c
> > index 4beb3ed1b9..afaff4ac44 100644
> > --- a/linux-user/flatload.c
> > +++ b/linux-user/flatload.c
> > @@ -413,7 +413,9 @@ static int load_flat_file(struct linux_binprm *
> > bprm,
> >                  relocated first).  */
> >               if (get_user_ual(relval, reloc + i *
> > sizeof(abi_ulong)))
> >                   return -EFAULT;
> > +#if !TARGET_BIG_ENDIAN
> >               relval = ntohl(relval);
> > +#endif
> >               if (flat_set_persistent(relval, &persistent))
> >                   continue;
> >               addr = flat_get_relocate_addr(relval);
> 
> I think the ntohl() should be removed totally and
> flat_set_persistent() 
> should use put_user_ual().
> 
> Could you test this?

flat_set_persistent() is just a no-op macro copied from Linux kernel
implementation and has been removed from the upstream a couple of years
ago [1]. The actual address is relocated by flat_get_relocate_addr() a
line below so it needs to be in host-endian. Dropping ntohl() would
break it for little-endian targets because bFLT by definition is big-
endian.

Is there a macro similar to get_user_ual() but without any endianess
conversion? The closest thing I found was ldl_p(), but I assume it's
not the best idea due to lack of locking.

(And sorry for such a late response. I haven't used mailing lists for
years and it took me way too long to get my old e-mail account to work
properly.)

Regards,
Wojtek

[1]
https://github.com/torvalds/linux/commit/2f3196d49b1e10f1d4bc64cce00dc95fde2b0ce1


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-08-06 16:08 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-16 21:57 [PATCH qemu 0/2] Add support for flat m68k binaries ~wojtekka
2025-07-16 19:24 ` [PATCH qemu 1/2] Don't reverse bFLT endianess when not needed ~wojtekka
2025-07-17  6:48   ` Laurent Vivier
2025-08-06 15:14     ` Wojtek Kaniewski
2025-07-16 20:03 ` [PATCH qemu 2/2] Fill out m68k PIC register ~wojtekka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).