summaryrefslogtreecommitdiffstats
path: root/kernel/signal.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2018-01-18 15:54:54 -0500
committerEric W. Biederman <ebiederm@xmission.com>2018-01-22 20:07:09 -0500
commitf8ec66014ffd95a783b1f9f3b62d7cadb96b78d5 (patch)
tree6e57bcf6bcd9e70ccc1b1cd89345299dc9105a33 /kernel/signal.c
parent3b10db2b06e2f6191aabb14babe28dcaa657a947 (diff)
signal: Add send_sig_fault and force_sig_fault
The vast majority of signals sent from architecture specific code are simple faults. Encapsulate this reality with two helper functions so that the nit-picky implementation of preparing a siginfo does not need to be repeated many times on each architecture. As only some architectures support the trapno field, make the trapno arguement only present on those architectures. Similary as ia64 has three fields: imm, flags, and isr that are specific to it. Have those arguments always present on ia64 and no where else. This ensures the architecture specific code always remembers which fields it needs to pass into the siginfo structure. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'kernel/signal.c')
-rw-r--r--kernel/signal.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index f14492ff976f..15ec7b3cbe69 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -1491,6 +1491,53 @@ force_sigsegv(int sig, struct task_struct *p)
1491 return 0; 1491 return 0;
1492} 1492}
1493 1493
1494int force_sig_fault(int sig, int code, void __user *addr
1495 ___ARCH_SI_TRAPNO(int trapno)
1496 ___ARCH_SI_IA64(int imm, unsigned int flags, unsigned long isr)
1497 , struct task_struct *t)
1498{
1499 struct siginfo info;
1500
1501 clear_siginfo(&info);
1502 info.si_signo = sig;
1503 info.si_errno = 0;
1504 info.si_code = code;
1505 info.si_addr = addr;
1506#ifdef __ARCH_SI_TRAPNO
1507 info.si_trapno = trapno;
1508#endif
1509#ifdef __ia64__
1510 info.si_imm = imm;
1511 info.si_flags = flags;
1512 info.si_isr = isr;
1513#endif
1514 return force_sig_info(info.si_signo, &info, t);
1515}
1516
1517int send_sig_fault(int sig, int code, void __user *addr
1518 ___ARCH_SI_TRAPNO(int trapno)
1519 ___ARCH_SI_IA64(int imm, unsigned int flags, unsigned long isr)
1520 , struct task_struct *t)
1521{
1522 struct siginfo info;
1523
1524 clear_siginfo(&info);
1525 info.si_signo = sig;
1526 info.si_errno = 0;
1527 info.si_code = code;
1528 info.si_addr = addr;
1529#ifdef __ARCH_SI_TRAPNO
1530 info.si_trapno = trapno;
1531#endif
1532#ifdef __ia64__
1533 info.si_imm = imm;
1534 info.si_flags = flags;
1535 info.si_isr = isr;
1536#endif
1537 return send_sig_info(info.si_signo, &info, t);
1538}
1539
1540
1494int kill_pgrp(struct pid *pid, int sig, int priv) 1541int kill_pgrp(struct pid *pid, int sig, int priv)
1495{ 1542{
1496 int ret; 1543 int ret;