lkml.org 
[lkml]   [2008]   [Jun]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 29/60] microblaze_v4: traps support
    Date
    From: Michal Simek <monstr@monstr.eu>


    Signed-off-by: Michal Simek <monstr@monstr.eu>
    ---
    arch/microblaze/kernel/traps.c | 86 ++++++++++++++++++++++++++++++++++++++++
    1 files changed, 86 insertions(+), 0 deletions(-)
    create mode 100644 arch/microblaze/kernel/traps.c

    diff --git a/arch/microblaze/kernel/traps.c b/arch/microblaze/kernel/traps.c
    new file mode 100644
    index 0000000..69d75ee
    --- /dev/null
    +++ b/arch/microblaze/kernel/traps.c
    @@ -0,0 +1,86 @@
    +/*
    + * Copyright (C) 2006 Atmark Techno, Inc.
    + *
    + * 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/kernel.h>
    +#include <linux/kallsyms.h>
    +#include <linux/module.h>
    +#include <linux/sched.h>
    +
    +#include <asm/exceptions.h>
    +#include <asm/system.h>
    +
    +void trap_init(void)
    +{
    + initialize_exception_handlers();
    + __enable_hw_exceptions();
    +}
    +
    +void __bad_xchg(volatile void *ptr, int size)
    +{
    + printk(KERN_INFO "xchg: bad data size: pc 0x%p, ptr 0x%p, size %d\n",
    + __builtin_return_address(0), ptr, size);
    + BUG();
    +}
    +EXPORT_SYMBOL(__bad_xchg);
    +
    +static int kstack_depth_to_print = 24;
    +
    +void show_trace(struct task_struct *task, unsigned long *stack)
    +{
    + unsigned long addr;
    +
    + if (!stack)
    + stack = (unsigned long *)&stack;
    +
    + printk(KERN_INFO "Call Trace: ");
    +#ifdef CONFIG_KALLSYMS
    + printk(KERN_INFO "\n");
    +#endif
    + while (!kstack_end(stack)) {
    + addr = *stack++;
    + if (__kernel_text_address(addr)) {
    + printk(KERN_INFO "[<%08lx>] ", addr);
    + print_symbol("%s\n", addr);
    + }
    + }
    + printk(KERN_INFO "\n");
    +}
    +
    +void show_stack(struct task_struct *task, unsigned long *sp)
    +{
    + unsigned long *stack;
    + int i;
    +
    + if (sp == NULL) {
    + if (task)
    + sp = (unsigned long *) ((struct thread_info *)
    + (task->stack))->cpu_context.r1;
    + else
    + sp = (unsigned long *)&sp;
    + }
    +
    + stack = sp;
    +
    + printk(KERN_INFO "\nStack:\n ");
    +
    + for (i = 0; i < kstack_depth_to_print; i++) {
    + if (kstack_end(sp))
    + break;
    + if (i && ((i % 8) == 0))
    + printk("\n ");
    + printk("%08lx ", *sp++);
    + }
    + printk("\n");
    + show_trace(task, stack);
    +}
    +
    +void dump_stack(void)
    +{
    + show_stack(NULL, NULL);
    +}
    +EXPORT_SYMBOL(dump_stack);
    --
    1.5.4.GIT


    \
     
     \ /
      Last update: 2008-06-26 14:57    [W:4.186 / U:0.232 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site