[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2] linux-user: Correct definition of stack_t
From: |
Laurent Vivier |
Subject: |
Re: [PATCH v2] linux-user: Correct definition of stack_t |
Date: |
Wed, 11 Nov 2020 22:37:12 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.4.0 |
Le 05/11/2020 à 16:52, LemonBoy a écrit :
> 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.
>
> 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 bsd-user headers remain unchanged as I don't know if they are wrong
> or not.
>
> [1]
> https://github.com/Xilinx/linux-xlnx/blob/master/arch/nios2/include/uapi/asm/signal.h
>
> Signed-off-by: Giuseppe Musacchio <thatlemon@gmail.com>
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> linux-user/alpha/target_signal.h | 3 +--
> linux-user/arm/target_signal.h | 6 +++---
> linux-user/cris/target_signal.h | 6 +++---
> linux-user/hppa/target_signal.h | 2 +-
> linux-user/i386/target_signal.h | 6 +++---
> linux-user/m68k/target_signal.h | 6 +++---
> linux-user/microblaze/target_signal.h | 6 +++---
> linux-user/mips/target_signal.h | 6 +++---
> linux-user/mips64/target_signal.h | 7 +++----
> linux-user/nios2/target_signal.h | 5 +++--
> linux-user/ppc/target_signal.h | 6 +++---
> linux-user/s390x/target_signal.h | 2 +-
> linux-user/sh4/target_signal.h | 6 +++---
> linux-user/sparc/target_signal.h | 6 +++---
> linux-user/x86_64/target_signal.h | 6 +++---
> 15 files changed, 39 insertions(+), 40 deletions(-)
>
> 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/microblaze/target_signal.h
> b/linux-user/microblaze/target_signal.h
> index 08bcf24b9d..1c326296de 100644
> --- a/linux-user/microblaze/target_signal.h
> +++ b/linux-user/microblaze/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/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;
>
>
>
Applied to my linux-user-for-5.2 branch.
Thanks,
Laurent