1 /* Provide basic stack dumping functions
3 * Copyright 2004-2009 Analog Devices Inc.
5 * Licensed under the GPL-2 or later
8 #include <linux/kernel.h>
9 #include <linux/thread_info.h>
11 #include <linux/uaccess.h>
12 #include <linux/module.h>
13 #include <asm/trace.h>
16 * Checks to see if the address pointed to is either a
17 * 16-bit CALL instruction, or a 32-bit CALL instruction
19 static bool is_bfin_call(unsigned short *addr
)
23 if (!get_instruction(&opcode
, addr
))
26 if ((opcode
>= 0x0060 && opcode
<= 0x0067) ||
27 (opcode
>= 0x0070 && opcode
<= 0x0077) ||
28 (opcode
>= 0xE3000000 && opcode
<= 0xE3FFFFFF))
35 void show_stack(struct task_struct
*task
, unsigned long *stack
)
38 unsigned int *addr
, *endstack
, *fp
= 0, *frame
;
39 unsigned short *ins_addr
;
41 unsigned int i
, j
, ret_addr
, frame_no
= 0;
44 * If we have been passed a specific stack, use that one otherwise
45 * if we have been passed a task structure, use that, otherwise
46 * use the stack of where the variable "stack" exists
51 /* We know this is a kernel stack, so this is the start/end */
52 stack
= (unsigned long *)task
->thread
.ksp
;
53 endstack
= (unsigned int *)(((unsigned int)(stack
) & ~(THREAD_SIZE
- 1)) + THREAD_SIZE
);
55 /* print out the existing stack info */
56 stack
= (unsigned long *)&stack
;
57 endstack
= (unsigned int *)PAGE_ALIGN((unsigned int)stack
);
60 endstack
= (unsigned int *)PAGE_ALIGN((unsigned int)stack
);
62 printk(KERN_NOTICE
"Stack info:\n");
63 decode_address(buf
, (unsigned int)stack
);
64 printk(KERN_NOTICE
" SP: [0x%p] %s\n", stack
, buf
);
66 if (!access_ok(VERIFY_READ
, stack
, (unsigned int)endstack
- (unsigned int)stack
)) {
67 printk(KERN_NOTICE
"Invalid stack pointer\n");
71 /* First thing is to look for a frame pointer */
72 for (addr
= (unsigned int *)((unsigned int)stack
& ~0xF); addr
< endstack
; addr
++) {
75 ins_addr
= (unsigned short *)*addr
;
77 if (is_bfin_call(ins_addr
))
81 /* Let's check to see if it is a frame pointer */
82 while (fp
>= (addr
- 1) && fp
< endstack
83 && fp
&& ((unsigned int) fp
& 0x3) == 0)
84 fp
= (unsigned int *)*fp
;
85 if (fp
== 0 || fp
== endstack
) {
94 printk(KERN_NOTICE
" FP: (0x%p)\n", fp
);
99 * Now that we think we know where things are, we
100 * walk the stack again, this time printing things out
101 * incase there is no frame pointer, we still look for
102 * valid return addresses
105 /* First time print out data, next time, print out symbols */
106 for (j
= 0; j
<= 1; j
++) {
108 printk(KERN_NOTICE
"Return addresses in stack:\n");
110 printk(KERN_NOTICE
" Memory from 0x%08lx to %p", ((long unsigned int)stack
& ~0xF), endstack
);
115 for (addr
= (unsigned int *)((unsigned int)stack
& ~0xF), i
= 0;
116 addr
< endstack
; addr
++, i
++) {
119 if (!j
&& i
% 8 == 0)
120 printk(KERN_NOTICE
"%p:", addr
);
122 /* if it is an odd address, or zero, just skip it */
123 if (*addr
& 0x1 || !*addr
)
126 ins_addr
= (unsigned short *)*addr
;
128 /* Go back one instruction, and see if it is a CALL */
130 ret_addr
= is_bfin_call(ins_addr
);
132 if (!j
&& stack
== (unsigned long *)addr
)
133 printk("[%08x]", *addr
);
136 decode_address(buf
, (unsigned int)*addr
);
138 printk(KERN_NOTICE
" frame %2i : %s\n", frame_no
, buf
);
141 printk(KERN_NOTICE
" address : %s\n", buf
);
143 printk("<%08x>", *addr
);
144 else if (fp
== addr
) {
148 printk("(%08x)", *addr
);
150 fp
= (unsigned int *)*addr
;
154 printk(" %08x ", *addr
);
161 EXPORT_SYMBOL(show_stack
);
163 void dump_stack(void)
166 #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
169 trace_buffer_save(tflags
);
170 dump_bfin_trace_buffer();
171 dump_stack_print_info(KERN_DEFAULT
);
172 show_stack(current
, &stack
);
173 trace_buffer_restore(tflags
);
175 EXPORT_SYMBOL(dump_stack
);