]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
mips: Fix return from syscall mechanism for nanoMIPS
authorAleksandar Rikalo <aleksandar.rikalo@rt-rk.com>
Tue, 14 Jan 2020 17:24:29 +0000 (17:24 +0000)
committerPetar Jovanovic <mips32r2@gmail.com>
Tue, 14 Jan 2020 17:24:29 +0000 (17:24 +0000)
- 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
coregrind/m_syswrap/syswrap-nanomips-linux.c
coregrind/m_trampoline.S

index 222ca246549e9296eaba5cf80f4a0497ca3d0470..cdf329c7567ab7f81dc41168883ded680409bc6b 100644 (file)
@@ -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];
index db13bd7d001ebcfb3ead7fc3c18e44b1bb835a3a..4ab9bccedc5291cb178576433a38fe40d1c8a1c1 100644 (file)
@@ -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",
index eb89f021dd4b33148d81a06a6f9d0f5e42e7a30d..c2d642992ad26ad627cb985108b00fce41675dfc 100644 (file)
@@ -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)