> 2022年10月6日 09:55,WANG Xuerui <xe...@gentoo.org> 写道:
> 
> In commit 80f0fe3a85 ("linux-user: Fix syscall parameter handling for
> MIPS n32") the ABI problem regarding offset64 on MIPS n32 was fixed,
> but still some cases remain where the n32 is incorrectly treated as any
> other 32-bit ABI that passes 64-bit arguments in pairs of GPRs. Fix by
> excluding TARGET_ABI_MIPSN32 from various TARGET_ABI_BITS == 32 checks.
> 
> Closes: https://gitlab.com/qemu-project/qemu/-/issues/1238
> Signed-off-by: WANG Xuerui <xe...@gentoo.org>
> Cc: Philippe Mathieu-Daudé <f4...@amsat.org>
> Cc: Jiaxun Yang <jiaxun.y...@flygoat.com>
> Cc: Andreas K. Hüttel <dilfri...@gentoo.org>
> Cc: Joshua Kinard <ku...@gentoo.org>

Good catch.

Reviewed-by: Jiaxun Yang <jiaxun.y...@flygoat.com>
Tested-by: Jiaxun Yang <jiaxun.y...@flygoat.com>

Managed to chroot into a n32 “共创 Linux” rootfs and ran some test.
Looks good.

Thanks
- Jiaxun


> ---
> 
> Note: I can't reproduce the crash with neither MIPS n32 sysroot at my hand
> (a self-built one for Loongson-2F, and 
> stage3-mips64_n32-openrc-20221001T170527Z),
> so I can only verify by looking at the (host and qemu) strace outputs, and
> would have to ask you to review/test this harder. Thanks.
> 
> linux-user/syscall.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 2e954d8dbd..8b2d39fe73 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -11793,7 +11793,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, 
> int num, abi_long arg1,
>         return -host_to_target_errno(ret);
> #endif
> 
> -#if TARGET_ABI_BITS == 32
> +#if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
> 
> #ifdef TARGET_NR_fadvise64_64
>     case TARGET_NR_fadvise64_64:
> @@ -11920,7 +11920,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, 
> int num, abi_long arg1,
>         return get_errno(sys_gettid());
> #ifdef TARGET_NR_readahead
>     case TARGET_NR_readahead:
> -#if TARGET_ABI_BITS == 32
> +#if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
>         if (regpairs_aligned(cpu_env, num)) {
>             arg2 = arg3;
>             arg3 = arg4;
> @@ -12612,7 +12612,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, 
> int num, abi_long arg1,
> #endif /* CONFIG_EVENTFD  */
> #if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
>     case TARGET_NR_fallocate:
> -#if TARGET_ABI_BITS == 32
> +#if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
>         ret = get_errno(fallocate(arg1, arg2, target_offset64(arg3, arg4),
>                                   target_offset64(arg5, arg6)));
> #else
> @@ -12623,7 +12623,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, 
> int num, abi_long arg1,
> #if defined(CONFIG_SYNC_FILE_RANGE)
> #if defined(TARGET_NR_sync_file_range)
>     case TARGET_NR_sync_file_range:
> -#if TARGET_ABI_BITS == 32
> +#if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
> #if defined(TARGET_MIPS)
>         ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4),
>                                         target_offset64(arg5, arg6), arg7));
> @@ -12645,7 +12645,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, 
> int num, abi_long arg1,
>     case TARGET_NR_arm_sync_file_range:
> #endif
>         /* This is like sync_file_range but the arguments are reordered */
> -#if TARGET_ABI_BITS == 32
> +#if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
>         ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4),
>                                         target_offset64(arg5, arg6), arg2));
> #else
> -- 
> 2.38.0
> 

---
Jiaxun Yang


Reply via email to