/* EXPORTED */ void VG_(sigframe_destroy)( ThreadId tid, Bool isRT ) { Addr sp; ThreadState* tst; SizeT size; Int sigNo; tst = VG_(get_ThreadState)(tid); /* Correctly reestablish the frame base address. */ sp = tst->arch.vex.guest_SP; if (!isRT) size = restore_sigframe(tst, (struct sigframe *)sp, &sigNo); else size = restore_rt_sigframe(tst, (struct rt_sigframe *)sp, &sigNo); /* same as for creation: we must announce the full memory (including alignment), otherwise massif might fail on longjmp */ VG_TRACK( die_mem_stack_signal, sp - VG_STACK_REDZONE_SZB, size + VG_STACK_REDZONE_SZB ); if (VG_(clo_trace_signals)) VG_(message)( Vg_DebugMsg, "VG_(sigframe_destroy) (thread %d): isRT=%d valid magic; IP=%#llx\n", tid, isRT, tst->arch.vex.guest_IA); /* tell the tools */ VG_TRACK( post_deliver_signal, tid, sigNo ); }
asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) { struct rt_sigframe __user *frame; /* Always make any pending restarted system calls return -EINTR */ current->restart_block.fn = do_no_restart_syscall; /* * Since we stacked the signal on a 64-bit boundary, * then 'sp' should be word aligned here. If it's * not, then the user is trying to mess with us. */ if (regs->ARM_sp & 7) goto badframe; frame = (struct rt_sigframe __user *)regs->ARM_sp; if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) goto badframe; if (restore_sigframe(regs, &frame->sig)) goto badframe; if (restore_altstack(&frame->sig.uc.uc_stack)) goto badframe; return regs->ARM_r0; badframe: force_sig(SIGSEGV, current); return 0; }
asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) { struct rt_sigframe __user *frame; /* Always make any pending restarted system calls return -EINTR */ current_thread_info()->restart_block.fn = do_no_restart_syscall; /* * Since we stacked the signal on a 128-bit boundary, then 'sp' should * be word aligned here. */ if (regs->sp & 15) goto badframe; frame = (struct rt_sigframe __user *)regs->sp; if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) goto badframe; if (restore_sigframe(regs, frame)) goto badframe; if (restore_altstack(&frame->uc.uc_stack)) goto badframe; return regs->regs[0]; badframe: if (show_unhandled_signals) pr_info_ratelimited("%s[%d]: bad frame in %s: pc=%08llx sp=%08llx\n", current->comm, task_pid_nr(current), __func__, regs->pc, regs->sp); force_sig(SIGSEGV, current); return 0; }
void VG_(sigframe_destroy)( ThreadId tid, Bool isRT ) { Addr esp; ThreadState* tst; SizeT size; Int sigNo; tst = VG_(get_ThreadState)(tid); esp = tst->arch.vex.guest_ESP; if (!isRT) size = restore_sigframe(tst, (struct sigframe *)esp, &sigNo); else size = restore_rt_sigframe(tst, (struct rt_sigframe *)esp, &sigNo); VG_TRACK( die_mem_stack_signal, esp - VG_STACK_REDZONE_SZB, size + VG_STACK_REDZONE_SZB ); if (VG_(clo_trace_signals)) VG_(message)( Vg_DebugMsg, "VG_(signal_return) (thread %d): isRT=%d valid magic; EIP=%#x\n", tid, isRT, tst->arch.vex.guest_EIP); VG_TRACK( post_deliver_signal, tid, sigNo ); }
asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) { struct rt_sigframe __user *frame; current_thread_info()->restart_block.fn = do_no_restart_syscall; if (regs->ARM_sp & 7) goto badframe; frame = (struct rt_sigframe __user *)regs->ARM_sp; if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) goto badframe; if (restore_sigframe(regs, &frame->sig)) goto badframe; if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT) goto badframe; single_step_trap(current); return regs->ARM_r0; badframe: force_sig(SIGSEGV, current); return 0; }
void VG_(sigframe_destroy)( ThreadId tid ) { Addr rsp; ThreadState* tst; SizeT size; Int sigNo; tst = VG_(get_ThreadState)(tid); /* Correctly reestablish the frame base address. */ rsp = tst->arch.vex.guest_RSP; size = restore_sigframe(tst, (struct sigframe *)rsp, &sigNo); VG_TRACK( die_mem_stack_signal, rsp - VG_STACK_REDZONE_SZB, size + VG_STACK_REDZONE_SZB ); if (VG_(clo_trace_signals)) VG_(message)( Vg_DebugMsg, "VG_(signal_return) (thread %d): valid magic; RIP=%#llx\n", tid, tst->arch.vex.guest_RIP); /* tell the tools */ VG_TRACK( post_deliver_signal, tid, sigNo ); }
asmlinkage int sys_sigreturn(struct pt_regs *regs) { struct sigframe __user *frame; /* Always make any pending restarted system calls return -EINTR */ current_thread_info()->restart_block.fn = do_no_restart_syscall; /* * Since we stacked the signal on a 64-bit boundary, * then 'sp' should be word aligned here. If it's * not, then the user is trying to mess with us. */ if (regs->ARM_sp & 7) goto badframe; frame = (struct sigframe __user *)regs->ARM_sp; if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) goto badframe; if (restore_sigframe(regs, frame)) goto badframe; /* Send SIGTRAP if we're single-stepping */ if (current->ptrace & PT_SINGLESTEP) { ptrace_cancel_bpt(current); send_sig(SIGTRAP, current, 1); } return regs->ARM_r0; badframe: force_sig(SIGSEGV, current); return 0; }