8 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <asm/trace.h>
19 static bool is_bfin_call(
unsigned short *
addr)
26 if ((opcode >= 0x0060 && opcode <= 0x0067) ||
27 (opcode >= 0x0070 && opcode <= 0x0077) ||
28 (opcode >= 0xE3000000 && opcode <= 0xE3FFFFFF))
39 unsigned short *ins_addr;
52 stack = (
unsigned long *)task->
thread.ksp;
56 stack = (
unsigned long *)&stack;
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))
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) {
106 for (j = 0; j <= 1; j++) {
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)
123 if (*addr & 0x1 || !*addr)
126 ins_addr = (
unsigned short *)*addr;
130 ret_addr = is_bfin_call(ins_addr);
132 if (!j && stack == (
unsigned long *)addr)
144 else if (fp == addr) {
150 fp = (
unsigned int *)*addr;
166 #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON