Messages in this thread Patch in this message |  | | | Date | Tue, 5 Aug 2008 00:26:35 -0600 | | From | jmerkey@wolfmoun ... | | Subject | [PATCH 2.6.27-rc1-git5 2/26] mdb: correct kprobes int3 trap | |
Centralized external definitions into include files and corrected
the file to conform to Linux coding practices. fixed word wrap
problems with patches.
Corrected kprobes section for int3 trap where CONFIG_MDB is always
true.
Signed-off-by: Jeffrey Vernon Merkey (jmerkey@wolfmountaingroup.com)
--- a/arch/x86/kernel/traps_32.c 2008-08-04 15:53:24.000000000 -0600
+++ b/arch/x86/kernel/traps_32.c 2008-08-04 16:00:25.000000000 -0600
@@ -46,6 +46,10 @@
#include <linux/edac.h>
#endif
+#ifdef CONFIG_MDB
+#include <linux/mdb.h>
+#endif // CONFIG_MDB
+
#include <asm/arch_hooks.h>
#include <asm/stacktrace.h>
#include <asm/processor.h>
@@ -452,8 +456,15 @@
*/
void die(const char *str, struct pt_regs *regs, long err)
{
- unsigned long flags = oops_begin();
+#ifdef CONFIG_MDB
+ unsigned long flags;
+ mdb_oops = (unsigned char *)str;
+ mdb(SOFTWARE_EXCEPTION, err, regs);
+ flags = oops_begin();
+#else
+ unsigned long flags = oops_begin();
+#endif // CONFIG_MDB
if (die_nest_count < 3) {
report_bug(regs->ip, regs);
@@ -573,9 +584,9 @@
}
DO_VM86_ERROR_INFO(0, SIGFPE, "divide error", divide_error, FPE_INTDIV, regs->ip)
-#ifndef CONFIG_KPROBES
+#if !defined(CONFIG_KPROBES) && !defined(CONFIG_MDB)
DO_VM86_ERROR(3, SIGTRAP, "int3", int3)
-#endif
+#endif // CONFIG_MDB
DO_VM86_ERROR(4, SIGSEGV, "overflow", overflow)
DO_VM86_ERROR(5, SIGSEGV, "bounds", bounds)
DO_ERROR_INFO(6, SIGILL, "invalid opcode", invalid_op, ILL_ILLOPN, regs->ip, 0)
@@ -718,6 +729,9 @@
{
if (notify_die(DIE_NMIUNKNOWN, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
return;
+#ifdef CONFIG_MDB
+ mdb(NMI_EXCEPTION, reason, regs); // nmi is code 2
+#endif // CONFIG_MDB
#ifdef CONFIG_MCA
/*
* Might actually be able to figure out what the guilty party
@@ -756,6 +770,9 @@
printk(" on CPU%d, ip %08lx, registers:\n",
smp_processor_id(), regs->ip);
show_registers(regs);
+#ifdef CONFIG_MDB
+ mdb(NMI_EXCEPTION, 0, regs); // nmi is code 2
+#endif // CONFIG_MDB
if (do_panic)
panic("Non maskable interrupt");
console_silent();
@@ -785,6 +802,10 @@
if (!cpu)
reason = get_nmi_reason();
+#if defined(CONFIG_SMP) && defined(CONFIG_MDB)
+ if (mdb(NMI_EXCEPTION, 0, regs))
+ return;
+#endif // CONFIG_MDB
if (!(reason & 0xc0)) {
if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT)
== NOTIFY_STOP)
@@ -850,6 +871,10 @@
#ifdef CONFIG_KPROBES
void __kprobes do_int3(struct pt_regs *regs, long error_code)
{
+#ifdef CONFIG_MDB
+ if (mdb(BREAKPOINT_EXCEPTION, error_code, regs))
+ return;
+#endif // CONFIG_MDB
trace_hardirqs_fixup();
if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP)
@@ -865,6 +890,16 @@
}
#endif
+#if !defined(CONFIG_KPROBES)
+fastcall void do_int3(struct pt_regs * regs, long error_code)
+{
+#if defined(CONFIG_MDB)
+ if (mdb(BREAKPOINT_EXCEPTION, error_code, regs))
+ return;
+#endif // CONFIG_MDB
+ do_trap(3, SIGTRAP, "int3", 1, regs, error_code, NULL);
+}
+#endif
/*
* Our handling of the processor debug registers is non-trivial.
* We do not clear them on entry and exit from the kernel. Therefore
@@ -895,6 +930,10 @@
trace_hardirqs_fixup();
get_debugreg(condition, 6);
+#ifdef CONFIG_MDB
+ if (mdb(DEBUGGER_EXCEPTION, error_code, regs))
+ return;
+#endif // CONFIG_MDB
/*
* The processor cleared BTF, so don't mark that we need it set.
|  |