Message ID | bf2b4da4-385d-a0f7-7915-4f31fa797898@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | linux-user: Correct definition of stack_t | expand |
On Thu, 5 Nov 2020 at 14:55, LemonBoy <thatlemon@gmail.com> wrote: > > From 914c30863b45d6fcd3e2fc83929bcac546be1555 Mon Sep 17 00:00:00 2001 > From: LemonBoy <thatlemon@gmail.com> > Date: Thu, 5 Nov 2020 15:48:24 +0100 > Subject: [PATCH] linux-user: Correct definition of stack_t > > Some platforms used the wrong definition of stack_t where the flags and > size fields were swapped or where the flags field had type ulong instead > of int. Coincidentally, I just noticed this yesterday (am in the middle of trying to debug why qemu-sparc64 crashes trying to start bash...) > Due to the presence of padding space in the structure and the prevalence > of little-endian machines this problem went unnoticed for a long time. > > The type definitions have been cross-checked with the ones defined in > the Linux kernel v5.9, plus some older versions for a few architecture > that have been removed and Xilinx's kernel fork for NiosII [1]. > > The microblaze header and the bsd-user ones remain unchanged as I don't > know if they are wrong or not. As far as I can tell, Microblaze doesn't define its own stack_t, so it must be using the asm-generic one, so I think it also needs changing. > [1] https://github.com/Xilinx/linux-xlnx/blob/master/arch/nios2/include/uapi/asm/signal.h > Signed-off-by: Giuseppe Musacchio <thatlemon@gmail.com> Other than also changing microblaze, Reviewed-by: Peter Maydell <peter.maydell@linaro.org> thanks -- PMM
On 05/11/20 16:16, Peter Maydell wrote: > On Thu, 5 Nov 2020 at 14:55, LemonBoy <thatlemon@gmail.com> wrote: >> >> From 914c30863b45d6fcd3e2fc83929bcac546be1555 Mon Sep 17 00:00:00 2001 >> From: LemonBoy <thatlemon@gmail.com> >> Date: Thu, 5 Nov 2020 15:48:24 +0100 >> Subject: [PATCH] linux-user: Correct definition of stack_t >> >> Some platforms used the wrong definition of stack_t where the flags and >> size fields were swapped or where the flags field had type ulong instead >> of int. > > Coincidentally, I just noticed this yesterday (am in the middle of > trying to debug why qemu-sparc64 crashes trying to start bash...) > What an interesting coincidence, I also stumbled across this bug while debugging a crash with some sparc64 binary. >> Due to the presence of padding space in the structure and the prevalence >> of little-endian machines this problem went unnoticed for a long time. >> >> The type definitions have been cross-checked with the ones defined in >> the Linux kernel v5.9, plus some older versions for a few architecture >> that have been removed and Xilinx's kernel fork for NiosII [1]. >> >> The microblaze header and the bsd-user ones remain unchanged as I don't >> know if they are wrong or not. > > As far as I can tell, Microblaze doesn't define its own stack_t, > so it must be using the asm-generic one, so I think it also needs > changing. > I'll change it and send an updated patch ASAP. >> [1] https://github.com/Xilinx/linux-xlnx/blob/master/arch/nios2/include/uapi/asm/signal.h > >> Signed-off-by: Giuseppe Musacchio <thatlemon@gmail.com> > > Other than also changing microblaze, > Reviewed-by: Peter Maydell <peter.maydell@linaro.org> > > thanks > -- PMM >
On Thu, 5 Nov 2020 at 15:48, LemonBoy <thatlemon@gmail.com> wrote: > On 05/11/20 16:16, Peter Maydell wrote: > > Coincidentally, I just noticed this yesterday (am in the middle of > > trying to debug why qemu-sparc64 crashes trying to start bash...) > > > > What an interesting coincidence, I also stumbled across this bug while > debugging a crash with some sparc64 binary. Don't suppose it involves sigsetjmp/siglongjmp? So far I have discovered that the linux-user/sparc target_ucontext and friends have host pointers where they should have abi_ulong and also that target_mc_fpu needs explicit 16-alignment (patch written, will post it sometime this week), and once past that have hit another bug that seems to be down to the setcontext/getcontext traps not saving and restoring all the right registers. thanks -- PMM
diff --git a/linux-user/alpha/target_signal.h b/linux-user/alpha/target_signal.h index cd63d59fde..b83797281c 100644 --- a/linux-user/alpha/target_signal.h +++ b/linux-user/alpha/target_signal.h @@ -42,8 +42,7 @@ typedef struct target_sigaltstack { abi_ulong ss_sp; - int32_t ss_flags; - int32_t dummy; + abi_int ss_flags; abi_ulong ss_size; } target_stack_t; diff --git a/linux-user/arm/target_signal.h b/linux-user/arm/target_signal.h index ea123c40f3..0998dd6dfa 100644 --- a/linux-user/arm/target_signal.h +++ b/linux-user/arm/target_signal.h @@ -4,9 +4,9 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; + abi_ulong ss_sp; + abi_int ss_flags; + abi_ulong ss_size; } target_stack_t; diff --git a/linux-user/cris/target_signal.h b/linux-user/cris/target_signal.h index 1cb5548f85..495a142896 100644 --- a/linux-user/cris/target_signal.h +++ b/linux-user/cris/target_signal.h @@ -4,9 +4,9 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_ulong ss_size; - abi_long ss_flags; + abi_ulong ss_sp; + abi_int ss_flags; + abi_ulong ss_size; } target_stack_t; diff --git a/linux-user/hppa/target_signal.h b/linux-user/hppa/target_signal.h index c2a0102ed7..c52a3ea579 100644 --- a/linux-user/hppa/target_signal.h +++ b/linux-user/hppa/target_signal.h @@ -44,7 +44,7 @@ typedef struct target_sigaltstack { abi_ulong ss_sp; - int32_t ss_flags; + abi_int ss_flags; abi_ulong ss_size; } target_stack_t; diff --git a/linux-user/i386/target_signal.h b/linux-user/i386/target_signal.h index f55e78fd33..50361af874 100644 --- a/linux-user/i386/target_signal.h +++ b/linux-user/i386/target_signal.h @@ -4,9 +4,9 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; + abi_ulong ss_sp; + abi_int ss_flags; + abi_ulong ss_size; } target_stack_t; diff --git a/linux-user/m68k/target_signal.h b/linux-user/m68k/target_signal.h index 314e808844..d096544ef8 100644 --- a/linux-user/m68k/target_signal.h +++ b/linux-user/m68k/target_signal.h @@ -4,9 +4,9 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; + abi_ulong ss_sp; + abi_int ss_flags; + abi_ulong ss_size; } target_stack_t; diff --git a/linux-user/mips/target_signal.h b/linux-user/mips/target_signal.h index 66e1ad44a6..fa4084a99d 100644 --- a/linux-user/mips/target_signal.h +++ b/linux-user/mips/target_signal.h @@ -45,9 +45,9 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_long ss_sp; - abi_ulong ss_size; - abi_long ss_flags; + abi_ulong ss_sp; + abi_ulong ss_size; + abi_int ss_flags; } target_stack_t; diff --git a/linux-user/mips64/target_signal.h b/linux-user/mips64/target_signal.h index 753e91fbd6..799f7a668c 100644 --- a/linux-user/mips64/target_signal.h +++ b/linux-user/mips64/target_signal.h @@ -45,12 +45,11 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_long ss_sp; - abi_ulong ss_size; - abi_int ss_flags; + abi_ulong ss_sp; + abi_ulong ss_size; + abi_int ss_flags; } target_stack_t; - /* * sigaltstack controls */ diff --git a/linux-user/nios2/target_signal.h b/linux-user/nios2/target_signal.h index fe48721b3d..aebf749f12 100644 --- a/linux-user/nios2/target_signal.h +++ b/linux-user/nios2/target_signal.h @@ -4,11 +4,12 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_long ss_sp; + abi_ulong ss_sp; + abi_int ss_flags; abi_ulong ss_size; - abi_long ss_flags; } target_stack_t; + /* sigaltstack controls */ #define TARGET_SS_ONSTACK 1 #define TARGET_SS_DISABLE 2 diff --git a/linux-user/ppc/target_signal.h b/linux-user/ppc/target_signal.h index 4453e2e7ef..72fcdd9bfa 100644 --- a/linux-user/ppc/target_signal.h +++ b/linux-user/ppc/target_signal.h @@ -4,9 +4,9 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_ulong ss_sp; - int ss_flags; - abi_ulong ss_size; + abi_ulong ss_sp; + abi_int ss_flags; + abi_ulong ss_size; } target_stack_t; diff --git a/linux-user/s390x/target_signal.h b/linux-user/s390x/target_signal.h index b58bc7c20f..bbfc464d44 100644 --- a/linux-user/s390x/target_signal.h +++ b/linux-user/s390x/target_signal.h @@ -3,7 +3,7 @@ typedef struct target_sigaltstack { abi_ulong ss_sp; - int ss_flags; + abi_int ss_flags; abi_ulong ss_size; } target_stack_t; diff --git a/linux-user/sh4/target_signal.h b/linux-user/sh4/target_signal.h index 434970a990..d7309b7136 100644 --- a/linux-user/sh4/target_signal.h +++ b/linux-user/sh4/target_signal.h @@ -4,9 +4,9 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; + abi_ulong ss_sp; + abi_int ss_flags; + abi_ulong ss_size; } target_stack_t; diff --git a/linux-user/sparc/target_signal.h b/linux-user/sparc/target_signal.h index 5cc40327d2..1b10d1490f 100644 --- a/linux-user/sparc/target_signal.h +++ b/linux-user/sparc/target_signal.h @@ -42,9 +42,9 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; + abi_ulong ss_sp; + abi_int ss_flags; + abi_ulong ss_size; } target_stack_t; diff --git a/linux-user/x86_64/target_signal.h b/linux-user/x86_64/target_signal.h index 4c4380f7b9..4ea74f20dd 100644 --- a/linux-user/x86_64/target_signal.h +++ b/linux-user/x86_64/target_signal.h @@ -4,9 +4,9 @@ /* this struct defines a stack used during syscall handling */ typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; + abi_ulong ss_sp; + abi_int ss_flags; + abi_ulong ss_size; } target_stack_t;