patch-2.4.18 linux/arch/cris/kernel/traps.c
Next file: linux/arch/cris/mm/fault.c
Previous file: linux/arch/cris/kernel/time.c
Back to the patch index
Back to the overall index
- Lines: 198
- Date:
Tue Jan 8 16:00:08 2002
- Orig file:
linux.orig/arch/cris/kernel/traps.c
- Orig date:
Mon Feb 18 20:18:39 2002
diff -Naur -X /home/marcelo/lib/dontdiff linux.orig/arch/cris/kernel/traps.c linux/arch/cris/kernel/traps.c
@@ -1,4 +1,4 @@
-/* $Id: traps.c,v 1.15 2001/07/18 14:02:37 bjornw Exp $
+/* $Id: traps.c,v 1.17 2001/12/07 17:02:34 bjornw Exp $
*
* linux/arch/cris/traps.c
*
@@ -30,6 +30,55 @@
int kstack_depth_to_print = 24;
+void show_trace(unsigned long * stack)
+{
+ unsigned long addr, module_start, module_end;
+ extern char _stext, _etext;
+ int i;
+
+ printk("\nCall Trace: ");
+
+ i = 1;
+ module_start = VMALLOC_START;
+ module_end = VMALLOC_END;
+
+ while (((long) stack & (THREAD_SIZE-1)) != 0) {
+ if (__get_user (addr, stack)) {
+ /* This message matches "failing address" marked
+ s390 in ksymoops, so lines containing it will
+ not be filtered out by ksymoops. */
+ printk ("Failing address 0x%lx\n", (unsigned long)stack);
+ break;
+ }
+ stack++;
+
+ /*
+ * If the address is either in the text segment of the
+ * kernel, or in the region which contains vmalloc'ed
+ * memory, it *may* be the address of a calling
+ * routine; if so, print it so that someone tracing
+ * down the cause of the crash will be able to figure
+ * out the call path that was taken.
+ */
+ if (((addr >= (unsigned long) &_stext) &&
+ (addr <= (unsigned long) &_etext)) ||
+ ((addr >= module_start) && (addr <= module_end))) {
+ if (i && ((i % 8) == 0))
+ printk("\n ");
+ printk("[<%08lx>] ", addr);
+ i++;
+ }
+ }
+}
+
+void show_trace_task(struct task_struct *tsk)
+{
+ /* TODO, this is not really useful since its called from
+ * SysRq-T and we don't have a keyboard.. :)
+ */
+}
+
+
/*
* These constants are for searching for possible module text
* segments. MODULE_RANGE is a guess of how much space is likely
@@ -48,9 +97,8 @@
void
show_stack(unsigned long *sp)
{
- unsigned long *stack, addr, module_start, module_end;
+ unsigned long *stack, addr;
int i;
- extern char _stext, _etext;
/*
* debugging aid: "show_stack(NULL);" prints a
@@ -62,7 +110,7 @@
stack = sp;
- printk("\nStack from %08lx:\n ", stack);
+ printk("\nStack from %08lx:\n ", (unsigned long)stack);
for(i = 0; i < kstack_depth_to_print; i++) {
if (((long) stack & (THREAD_SIZE-1)) == 0)
break;
@@ -72,45 +120,13 @@
/* This message matches "failing address" marked
s390 in ksymoops, so lines containing it will
not be filtered out by ksymoops. */
- printk ("Failing address 0x%lx\n", stack);
+ printk ("Failing address 0x%lx\n", (unsigned long)stack);
break;
}
stack++;
printk("%08lx ", addr);
}
-
- printk("\nCall Trace: ");
- stack = sp;
- i = 1;
- module_start = VMALLOC_START;
- module_end = VMALLOC_END;
- while (((long) stack & (THREAD_SIZE-1)) != 0) {
- if (__get_user (addr, stack)) {
- /* This message matches "failing address" marked
- s390 in ksymoops, so lines containing it will
- not be filtered out by ksymoops. */
- printk ("Failing address 0x%lx\n", stack);
- break;
- }
- stack++;
-
- /*
- * If the address is either in the text segment of the
- * kernel, or in the region which contains vmalloc'ed
- * memory, it *may* be the address of a calling
- * routine; if so, print it so that someone tracing
- * down the cause of the crash will be able to figure
- * out the call path that was taken.
- */
- if (((addr >= (unsigned long) &_stext) &&
- (addr <= (unsigned long) &_etext)) ||
- ((addr >= module_start) && (addr <= module_end))) {
- if (i && ((i % 8) == 0))
- printk("\n ");
- printk("[<%08lx>] ", addr);
- i++;
- }
- }
+ show_trace(sp);
}
#if 0
@@ -148,7 +164,7 @@
regs->r8, regs->r9, regs->r10, regs->r11);
printk("r12: %08lx r13: %08lx oR10: %08lx\n",
regs->r12, regs->r13, regs->orig_r10);
- printk("R_MMU_CAUSE: %08lx\n", *R_MMU_CAUSE);
+ printk("R_MMU_CAUSE: %08lx\n", (unsigned long)*R_MMU_CAUSE);
printk("Process %s (pid: %d, stackpage=%08lx)\n",
current->comm, current->pid, (unsigned long)current);
@@ -195,25 +211,56 @@
}
}
+/* Called from entry.S when the watchdog has bitten
+ * We print out something resembling an oops dump, and if
+ * we have the nice doggy development flag set, we halt here
+ * instead of rebooting.
+ */
+
+void
+watchdog_bite_hook(struct pt_regs *regs)
+{
+#ifdef CONFIG_ETRAX_WATCHDOG_NICE_DOGGY
+ cli();
+ stop_watchdog();
+ show_registers(regs);
+ while(1) /* nothing */;
+#else
+ show_registers(regs);
+#endif
+}
+
+/* This is normally the 'Oops' routine */
+
void
die_if_kernel(const char * str, struct pt_regs * regs, long err)
{
+ extern void reset_watchdog(void);
+ extern void stop_watchdog(void);
+
if(user_mode(regs))
return;
+#ifdef CONFIG_ETRAX_WATCHDOG_NICE_DOGGY
+ /* This printout might take too long and trigger the
+ * watchdog normally. If we're in the nice doggy
+ * development mode, stop the watchdog during printout.
+ */
stop_watchdog();
+#endif
printk("%s: %04lx\n", str, err & 0xffff);
show_registers(regs);
+#ifdef CONFIG_ETRAX_WATCHDOG_NICE_DOGGY
reset_watchdog();
-
+#endif
do_exit(SIGSEGV);
}
void __init
trap_init(void)
{
- /* Nothing needs to be done */
+ /* Nothing needs to be done */
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)