On 4/21/20 9:44 AM, Edgar E. Iglesias wrote: > On Mon, Apr 20, 2020 at 10:22:05PM +0100, Peter Maydell wrote: >> The kernel has different handling for syscalls with invalid >> numbers that are in the "arm-specific" range 0x9f0000 and up: >> * 0x9f0000..0x9f07ff return -ENOSYS if not implemented >> * other out of range syscalls cause a SIGILL >> (see the kernel's arch/arm/kernel/traps.c:arm_syscall()) >> >> Implement this distinction. (Note that our code doesn't look >> quite like the kernel's, because we have removed the >> 0x900000 prefix by this point, whereas the kernel retains >> it in arm_syscall().) >> >> Signed-off-by: Peter Maydell <peter.mayd...@linaro.org> >> --- >> linux-user/arm/cpu_loop.c | 30 ++++++++++++++++++++++++++---- >> 1 file changed, 26 insertions(+), 4 deletions(-) >> >> diff --git a/linux-user/arm/cpu_loop.c b/linux-user/arm/cpu_loop.c >> index 025887d6b86..f042108b0be 100644 >> --- a/linux-user/arm/cpu_loop.c >> +++ b/linux-user/arm/cpu_loop.c >> @@ -332,10 +332,32 @@ void cpu_loop(CPUARMState *env) >> env->regs[0] = cpu_get_tls(env); >> break; >> default: >> - qemu_log_mask(LOG_UNIMP, >> - "qemu: Unsupported ARM syscall: >> 0x%x\n", >> - n); >> - env->regs[0] = -TARGET_ENOSYS; >> + if (n < 0xf0800) { >> + /* >> + * Syscalls 0xf0000..0xf07ff (or 0x9f0000.. >> + * 0x9f07ff in OABI numbering) are defined >> + * to return -ENOSYS rather than raising >> + * SIGILL. Note that we have already >> + * removed the 0x900000 prefix. >> + */ >> + qemu_log_mask(LOG_UNIMP, >> + "qemu: Unsupported ARM syscall: 0x%x\n", >> + n); >> + env->regs[0] = -TARGET_ENOSYS; >> + } else { >> + /* Otherwise SIGILL */ >> + info.si_signo = TARGET_SIGILL; >> + info.si_errno = 0; >> + info.si_code = TARGET_ILL_ILLTRP; >> + info._sifields._sigfault._addr = >> env->regs[15]; >> + if (env->thumb) { >> + info._sifields._sigfault._addr -= 2; >> + } else { >> + info._sifields._sigfault._addr -= 2; >> + } > > > Am I missing some detail or are both branches of the if-else doing the > same thing?
Oops good catch. R-b stands using '-= 4' on 2nd line. > > Cheers, > Edgar > > > >> + queue_signal(env, info.si_signo, >> + QEMU_SI_FAULT, &info); >> + } >> break; >> } >> } else { >> -- >> 2.20.1 >> >> >