From d7b2a29718daa9dad66b609d2bc6166a62db38ef Mon Sep 17 00:00:00 2001 From: Aleksandar Rikalo Date: Tue, 14 Jan 2020 17:24:29 +0000 Subject: [PATCH] mips: Fix return from syscall mechanism for nanoMIPS - Restore guest sigmask in VG_(sigframe_destroy) - Use "syscall[32]" asm idiom instead of "syscall" with immediate parameter in VG_(nanomips_linux_SUBST_FOR_rt_sigreturn) - Call ML_(fixup_guest_state_to_restart_syscall) from PRE(sys_rt_sigreturn) - Tiny code refactor of sigframe-nanomips-linux.c This fixes none/tests/thread-exits. --- coregrind/m_sigframe/sigframe-nanomips-linux.c | 6 ++++-- coregrind/m_syswrap/syswrap-nanomips-linux.c | 6 ++++++ coregrind/m_trampoline.S | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/coregrind/m_sigframe/sigframe-nanomips-linux.c b/coregrind/m_sigframe/sigframe-nanomips-linux.c index 222ca24654..cdf329c756 100644 --- a/coregrind/m_sigframe/sigframe-nanomips-linux.c +++ b/coregrind/m_sigframe/sigframe-nanomips-linux.c @@ -150,7 +150,7 @@ void VG_(sigframe_create)( ThreadId tid, * Arguments to signal handler: * * a0 = signal number - * a1 = 0 (should be cause) + * a1 = pointer to siginfo_t * a2 = pointer to ucontext * * $25 and c0_epc point to the signal handler, $29 points to @@ -196,9 +196,11 @@ void VG_(sigframe_destroy)( ThreadId tid, Bool isRT ) { tst = VG_(get_ThreadState)(tid); frame = (struct rt_sigframe *)(Addr)tst->arch.vex.guest_r29; priv1 = &frame->priv; + vg_assert(priv1->magicPI == 0x31415927); ucp = &frame->rs_uc; + tst->sig_mask = ucp->uc_sigmask; + tst->tmp_sig_mask = ucp->uc_sigmask; mc = &ucp->uc_mcontext; - vg_assert(priv1->magicPI == 0x31415927); tst->arch.vex.guest_r1 = mc->sc_regs[1]; tst->arch.vex.guest_r2 = mc->sc_regs[2]; tst->arch.vex.guest_r3 = mc->sc_regs[3]; diff --git a/coregrind/m_syswrap/syswrap-nanomips-linux.c b/coregrind/m_syswrap/syswrap-nanomips-linux.c index db13bd7d00..4ab9bccedc 100644 --- a/coregrind/m_syswrap/syswrap-nanomips-linux.c +++ b/coregrind/m_syswrap/syswrap-nanomips-linux.c @@ -471,10 +471,16 @@ POST(sys_ptrace) PRE(sys_rt_sigreturn) { + ThreadState* tst; PRINT ("rt_sigreturn ( )"); vg_assert (VG_ (is_valid_tid) (tid)); vg_assert (tid >= 1 && tid < VG_N_THREADS); vg_assert (VG_ (is_running_thread) (tid)); + + tst = VG_(get_ThreadState)(tid); + + ML_(fixup_guest_state_to_restart_syscall)(&tst->arch); + /* Restore register state from frame and remove it */ VG_ (sigframe_destroy) (tid, True); /* Tell the driver not to update the guest state with the "result", diff --git a/coregrind/m_trampoline.S b/coregrind/m_trampoline.S index eb89f021dd..c2d642992a 100644 --- a/coregrind/m_trampoline.S +++ b/coregrind/m_trampoline.S @@ -1326,8 +1326,8 @@ VG_(trampoline_stuff_start): .global VG_(nanomips_linux_SUBST_FOR_rt_sigreturn) VG_(nanomips_linux_SUBST_FOR_rt_sigreturn): - li $t4,__NR_rt_sigreturn - syscall 1 + li $t4, __NR_rt_sigreturn + syscall[32] .long 0 .global VG_(nanomips_linux_REDIR_FOR_index) -- 2.47.2