|
@@ -32,6 +32,7 @@
|
|
|
#include <asm/cacheflush.h>
|
|
|
#include <asm/processor.h>
|
|
|
#include <asm/sigcontext.h>
|
|
|
+#include <asm/uaccess.h>
|
|
|
|
|
|
static struct hard_trap_info {
|
|
|
unsigned char tt; /* Trap type code for MIPS R3xxx and R4xxx */
|
|
@@ -208,7 +209,14 @@ void arch_kgdb_breakpoint(void)
|
|
|
|
|
|
static void kgdb_call_nmi_hook(void *ignored)
|
|
|
{
|
|
|
+ mm_segment_t old_fs;
|
|
|
+
|
|
|
+ old_fs = get_fs();
|
|
|
+ set_fs(get_ds());
|
|
|
+
|
|
|
kgdb_nmicallback(raw_smp_processor_id(), NULL);
|
|
|
+
|
|
|
+ set_fs(old_fs);
|
|
|
}
|
|
|
|
|
|
void kgdb_roundup_cpus(unsigned long flags)
|
|
@@ -282,6 +290,7 @@ static int kgdb_mips_notify(struct notifier_block *self, unsigned long cmd,
|
|
|
struct die_args *args = (struct die_args *)ptr;
|
|
|
struct pt_regs *regs = args->regs;
|
|
|
int trap = (regs->cp0_cause & 0x7c) >> 2;
|
|
|
+ mm_segment_t old_fs;
|
|
|
|
|
|
#ifdef CONFIG_KPROBES
|
|
|
/*
|
|
@@ -296,11 +305,17 @@ static int kgdb_mips_notify(struct notifier_block *self, unsigned long cmd,
|
|
|
if (user_mode(regs))
|
|
|
return NOTIFY_DONE;
|
|
|
|
|
|
+ /* Kernel mode. Set correct address limit */
|
|
|
+ old_fs = get_fs();
|
|
|
+ set_fs(get_ds());
|
|
|
+
|
|
|
if (atomic_read(&kgdb_active) != -1)
|
|
|
kgdb_nmicallback(smp_processor_id(), regs);
|
|
|
|
|
|
- if (kgdb_handle_exception(trap, compute_signal(trap), cmd, regs))
|
|
|
+ if (kgdb_handle_exception(trap, compute_signal(trap), cmd, regs)) {
|
|
|
+ set_fs(old_fs);
|
|
|
return NOTIFY_DONE;
|
|
|
+ }
|
|
|
|
|
|
if (atomic_read(&kgdb_setting_breakpoint))
|
|
|
if ((trap == 9) && (regs->cp0_epc == (unsigned long)breakinst))
|
|
@@ -310,6 +325,7 @@ static int kgdb_mips_notify(struct notifier_block *self, unsigned long cmd,
|
|
|
local_irq_enable();
|
|
|
__flush_cache_all();
|
|
|
|
|
|
+ set_fs(old_fs);
|
|
|
return NOTIFY_STOP;
|
|
|
}
|
|
|
|