Message ID | 20230202005204.2055899-3-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | linux-user/sparc: Handle missing traps | expand |
On 2/1/23 14:51, Richard Henderson wrote: > Use TT_TRAP. > > For sparc32, 0x88 is the "Slowaris" system call, currently > BAD_TRAP in the kernel's ttable_32.S. > > For sparc64, 0x110 is tl0_linux32, the sparc32 trap, as also > seen in the adjacent code. We do not implement multiple abis, > so treat this as !defined(CONFIG_COMPAT), which vectors this > case to BTRAP. This was presumably a typo for 0x111, which is > the "old" linux64 syscall number. Both old and new linux64 > syscalls traps vector to LINUX_64BIT_SYSCALL_TRAP. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/sparc/cpu_loop.c | 9 ++++----- > 1 file changed, 4 insertions(+), 5 deletions(-) > > diff --git a/linux-user/sparc/cpu_loop.c b/linux-user/sparc/cpu_loop.c > index c120c42278..18d5c24af1 100644 > --- a/linux-user/sparc/cpu_loop.c > +++ b/linux-user/sparc/cpu_loop.c > @@ -167,12 +167,11 @@ void cpu_loop (CPUSPARCState *env) > } > > switch (trapnr) { > -#ifndef TARGET_SPARC64 > - case 0x88: > - case 0x90: > +#ifdef TARGET_SPARC64 > + case TT_TRAP + 0x11: /* tl0_oldlinux64 */ > + case TT_TRAP + 0x6d: /* tl0_linux64 */ > #else > - case 0x110: > - case 0x16d: > + case TT_TRAP + 0x10: /* t_linux */ Bah. I just realized this is wrong. This breaks v8plus. What's needed is #ifdef TARGET_ABI32 #define TARGET_TT_SYSCALL TT_TRAP + 0x10 #else #define TARGET_TT_SYSCALL TT_TRAP + 0x6d #endif and ignore tl0_oldlinux64 (0x111), which must be so old that we've never missed it. r~
diff --git a/linux-user/sparc/cpu_loop.c b/linux-user/sparc/cpu_loop.c index c120c42278..18d5c24af1 100644 --- a/linux-user/sparc/cpu_loop.c +++ b/linux-user/sparc/cpu_loop.c @@ -167,12 +167,11 @@ void cpu_loop (CPUSPARCState *env) } switch (trapnr) { -#ifndef TARGET_SPARC64 - case 0x88: - case 0x90: +#ifdef TARGET_SPARC64 + case TT_TRAP + 0x11: /* tl0_oldlinux64 */ + case TT_TRAP + 0x6d: /* tl0_linux64 */ #else - case 0x110: - case 0x16d: + case TT_TRAP + 0x10: /* t_linux */ #endif ret = do_syscall (env, env->gregs[1], env->regwptr[0], env->regwptr[1],
Use TT_TRAP. For sparc32, 0x88 is the "Slowaris" system call, currently BAD_TRAP in the kernel's ttable_32.S. For sparc64, 0x110 is tl0_linux32, the sparc32 trap, as also seen in the adjacent code. We do not implement multiple abis, so treat this as !defined(CONFIG_COMPAT), which vectors this case to BTRAP. This was presumably a typo for 0x111, which is the "old" linux64 syscall number. Both old and new linux64 syscalls traps vector to LINUX_64BIT_SYSCALL_TRAP. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/sparc/cpu_loop.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)