linux-user/sparc: Include TARGET_STACK_BIAS in get_sp_from_cpustate
authorRichard Henderson <richard.henderson@linaro.org>
Mon, 26 Apr 2021 02:53:14 +0000 (19:53 -0700)
committerLaurent Vivier <laurent@vivier.eu>
Sat, 15 May 2021 19:43:23 +0000 (21:43 +0200)
Move TARGET_STACK_BIAS from signal.c.  Generic code cares about the
logical stack pointer, not the physical one that has a bias applied
for sparc64.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20210426025334.1168495-6-richard.henderson@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
linux-user/sparc/signal.c
linux-user/sparc/target_cpu.h

index d27b7a3af79dcd4d462047c5cbb055851ec4b7ed..76579093a88c191cf1925fbbfd6f2875a5a6a562 100644 (file)
@@ -394,8 +394,6 @@ struct target_reg_window {
     abi_ulong ins[8];
 };
 
-#define TARGET_STACK_BIAS 2047
-
 /* {set, get}context() needed for 64-bit SparcLinux userland. */
 void sparc64_set_context(CPUSPARCState *env)
 {
index 1fa1011775a1ea95b108ce97e15710a9bd2fa78f..1f4bed50f47665e0b0fae2b459f83928202fbd28 100644 (file)
 #ifndef SPARC_TARGET_CPU_H
 #define SPARC_TARGET_CPU_H
 
+#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
+# define TARGET_STACK_BIAS 2047
+#else
+# define TARGET_STACK_BIAS 0
+#endif
+
 static inline void cpu_clone_regs_child(CPUSPARCState *env, target_ulong newsp,
                                         unsigned flags)
 {
@@ -40,6 +46,7 @@ static inline void cpu_clone_regs_child(CPUSPARCState *env, target_ulong newsp,
 #endif
         /* ??? The kernel appears to copy one stack frame to the new stack. */
         /* ??? The kernel force aligns the new stack. */
+        /* Userspace provides a biased stack pointer value. */
         env->regwptr[WREG_SP] = newsp;
     }
 
@@ -77,7 +84,7 @@ static inline void cpu_set_tls(CPUSPARCState *env, target_ulong newtls)
 
 static inline abi_ulong get_sp_from_cpustate(CPUSPARCState *state)
 {
-    return state->regwptr[WREG_SP];
+    return state->regwptr[WREG_SP] + TARGET_STACK_BIAS;
 }
 
 #endif