Pierrick Bouvier <[email protected]> writes: > On 2/24/26 7:50 AM, Florian Hofhammer wrote: >> The syscall emulation code previously wasn't interruptible via >> cpu_loop_exit(), as this construct relies on a longjmp target that is not >> live anymore in the syscall handling code. Consequently, longjmp() would >> operate on a (potentially overwritten) stale jump buffer. This patch adds an >> additional >> setjmp and the necessary handling around it to make longjmp() (and by >> proxy cpu_loop_exit() safe to call even within a syscall context. >> Signed-off-by: Florian Hofhammer <[email protected]> >> --- >> linux-user/aarch64/cpu_loop.c | 2 +- >> linux-user/alpha/cpu_loop.c | 2 +- >> linux-user/arm/cpu_loop.c | 2 +- >> linux-user/hexagon/cpu_loop.c | 2 +- >> linux-user/hppa/cpu_loop.c | 4 ++++ >> linux-user/i386/cpu_loop.c | 8 +++++--- >> linux-user/include/special-errno.h | 8 ++++++++ >> linux-user/loongarch64/cpu_loop.c | 5 +++-- >> linux-user/m68k/cpu_loop.c | 2 +- >> linux-user/microblaze/cpu_loop.c | 2 +- >> linux-user/mips/cpu_loop.c | 5 +++-- >> linux-user/or1k/cpu_loop.c | 2 +- >> linux-user/ppc/cpu_loop.c | 6 ++++-- >> linux-user/riscv/cpu_loop.c | 2 +- >> linux-user/s390x/cpu_loop.c | 2 +- >> linux-user/sh4/cpu_loop.c | 2 +- >> linux-user/sparc/cpu_loop.c | 4 +++- >> linux-user/syscall.c | 16 ++++++++++++++++ >> linux-user/xtensa/cpu_loop.c | 3 +++ >> 19 files changed, 59 insertions(+), 20 deletions(-) >> diff --git a/linux-user/sparc/cpu_loop.c >> b/linux-user/sparc/cpu_loop.c >> index 7391e2add8..f054316dce 100644 >> --- a/linux-user/sparc/cpu_loop.c >> +++ b/linux-user/sparc/cpu_loop.c >> @@ -229,7 +229,9 @@ void cpu_loop (CPUSPARCState *env) >> env->regwptr[2], env->regwptr[3], >> env->regwptr[4], env->regwptr[5], >> 0, 0); >> - if (ret == -QEMU_ERESTARTSYS || ret == -QEMU_ESIGRETURN) { >> + if (ret == -QEMU_ERESTARTSYS >> + || ret == -QEMU_ESIGRETURN >> + || ret == -QEMU_ESETPC) { >> break; >> } > > Just a style nit: > if (ret == -QEMU_ERESTARTSYS || > ret == -QEMU_ESIGRETURN || > ret == -QEMU_ESETPC) {
I was hopping the ret test could be wrapped up into a helper but it seems sparc and x86 have enough variation in handled ret codes to make that difficult. <snip> -- Alex Bennée Virtualisation Tech Lead @ Linaro
