Signed-off-by: Timothy Edward Baldwin <t.e.baldwi...@members.leeds.ac.uk> ---
Signal handling NOT TESTED linux-user/alpha/syscall.h | 2 ++ linux-user/main.c | 7 +++++-- linux-user/signal.c | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/linux-user/alpha/syscall.h b/linux-user/alpha/syscall.h index 245cff2..554a4bf 100644 --- a/linux-user/alpha/syscall.h +++ b/linux-user/alpha/syscall.h @@ -255,3 +255,5 @@ struct target_pt_regs { #define TARGET_MINSIGSTKSZ 4096 #define TARGET_MLOCKALL_MCL_CURRENT 0x2000 #define TARGET_MLOCKALL_MCL_FUTURE 0x4000 + +#define TARGET_USE_ERESTARTSYS 1 diff --git a/linux-user/main.c b/linux-user/main.c index b239097..349abe2 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -3237,8 +3237,11 @@ void cpu_loop(CPUAlphaState *env) env->ir[IR_A2], env->ir[IR_A3], env->ir[IR_A4], env->ir[IR_A5], 0, 0); - if (trapnr == TARGET_NR_sigreturn - || trapnr == TARGET_NR_rt_sigreturn) { + if (sysret == -TARGET_ERESTARTSYS) { + env->ir[IR_PV] -= 4; + break; + } + if (sysret == -TARGET_QEMU_ESIGRETURN) { break; } /* Syscall writes 0 to V0 to bypass error check, similar diff --git a/linux-user/signal.c b/linux-user/signal.c index 9629c72..5cf75a4 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -5548,7 +5548,7 @@ long do_sigreturn(CPUAlphaState *env) restore_sigcontext(env, sc); unlock_user_struct(sc, sc_addr, 0); - return env->ir[IR_V0]; + return -TARGET_QEMU_ESIGRETURN; badframe: force_sig(TARGET_SIGSEGV); @@ -5574,7 +5574,7 @@ long do_rt_sigreturn(CPUAlphaState *env) } unlock_user_struct(frame, frame_addr, 0); - return env->ir[IR_V0]; + return -TARGET_QEMU_ESIGRETURN; badframe: -- 2.1.4