Florian Hofhammer <[email protected]> writes:

> On 25/02/2026 10:25, Alex Bennée wrote:
>> 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.
>
> It's not just x86 and sparc, there generally seems to not be consensus
> on whether return codes are checked via a single conditional check (as
> is the case with sparc), dedicated conditional checks for each possible
> error value, or via switch statements. I think moving that into a helper
> would require a bit of refactoring across architectures.
> I could check that out for a follow-up patch set if you think this makes
> sense.

I think we can live with it for now:

Reviewed-by: Alex Bennée <[email protected]>


>
> Best regards,
> Florian

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro

Reply via email to