static void microblaze_unwind_inner(struct task_struct *task,
                                    unsigned long pc, unsigned long fp,
                                    unsigned long leaf_return,
-                                   struct stack_trace *trace);
+                                   struct stack_trace *trace,
+                                   const char *loglvl);
 
 /**
  * unwind_trap - Unwind through a system trap, that stored previous state
  */
 #ifdef CONFIG_MMU
 static inline void unwind_trap(struct task_struct *task, unsigned long pc,
-                               unsigned long fp, struct stack_trace *trace)
+                               unsigned long fp, struct stack_trace *trace,
+                               const char *loglvl)
 {
        /* To be implemented */
 }
 #else
 static inline void unwind_trap(struct task_struct *task, unsigned long pc,
-                               unsigned long fp, struct stack_trace *trace)
+                               unsigned long fp, struct stack_trace *trace,
+                               const char *loglvl)
 {
        const struct pt_regs *regs = (const struct pt_regs *) fp;
-       microblaze_unwind_inner(task, regs->pc, regs->r1, regs->r15, trace);
+       microblaze_unwind_inner(task, regs->pc, regs->r1, regs->r15, trace, loglvl);
 }
 #endif
 
  *                               the caller's return address.
  * @trace : Where to store stack backtrace (PC values).
  *         NULL == print backtrace to kernel log
+ * @loglvl : Used for printk log level if (trace == NULL).
  */
 static void microblaze_unwind_inner(struct task_struct *task,
                             unsigned long pc, unsigned long fp,
                             unsigned long leaf_return,
-                            struct stack_trace *trace)
+                            struct stack_trace *trace,
+                            const char *loglvl)
 {
        int ofs = 0;
 
                        const struct pt_regs *regs =
                                (const struct pt_regs *) fp;
 #endif
-                       pr_info("HW EXCEPTION\n");
+                       printk("%sHW EXCEPTION\n", loglvl);
 #ifndef CONFIG_MMU
                        microblaze_unwind_inner(task, regs->r17 - 4,
                                                fp + EX_HANDLER_STACK_SIZ,
-                                               regs->r15, trace);
+                                               regs->r15, trace, loglvl);
 #endif
                        return;
                }
                        if ((return_to >= handler->start_addr)
                            && (return_to <= handler->end_addr)) {
                                if (!trace)
-                                       pr_info("%s\n", handler->trap_name);
-                               unwind_trap(task, pc, fp, trace);
+                                       printk("%s%s\n", loglvl, handler->trap_name);
+                               unwind_trap(task, pc, fp, trace, loglvl);
                                return;
                        }
                }
                } else {
                        /* Have we reached userland? */
                        if (unlikely(pc == task_pt_regs(task)->pc)) {
-                               pr_info("[<%p>] PID %lu [%s]\n",
-                                       (void *) pc,
+                               printk("%s[<%p>] PID %lu [%s]\n",
+                                       loglvl, (void *) pc,
                                        (unsigned long) task->pid,
                                        task->comm);
                                break;
                        } else
-                               print_ip_sym(KERN_INFO, pc);
+                               print_ip_sym(loglvl, pc);
                }
 
                /* Stop when we reach anything not part of the kernel */
  */
 void microblaze_unwind(struct task_struct *task, struct stack_trace *trace)
 {
+       const char *loglvl = KERN_INFO;
+
        if (task) {
                if (task == current) {
                        const struct pt_regs *regs = task_pt_regs(task);
                        microblaze_unwind_inner(task, regs->pc, regs->r1,
-                                               regs->r15, trace);
+                                               regs->r15, trace, loglvl);
                } else {
                        struct thread_info *thread_info =
                                (struct thread_info *)(task->stack);
                        microblaze_unwind_inner(task,
                                                (unsigned long) &_switch_to,
                                                cpu_context->r1,
-                                               cpu_context->r15, trace);
+                                               cpu_context->r15,
+                                               trace, loglvl);
                }
        } else {
                unsigned long pc, fp;
                );
 
                /* Since we are not a leaf function, use leaf_return = 0 */
-               microblaze_unwind_inner(current, pc, fp, 0, trace);
+               microblaze_unwind_inner(current, pc, fp, 0, trace, loglvl);
        }
 }