linux-user/alpha: Fix sigsuspend for big-endian hosts
authorRichard Henderson <richard.henderson@linaro.org>
Tue, 15 Mar 2022 08:43:04 +0000 (01:43 -0700)
committerLaurent Vivier <laurent@vivier.eu>
Tue, 22 Mar 2022 12:06:21 +0000 (13:06 +0100)
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>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <20220315084308.433109-2-richard.henderson@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
linux-user/syscall.c

index 75ed71eb461d97c0140c4ada649fbb4462626acb..77cd88b537857a8984499ea50559313c45f20fe8 100644 (file)
@@ -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)))