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? Cheers, Edgar > + queue_signal(env, info.si_signo, > + QEMU_SI_FAULT, &info); > + } > break; > } > } else { > -- > 2.20.1 > >