2008-02-04 22:31:14 -08:00
/*
* Copyright ( C ) 2001 - 2007 Jeff Dike ( jdike @ { addtoit , linux . intel } . com )
2005-04-16 15:20:36 -07:00
* Licensed under the GPL
*/
2008-02-04 22:31:14 -08:00
# include <linux/kallsyms.h>
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/sched.h>
2005-04-16 15:20:36 -07:00
# include "sysrq.h"
2005-05-28 15:52:00 -07:00
/* Catch non-i386 SUBARCH's. */
# if !defined(CONFIG_UML_X86) || defined(CONFIG_64BIT)
void show_trace ( struct task_struct * task , unsigned long * stack )
2005-04-16 15:20:36 -07:00
{
2008-02-04 22:31:14 -08:00
unsigned long addr ;
2005-04-16 15:20:36 -07:00
2008-02-04 22:31:14 -08:00
if ( ! stack ) {
2005-05-28 15:52:00 -07:00
stack = ( unsigned long * ) & stack ;
2005-04-16 15:20:36 -07:00
WARN_ON ( 1 ) ;
}
2008-02-04 22:31:14 -08:00
printk ( KERN_INFO " Call Trace: \n " ) ;
while ( ( ( long ) stack & ( THREAD_SIZE - 1 ) ) ! = 0 ) {
addr = * stack ;
2005-04-16 15:20:36 -07:00
if ( __kernel_text_address ( addr ) ) {
2008-02-04 22:31:14 -08:00
printk ( KERN_INFO " %08lx: [<%08lx>] " ,
( unsigned long ) stack , addr ) ;
print_symbol ( KERN_CONT " %s " , addr ) ;
printk ( KERN_CONT " \n " ) ;
}
stack + + ;
}
printk ( KERN_INFO " \n " ) ;
2005-04-16 15:20:36 -07:00
}
2005-05-28 15:52:00 -07:00
# endif
2005-04-16 15:20:36 -07:00
/*
* stack dumps generator - this is used by arch - independent code .
* And this is identical to i386 currently .
*/
void dump_stack ( void )
{
unsigned long stack ;
2005-05-28 15:52:00 -07:00
show_trace ( current , & stack ) ;
2005-04-16 15:20:36 -07:00
}
EXPORT_SYMBOL ( dump_stack ) ;
/*Stolen from arch/i386/kernel/traps.c */
2007-02-10 01:44:15 -08:00
static const int kstack_depth_to_print = 24 ;
2005-04-16 15:20:36 -07:00
/* This recently started being used in arch-independent code too, as in
* kernel / sched . c . */
void show_stack ( struct task_struct * task , unsigned long * esp )
{
unsigned long * stack ;
int i ;
if ( esp = = NULL ) {
2005-05-28 15:52:00 -07:00
if ( task ! = current & & task ! = NULL ) {
2005-04-16 15:20:36 -07:00
esp = ( unsigned long * ) KSTK_ESP ( task ) ;
} else {
esp = ( unsigned long * ) & esp ;
}
}
stack = esp ;
2008-02-04 22:31:14 -08:00
for ( i = 0 ; i < kstack_depth_to_print ; i + + ) {
2005-04-16 15:20:36 -07:00
if ( kstack_end ( stack ) )
break ;
if ( i & & ( ( i % 8 ) = = 0 ) )
2009-07-06 13:05:40 -07:00
printk ( KERN_INFO " " ) ;
printk ( KERN_CONT " %08lx " , * stack + + ) ;
2005-04-16 15:20:36 -07:00
}
2005-10-04 14:53:52 -04:00
show_trace ( task , esp ) ;
2005-04-16 15:20:36 -07:00
}