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>