From: "Eric W. Biederman" <ebiederm@xmission.com>
To: linux-kernel@vger.kernel.org
Cc: linux-arch@vger.kernel.org, Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>,
x86@kernel.org, "Eric W. Biederman" <ebiederm@xmission.com>
Subject: [REVIEW][PATCH 11/20] signal/x86/traps: Simplify trap generation
Date: Tue, 18 Sep 2018 02:05:37 +0200 [thread overview]
Message-ID: <20180918000546.12552-11-ebiederm@xmission.com> (raw)
In-Reply-To: <87y3bzk6yv.fsf@xmission.com>
Update the DO_ERROR macro to take si_code and si_addr values for a siginfo,
removing the need for the fill_trap_info function.
Update do_trap to also take the sicode and si_addr values for a sigininfo
and modify the code to call force_sig when a sicode is not passed in
and to call force_sig_fault when all of the information is present.
Making this a more obvious, simpler and less error prone construction.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
---
arch/x86/kernel/traps.c | 85 ++++++++++++-----------------------------
1 file changed, 24 insertions(+), 61 deletions(-)
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 3e4a3172d711..eb54f1964252 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -241,40 +241,9 @@ static void show_signal(struct task_struct *tsk, int signr,
}
}
-static siginfo_t *fill_trap_info(struct pt_regs *regs, int signr, int trapnr,
- siginfo_t *info)
-{
- unsigned long siaddr;
- int sicode;
-
- switch (trapnr) {
- default:
- return SEND_SIG_PRIV;
-
- case X86_TRAP_DE:
- sicode = FPE_INTDIV;
- siaddr = uprobe_get_trap_addr(regs);
- break;
- case X86_TRAP_UD:
- sicode = ILL_ILLOPN;
- siaddr = uprobe_get_trap_addr(regs);
- break;
- case X86_TRAP_AC:
- sicode = BUS_ADRALN;
- siaddr = 0;
- break;
- }
-
- info->si_signo = signr;
- info->si_errno = 0;
- info->si_code = sicode;
- info->si_addr = (void __user *)siaddr;
- return info;
-}
-
static void
do_trap(int trapnr, int signr, char *str, struct pt_regs *regs,
- long error_code, siginfo_t *info)
+ long error_code, int sicode, void __user *addr)
{
struct task_struct *tsk = current;
@@ -284,15 +253,16 @@ do_trap(int trapnr, int signr, char *str, struct pt_regs *regs,
show_signal(tsk, signr, "trap ", str, regs, error_code);
- force_sig_info(signr, info ?: SEND_SIG_PRIV, tsk);
+ if (!sicode)
+ force_sig(signr, tsk);
+ else
+ force_sig_fault(signr, sicode, addr, tsk);
}
NOKPROBE_SYMBOL(do_trap);
static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
- unsigned long trapnr, int signr)
+ unsigned long trapnr, int signr, int sicode, void __user *addr)
{
- siginfo_t info;
-
RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
/*
@@ -305,26 +275,26 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
NOTIFY_STOP) {
cond_local_irq_enable(regs);
- clear_siginfo(&info);
- do_trap(trapnr, signr, str, regs, error_code,
- fill_trap_info(regs, signr, trapnr, &info));
+ do_trap(trapnr, signr, str, regs, error_code, sicode, addr);
}
}
-#define DO_ERROR(trapnr, signr, str, name) \
-dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
-{ \
- do_error_trap(regs, error_code, str, trapnr, signr); \
+#define IP ((void __user *)uprobe_get_trap_addr(regs))
+#define DO_ERROR(trapnr, signr, sicode, addr, str, name) \
+dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
+{ \
+ do_error_trap(regs, error_code, str, trapnr, signr, sicode, addr); \
}
-DO_ERROR(X86_TRAP_DE, SIGFPE, "divide error", divide_error)
-DO_ERROR(X86_TRAP_OF, SIGSEGV, "overflow", overflow)
-DO_ERROR(X86_TRAP_UD, SIGILL, "invalid opcode", invalid_op)
-DO_ERROR(X86_TRAP_OLD_MF, SIGFPE, "coprocessor segment overrun",coprocessor_segment_overrun)
-DO_ERROR(X86_TRAP_TS, SIGSEGV, "invalid TSS", invalid_TSS)
-DO_ERROR(X86_TRAP_NP, SIGBUS, "segment not present", segment_not_present)
-DO_ERROR(X86_TRAP_SS, SIGBUS, "stack segment", stack_segment)
-DO_ERROR(X86_TRAP_AC, SIGBUS, "alignment check", alignment_check)
+DO_ERROR(X86_TRAP_DE, SIGFPE, FPE_INTDIV, IP, "divide error", divide_error)
+DO_ERROR(X86_TRAP_OF, SIGSEGV, 0, NULL, "overflow", overflow)
+DO_ERROR(X86_TRAP_UD, SIGILL, ILL_ILLOPN, IP, "invalid opcode", invalid_op)
+DO_ERROR(X86_TRAP_OLD_MF, SIGFPE, 0, NULL, "coprocessor segment overrun", coprocessor_segment_overrun)
+DO_ERROR(X86_TRAP_TS, SIGSEGV, 0, NULL, "invalid TSS", invalid_TSS)
+DO_ERROR(X86_TRAP_NP, SIGBUS, 0, NULL, "segment not present", segment_not_present)
+DO_ERROR(X86_TRAP_SS, SIGBUS, 0, NULL, "stack segment", stack_segment)
+DO_ERROR(X86_TRAP_AC, SIGBUS, BUS_ADRALN, NULL, "alignment check", alignment_check)
+#undef IP
#ifdef CONFIG_VMAP_STACK
__visible void __noreturn handle_stack_overflow(const char *message,
@@ -541,7 +511,7 @@ dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)
* up here if the kernel has MPX turned off at compile
* time..
*/
- do_trap(X86_TRAP_BR, SIGSEGV, "bounds", regs, error_code, NULL);
+ do_trap(X86_TRAP_BR, SIGSEGV, "bounds", regs, error_code, 0, NULL);
}
dotraplinkage void
@@ -625,7 +595,7 @@ dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
goto exit;
cond_local_irq_enable(regs);
- do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, NULL);
+ do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, 0, NULL);
cond_local_irq_disable(regs);
exit:
@@ -936,20 +906,13 @@ NOKPROBE_SYMBOL(do_device_not_available);
#ifdef CONFIG_X86_32
dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code)
{
- siginfo_t info;
-
RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
local_irq_enable();
- clear_siginfo(&info);
- info.si_signo = SIGILL;
- info.si_errno = 0;
- info.si_code = ILL_BADSTK;
- info.si_addr = NULL;
if (notify_die(DIE_TRAP, "iret exception", regs, error_code,
X86_TRAP_IRET, SIGILL) != NOTIFY_STOP) {
do_trap(X86_TRAP_IRET, SIGILL, "iret exception", regs, error_code,
- &info);
+ ILL_BADSTK, (void __user *)NULL);
}
}
#endif
--
2.17.1
next prev parent reply other threads:[~2018-09-18 0:13 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-18 0:03 [REVIEW][PATCH 00/20] siginfo cleanups for x86 Eric W. Biederman
2018-09-18 0:05 ` [REVIEW][PATCH 01/20] signal: Simplify tracehook_report_syscall_exit Eric W. Biederman
2018-09-18 20:15 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 02/20] signal/x86: Inline fill_sigtrap_info in it's only caller send_sigtrap Eric W. Biederman
2018-09-18 20:16 ` Thomas Gleixner
2018-09-19 5:46 ` Christoph Hellwig
2018-09-19 6:46 ` Eric W. Biederman
2018-09-18 0:05 ` [REVIEW][PATCH 03/20] signal/x86: Move MCE error reporting out of force_sig_info_fault Eric W. Biederman
2018-09-18 20:19 ` Thomas Gleixner
2018-09-19 13:49 ` Eric W. Biederman
2018-09-18 0:05 ` [REVIEW][PATCH 04/20] signal/x86: Use send_sig_mceerr as apropriate Eric W. Biederman
2018-09-18 20:21 ` Thomas Gleixner
2018-10-01 13:04 ` Paolo Bonzini
2018-09-18 0:05 ` [REVIEW][PATCH 05/20] signal/x86: In trace_mpx_bounds_register_exception add __user annotations Eric W. Biederman
2018-09-18 20:22 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 06/20] signal/x86: Move mpx siginfo generation into do_bounds Eric W. Biederman
2018-09-18 20:25 ` Thomas Gleixner
2018-09-19 5:48 ` Christoph Hellwig
2018-09-19 13:52 ` Eric W. Biederman
2018-09-18 0:05 ` [REVIEW][PATCH 07/20] signal/x86/traps: Factor out show_signal Eric W. Biederman
2018-09-18 20:28 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 08/20] signal/x86/traps: Move setting error_code and trap_nr into do_trap_no_signal Eric W. Biederman
2018-09-18 20:33 ` Thomas Gleixner
2018-09-18 20:37 ` Thomas Gleixner
2018-09-21 12:45 ` Eric W. Biederman
2018-09-21 13:39 ` Eric W. Biederman
2018-09-18 0:05 ` [REVIEW][PATCH 09/20] signal/x86/traps: Use force_sig_bnderr Eric W. Biederman
2018-09-18 20:34 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 10/20] signal/x86/traps: Use force_sig instead of open coding it Eric W. Biederman
2018-09-18 20:34 ` Thomas Gleixner
2018-09-18 0:05 ` Eric W. Biederman [this message]
2018-09-18 20:37 ` [REVIEW][PATCH 11/20] signal/x86/traps: Simplify trap generation Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 12/20] signal/x86: Remove pkey parameter from bad_area_nosemaphore Eric W. Biederman
2018-09-18 20:44 ` Thomas Gleixner
2018-09-19 16:33 ` Dave Hansen
2018-09-21 12:34 ` Eric W. Biederman
2018-09-18 0:05 ` [REVIEW][PATCH 13/20] signal/x86: Remove the pkey parameter from do_sigbus Eric W. Biederman
2018-09-18 20:45 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 14/20] signal/x86: Remove pkey parameter from mm_fault_error Eric W. Biederman
2018-09-18 20:46 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 15/20] signal/x86: Don't compute pkey in __do_page_fault Eric W. Biederman
2018-09-18 20:46 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 16/20] signal/x86: Pass pkey not vma into __bad_area Eric W. Biederman
2018-09-18 20:48 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 17/20] signal/x86: Call force_sig_pkuerr from __bad_area_nosemaphore Eric W. Biederman
2018-09-18 20:50 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 18/20] signal/x86: Replace force_sig_info_fault with force_sig_fault Eric W. Biederman
2018-09-18 20:51 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 19/20] signal/x86: Pass pkey by value Eric W. Biederman
2018-09-18 20:52 ` Thomas Gleixner
2018-09-18 0:05 ` [REVIEW][PATCH 20/20] signal/x86: Use force_sig_fault where appropriate Eric W. Biederman
2018-09-18 20:53 ` Thomas Gleixner
2018-09-18 20:55 ` [REVIEW][PATCH 00/20] siginfo cleanups for x86 Thomas Gleixner
2018-09-18 21:10 ` Eric W. Biederman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180918000546.12552-11-ebiederm@xmission.com \
--to=ebiederm@xmission.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).