// SPDX-License-Identifier: GPL-2.0-only /* * Signal support for Hexagon processor * * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
*/
if (!access_ok(frame, sizeof(struct rt_sigframe))) return -EFAULT;
if (copy_siginfo_to_user(&frame->info, &ksig->info)) return -EFAULT;
/* The on-stack signal trampoline is no longer executed; * however, the libgcc signal frame unwinding code checks for * the presence of these two numeric magic values.
*/
err |= __put_user(0x7800d166, &frame->tramp[0]);
err |= __put_user(0x5400c004, &frame->tramp[1]);
err |= setup_sigcontext(regs, &frame->uc.uc_mcontext);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
err |= __save_altstack(&frame->uc.uc_stack, user_stack_pointer(regs)); if (err) return -EFAULT;
/* * Setup invocation of signal handler
*/ staticvoid handle_signal(struct ksignal *ksig, struct pt_regs *regs)
{ int ret;
/* * If we're handling a signal that aborted a system call, * set up the error return value before adding the signal * frame to the stack.
*/
if (regs->syscall_nr >= 0) { switch (regs->r00) { case -ERESTART_RESTARTBLOCK: case -ERESTARTNOHAND:
regs->r00 = -EINTR; break; case -ERESTARTSYS: if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
regs->r00 = -EINTR; break;
}
fallthrough; case -ERESTARTNOINTR:
regs->r06 = regs->syscall_nr;
pt_set_elr(regs, pt_elr(regs) - 4);
regs->r00 = regs->restart_r0; break; default: break;
}
}
/* * Set up the stack frame; not doing the SA_SIGINFO thing. We * only set up the rt_frame flavor.
*/ /* If there was an error on setup, no signal was delivered. */
ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.