Message ID | 20191025113921.9412-13-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | linux-user sparc fixes | expand |
Le 25/10/2019 à 13:39, Richard Henderson a écrit : > This value is not, as far as I know, used by any linux software, > but it is set by the kernel and is part of the ABI. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > v2: Do not set the parent secondary return if SETTLS. > --- > linux-user/alpha/target_cpu.h | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/linux-user/alpha/target_cpu.h b/linux-user/alpha/target_cpu.h > index dd25e18f47..ad408ab5cc 100644 > --- a/linux-user/alpha/target_cpu.h > +++ b/linux-user/alpha/target_cpu.h > @@ -27,10 +27,19 @@ static inline void cpu_clone_regs_child(CPUAlphaState *env, target_ulong newsp, > } > env->ir[IR_V0] = 0; > env->ir[IR_A3] = 0; > + env->ir[IR_A4] = 1; /* OSF/1 secondary return: child */ > } > > static inline void cpu_clone_regs_parent(CPUAlphaState *env, unsigned flags) > { > + /* > + * OSF/1 secondary return: parent > + * Note that the kernel does not do this if SETTLS, because the > + * settls argument register is still live after copy_thread. > + */ > + if (!(flags & CLONE_SETTLS)) { > + env->ir[IR_A4] = 0; > + } > } > > static inline void cpu_set_tls(CPUAlphaState *env, target_ulong newtls) > Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Le 25/10/2019 à 13:39, Richard Henderson a écrit : > This value is not, as far as I know, used by any linux software, > but it is set by the kernel and is part of the ABI. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > v2: Do not set the parent secondary return if SETTLS. > --- > linux-user/alpha/target_cpu.h | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/linux-user/alpha/target_cpu.h b/linux-user/alpha/target_cpu.h > index dd25e18f47..ad408ab5cc 100644 > --- a/linux-user/alpha/target_cpu.h > +++ b/linux-user/alpha/target_cpu.h > @@ -27,10 +27,19 @@ static inline void cpu_clone_regs_child(CPUAlphaState *env, target_ulong newsp, > } > env->ir[IR_V0] = 0; > env->ir[IR_A3] = 0; > + env->ir[IR_A4] = 1; /* OSF/1 secondary return: child */ > } > > static inline void cpu_clone_regs_parent(CPUAlphaState *env, unsigned flags) > { > + /* > + * OSF/1 secondary return: parent > + * Note that the kernel does not do this if SETTLS, because the > + * settls argument register is still live after copy_thread. > + */ > + if (!(flags & CLONE_SETTLS)) { > + env->ir[IR_A4] = 0; > + } > } > > static inline void cpu_set_tls(CPUAlphaState *env, target_ulong newtls) > Applied to my linux-user branch. Thanks, Laurent
diff --git a/linux-user/alpha/target_cpu.h b/linux-user/alpha/target_cpu.h index dd25e18f47..ad408ab5cc 100644 --- a/linux-user/alpha/target_cpu.h +++ b/linux-user/alpha/target_cpu.h @@ -27,10 +27,19 @@ static inline void cpu_clone_regs_child(CPUAlphaState *env, target_ulong newsp, } env->ir[IR_V0] = 0; env->ir[IR_A3] = 0; + env->ir[IR_A4] = 1; /* OSF/1 secondary return: child */ } static inline void cpu_clone_regs_parent(CPUAlphaState *env, unsigned flags) { + /* + * OSF/1 secondary return: parent + * Note that the kernel does not do this if SETTLS, because the + * settls argument register is still live after copy_thread. + */ + if (!(flags & CLONE_SETTLS)) { + env->ir[IR_A4] = 0; + } } static inline void cpu_set_tls(CPUAlphaState *env, target_ulong newtls)
This value is not, as far as I know, used by any linux software, but it is set by the kernel and is part of the ABI. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- v2: Do not set the parent secondary return if SETTLS. --- linux-user/alpha/target_cpu.h | 9 +++++++++ 1 file changed, 9 insertions(+) -- 2.17.1