diff mbox series

[1/5] linux-user/alpha: Fix sigsuspend for big-endian hosts

Message ID 20220315084308.433109-2-richard.henderson@linaro.org
State New
Headers show
Series linux-user: signal mask fixes for pselect et al | expand

Commit Message

Richard Henderson March 15, 2022, 8:43 a.m. UTC
On alpha, the sigset argument for sigsuspend is in a register.
When we drop that into memory that happens in host-endianness,
but target_to_host_old_sigset will treat it as target-endianness.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/syscall.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Laurent Vivier March 22, 2022, 9:58 a.m. UTC | #1
Le 15/03/2022 à 09:43, Richard Henderson a écrit :
> On alpha, the sigset argument for sigsuspend is in a register.
> When we drop that into memory that happens in host-endianness,
> but target_to_host_old_sigset will treat it as target-endianness.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   linux-user/syscall.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index b9b18a7eaf..ecd00382a8 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -9559,7 +9559,8 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
>           {
>               TaskState *ts = cpu->opaque;
>   #if defined(TARGET_ALPHA)
> -            abi_ulong mask = arg1;
> +            /* target_to_host_old_sigset will bswap back */
> +            abi_ulong mask = tswapal(arg1);
>               target_to_host_old_sigset(&ts->sigsuspend_mask, &mask);
>   #else
>               if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))

And what about target_set in TARGET_NR_ssetmask, mask in TARGET_NR_sigprocmask and in 
TARGET_NR_osf_sigprocmask?

Thanks,
Laurent
Laurent Vivier March 22, 2022, 11:31 a.m. UTC | #2
Le 22/03/2022 à 10:58, Laurent Vivier a écrit :
> Le 15/03/2022 à 09:43, Richard Henderson a écrit :
>> On alpha, the sigset argument for sigsuspend is in a register.
>> When we drop that into memory that happens in host-endianness,
>> but target_to_host_old_sigset will treat it as target-endianness.
>>
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>>   linux-user/syscall.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>> index b9b18a7eaf..ecd00382a8 100644
>> --- a/linux-user/syscall.c
>> +++ b/linux-user/syscall.c
>> @@ -9559,7 +9559,8 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
>>           {
>>               TaskState *ts = cpu->opaque;
>>   #if defined(TARGET_ALPHA)
>> -            abi_ulong mask = arg1;
>> +            /* target_to_host_old_sigset will bswap back */
>> +            abi_ulong mask = tswapal(arg1);
>>               target_to_host_old_sigset(&ts->sigsuspend_mask, &mask);
>>   #else
>>               if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
> 
> And what about target_set in TARGET_NR_ssetmask, mask in TARGET_NR_sigprocmask and in 
> TARGET_NR_osf_sigprocmask?
> 

Anyway, the fix is correct and I will add it in my next pull request.

Reviewed-by: Laurent Vivier <laurent@vivier.eu>
diff mbox series

Patch

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index b9b18a7eaf..ecd00382a8 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -9559,7 +9559,8 @@  static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
         {
             TaskState *ts = cpu->opaque;
 #if defined(TARGET_ALPHA)
-            abi_ulong mask = arg1;
+            /* target_to_host_old_sigset will bswap back */
+            abi_ulong mask = tswapal(arg1);
             target_to_host_old_sigset(&ts->sigsuspend_mask, &mask);
 #else
             if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))