|
@@ -20,6 +20,12 @@
|
|
|
#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
|