Re: [PATCH] linux-user: Fix msqid_ds struct wrt 32-bit big endian architectures

Peter Maydell <[email protected]>
Newsgroups gmane.comp.emulators.qemu
Message-ID <CAFEAcA_8o2A8FDsJKacde+pdj4HzA5c7aTw=k7tmONYXD4=c_w@mail.gmail.com>
On Tue, 28 Jul 2026 at 20:32, Helge Deller <[email protected]> wrote:
>
> From: Helge Deller <[email protected]>
>
> Make sure that the time entries (msg_stime, msg_rtime and msg_ctime)
> are defined as 64-bit time_t values, since the userspace may access
> the whole 64-bit value. By this change we fix the word ordering for
> 32-bit big endian architectures as well.
>
> This fixes the msgctl01 LTP testcase on hppa32.
>
> Signed-off-by: Helge Deller <[email protected]>
> ---
>  linux-user/syscall.c | 30 ++++++++++++------------------
>  1 file changed, 12 insertions(+), 18 deletions(-)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 740142825d..c93b770ced 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -4216,21 +4216,15 @@ static inline abi_long do_semtimedop(int semid,
>  }
>  #endif

I see this has already gone into git, but some late review
comments. I suspect this is mostly me being confused rather
than actual problems.

>
> +#define target_time64_t         abi_ullong
> +#define target_swap_time64(x)   tswap64(x)
> +
>  struct target_msqid_ds

Is this the kernel's "struct msqid_ds" (which it calls "Obsolete, used
only for backwards compatibility and libc5 compiles") or its msqid64_ds?
The layout matches msqid64_ds, which makes our struct a bit
confusingly named.

>  {
>      struct target_ipc_perm msg_perm;
> -    abi_ulong msg_stime;
> -#if TARGET_ABI_BITS == 32
> -    abi_ulong __unused1;
> -#endif
> -    abi_ulong msg_rtime;
> -#if TARGET_ABI_BITS == 32
> -    abi_ulong __unused2;
> -#endif
> -    abi_ulong msg_ctime;
> -#if TARGET_ABI_BITS == 32
> -    abi_ulong __unused3;
> -#endif
> +    target_time64_t msg_stime;
> +    target_time64_t msg_rtime;
> +    target_time64_t msg_ctime;

Assuming msqid64_ds, the kernel version of this struct has a comment:
 * 64 bit architectures use a 64-bit long time field here, while
 * 32 bit architectures have a pair of unsigned long values.
 * On big-endian systems, the lower half is in the wrong place.

That would make tswap64() not the right swap for 32-bit big
endian guests.

thanks
-- PMM
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.