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

Reply via email to