linux/arch/microblaze/kernel/traps.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu>
   3 * Copyright (C) 2007-2009 PetaLogix
   4 * Copyright (C) 2006 Atmark Techno, Inc.
   5 *
   6 * This file is subject to the terms and conditions of the GNU General Public
   7 * License. See the file "COPYING" in the main directory of this archive
   8 * for more details.
   9 */
  10
  11#include <linux/export.h>
  12#include <linux/kernel.h>
  13#include <linux/kallsyms.h>
  14#include <linux/sched.h>
  15#include <linux/sched/debug.h>
  16#include <linux/debug_locks.h>
  17
  18#include <asm/exceptions.h>
  19#include <asm/unwind.h>
  20
  21void trap_init(void)
  22{
  23        __enable_hw_exceptions();
  24}
  25
  26static unsigned long kstack_depth_to_print;     /* 0 == entire stack */
  27
  28static int __init kstack_setup(char *s)
  29{
  30        return !kstrtoul(s, 0, &kstack_depth_to_print);
  31}
  32__setup("kstack=", kstack_setup);
  33
  34void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl)
  35{
  36        unsigned long words_to_show;
  37        u32 fp = (u32) sp;
  38
  39        if (fp == 0) {
  40                if (task) {
  41                        fp = ((struct thread_info *)
  42                                (task->stack))->cpu_context.r1;
  43                } else {
  44                        /* Pick up caller of dump_stack() */
  45                        fp = (u32)&sp - 8;
  46                }
  47        }
  48
  49        words_to_show = (THREAD_SIZE - (fp & (THREAD_SIZE - 1))) >> 2;
  50        if (kstack_depth_to_print && (words_to_show > kstack_depth_to_print))
  51                words_to_show = kstack_depth_to_print;
  52
  53        printk("%sKernel Stack:\n", loglvl);
  54
  55        /*
  56         * Make the first line an 'odd' size if necessary to get
  57         * remaining lines to start at an address multiple of 0x10
  58         */
  59        if (fp & 0xF) {
  60                unsigned long line1_words = (0x10 - (fp & 0xF)) >> 2;
  61                if (line1_words < words_to_show) {
  62                        print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS, 32,
  63                                       4, (void *)fp, line1_words << 2, 0);
  64                        fp += line1_words << 2;
  65                        words_to_show -= line1_words;
  66                }
  67        }
  68        print_hex_dump(loglvl, "", DUMP_PREFIX_ADDRESS, 32, 4, (void *)fp,
  69                       words_to_show << 2, 0);
  70        printk("%s\n\nCall Trace:\n", loglvl);
  71        microblaze_unwind(task, NULL, loglvl);
  72        printk("%s\n", loglvl);
  73
  74        if (!task)
  75                task = current;
  76
  77        debug_show_held_locks(task);
  78}
  79