Skip to content

Commit

Permalink
microblaze: Stack trace support
Browse files Browse the repository at this point in the history
This is working implemetation but the problem is that
Microblaze misses frame pointer that's why is there
big loop which trace and show all addresses which are in text.
It shows addresses which are in registers, etc.

This is problem and this is the reason why all Microblaze
traces are wrong. There is an option to do hacks and trace
the kernel code but this is too complicated.

Signed-off-by: Michal Simek <monstr@monstr.eu>
  • Loading branch information
Michal Simek committed Dec 14, 2009
1 parent 7cf79d5 commit 24b45a1
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 0 deletions.
3 changes: 3 additions & 0 deletions arch/microblaze/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ config GENERIC_GPIO
config GENERIC_CSUM
def_bool y

config STACKTRACE_SUPPORT
def_bool y

config PCI
def_bool n

Expand Down
1 change: 1 addition & 0 deletions arch/microblaze/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@ obj-$(CONFIG_SELFMOD) += selfmod.o
obj-$(CONFIG_HEART_BEAT) += heartbeat.o
obj-$(CONFIG_MODULES) += microblaze_ksyms.o module.o
obj-$(CONFIG_MMU) += misc.o
obj-$(CONFIG_STACKTRACE) += stacktrace.o

obj-y += entry$(MMU).o
65 changes: 65 additions & 0 deletions arch/microblaze/kernel/stacktrace.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Stack trace support for Microblaze.
*
* Copyright (C) 2009 Michal Simek <monstr@monstr.eu>
* Copyright (C) 2009 PetaLogix
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*/

#include <linux/sched.h>
#include <linux/stacktrace.h>
#include <linux/thread_info.h>
#include <linux/ptrace.h>
#include <linux/module.h>

/* FIXME initial support */
void save_stack_trace(struct stack_trace *trace)
{
unsigned long *sp;
unsigned long addr;
asm("addik %0, r1, 0" : "=r" (sp));

while (!kstack_end(sp)) {
addr = *sp++;
if (__kernel_text_address(addr)) {
if (trace->skip > 0)
trace->skip--;
else
trace->entries[trace->nr_entries++] = addr;

if (trace->nr_entries >= trace->max_entries)
break;
}
}
}
EXPORT_SYMBOL_GPL(save_stack_trace);

void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
{
unsigned int *sp;
unsigned long addr;

struct thread_info *ti = task_thread_info(tsk);

if (tsk == current)
asm("addik %0, r1, 0" : "=r" (sp));
else
sp = (unsigned int *)ti->cpu_context.r1;

while (!kstack_end(sp)) {
addr = *sp++;
if (__kernel_text_address(addr)) {
if (trace->skip > 0)
trace->skip--;
else
trace->entries[trace->nr_entries++] = addr;

if (trace->nr_entries >= trace->max_entries)
break;
}
}
}
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);

0 comments on commit 24b45a1

Please sign in to comment.