1e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot/* 2e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * Port on Texas Instruments TMS320C6x architecture 3e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * 4e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * Copyright (C) 2004, 2006, 2009, 2010, 2011 Texas Instruments Incorporated 5e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) 6e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * 7e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * This program is free software; you can redistribute it and/or modify 8e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * it under the terms of the GNU General Public License version 2 as 9e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * published by the Free Software Foundation. 10e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot */ 11e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot#include <linux/module.h> 12e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot#include <linux/ptrace.h> 13e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot#include <linux/kallsyms.h> 14e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot#include <linux/bug.h> 15e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 16e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot#include <asm/soc.h> 176a846f3f821a252762897751fa0aeb68dda635f5David Howells#include <asm/special_insns.h> 18e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot#include <asm/traps.h> 19e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 20e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotint (*c6x_nmi_handler)(struct pt_regs *regs); 21e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 22e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotvoid __init trap_init(void) 23e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 24e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot ack_exception(EXCEPT_TYPE_NXF); 25e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot ack_exception(EXCEPT_TYPE_EXC); 26e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot ack_exception(EXCEPT_TYPE_IXF); 27e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot ack_exception(EXCEPT_TYPE_SXF); 28e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot enable_exception(); 29e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 30e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 31e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotvoid show_regs(struct pt_regs *regs) 32e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 33e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("\n"); 34a43cb95d547a061ed5bf1acb28e0f5fd575e26c1Tejun Heo show_regs_print_info(KERN_ERR); 35e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("PC: %08lx SP: %08lx\n", regs->pc, regs->sp); 36e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("Status: %08lx ORIG_A4: %08lx\n", regs->csr, regs->orig_a4); 37e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A0: %08lx B0: %08lx\n", regs->a0, regs->b0); 38e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A1: %08lx B1: %08lx\n", regs->a1, regs->b1); 39e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A2: %08lx B2: %08lx\n", regs->a2, regs->b2); 40e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A3: %08lx B3: %08lx\n", regs->a3, regs->b3); 41e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A4: %08lx B4: %08lx\n", regs->a4, regs->b4); 42e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A5: %08lx B5: %08lx\n", regs->a5, regs->b5); 43e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A6: %08lx B6: %08lx\n", regs->a6, regs->b6); 44e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A7: %08lx B7: %08lx\n", regs->a7, regs->b7); 45e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A8: %08lx B8: %08lx\n", regs->a8, regs->b8); 46e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A9: %08lx B9: %08lx\n", regs->a9, regs->b9); 47e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A10: %08lx B10: %08lx\n", regs->a10, regs->b10); 48e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A11: %08lx B11: %08lx\n", regs->a11, regs->b11); 49e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A12: %08lx B12: %08lx\n", regs->a12, regs->b12); 50e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A13: %08lx B13: %08lx\n", regs->a13, regs->b13); 51e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A14: %08lx B14: %08lx\n", regs->a14, regs->dp); 52e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A15: %08lx B15: %08lx\n", regs->a15, regs->sp); 53e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A16: %08lx B16: %08lx\n", regs->a16, regs->b16); 54e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A17: %08lx B17: %08lx\n", regs->a17, regs->b17); 55e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A18: %08lx B18: %08lx\n", regs->a18, regs->b18); 56e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A19: %08lx B19: %08lx\n", regs->a19, regs->b19); 57e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A20: %08lx B20: %08lx\n", regs->a20, regs->b20); 58e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A21: %08lx B21: %08lx\n", regs->a21, regs->b21); 59e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A22: %08lx B22: %08lx\n", regs->a22, regs->b22); 60e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A23: %08lx B23: %08lx\n", regs->a23, regs->b23); 61e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A24: %08lx B24: %08lx\n", regs->a24, regs->b24); 62e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A25: %08lx B25: %08lx\n", regs->a25, regs->b25); 63e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A26: %08lx B26: %08lx\n", regs->a26, regs->b26); 64e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A27: %08lx B27: %08lx\n", regs->a27, regs->b27); 65e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A28: %08lx B28: %08lx\n", regs->a28, regs->b28); 66e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A29: %08lx B29: %08lx\n", regs->a29, regs->b29); 67e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A30: %08lx B30: %08lx\n", regs->a30, regs->b30); 68e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("A31: %08lx B31: %08lx\n", regs->a31, regs->b31); 69e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 70e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 71e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotvoid die(char *str, struct pt_regs *fp, int nr) 72e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 73e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot console_verbose(); 74e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("%s: %08x\n", str, nr); 75e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot show_regs(fp); 76e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 77e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("Process %s (pid: %d, stackpage=%08lx)\n", 78e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot current->comm, current->pid, (PAGE_SIZE + 79e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot (unsigned long) current)); 80e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 81e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot dump_stack(); 82e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot while (1) 83e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot ; 84e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 85e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 86e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotstatic void die_if_kernel(char *str, struct pt_regs *fp, int nr) 87e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 88e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (user_mode(fp)) 89e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot return; 90e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 91e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot die(str, fp, nr); 92e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 93e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 94e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 95e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot/* Internal exceptions */ 96e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotstatic struct exception_info iexcept_table[10] = { 97e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - instruction fetch", SIGBUS, BUS_ADRERR }, 98e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - fetch packet", SIGBUS, BUS_ADRERR }, 99e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - execute packet", SIGILL, ILL_ILLOPC }, 100e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - undefined instruction", SIGILL, ILL_ILLOPC }, 101e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - resource conflict", SIGILL, ILL_ILLOPC }, 102e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - resource access", SIGILL, ILL_PRVREG }, 103e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - privilege", SIGILL, ILL_PRVOPC }, 104e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - loops buffer", SIGILL, ILL_ILLOPC }, 105e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - software exception", SIGILL, ILL_ILLTRP }, 106e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - unknown exception", SIGILL, ILL_ILLOPC } 107e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot}; 108e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 109e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot/* External exceptions */ 110e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotstatic struct exception_info eexcept_table[128] = { 111e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 112e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 113e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 114e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 115e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 116e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 117e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 118e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 119e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 120e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 121e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 122e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 123e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 124e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 125e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 126e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 127e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 128e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 129e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 130e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 131e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 132e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 133e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 134e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 135e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 136e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 137e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 138e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 139e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 140e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 141e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 142e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 143e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 144e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 145e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 146e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 147e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 148e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 149e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 150e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 151e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 152e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 153e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 154e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 155e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 156e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 157e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 158e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 159e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 160e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 161e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 162e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 163e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 164e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 165e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 166e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 167e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 168e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 169e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 170e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 171e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 172e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 173e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 174e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 175e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 176e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 177e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 178e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 179e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 180e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 181e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 182e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 183e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 184e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 185e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 186e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 187e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 188e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 189e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 190e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 191e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 192e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 193e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 194e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 195e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 196e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 197e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 198e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 199e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 200e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 201e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 202e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 203e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 204e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 205e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 206e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 207e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 208e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 209e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 210e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 211e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 212e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 213e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 214e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 215e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 216e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 217e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 218e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 219e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 220e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 221e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 222e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 223e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 224e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 225e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 226e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 227e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 228e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 229e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 230e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 231e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 232e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - external exception", SIGBUS, BUS_ADRERR }, 233e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - CPU memory protection fault", SIGSEGV, SEGV_ACCERR }, 234e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - CPU memory protection fault in L1P", SIGSEGV, SEGV_ACCERR }, 235e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - DMA memory protection fault in L1P", SIGSEGV, SEGV_ACCERR }, 236e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - CPU memory protection fault in L1D", SIGSEGV, SEGV_ACCERR }, 237e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - DMA memory protection fault in L1D", SIGSEGV, SEGV_ACCERR }, 238e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - CPU memory protection fault in L2", SIGSEGV, SEGV_ACCERR }, 239e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - DMA memory protection fault in L2", SIGSEGV, SEGV_ACCERR }, 240e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - EMC CPU memory protection fault", SIGSEGV, SEGV_ACCERR }, 241e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot { "Oops - EMC bus error", SIGBUS, BUS_ADRERR } 242e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot}; 243e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 244e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotstatic void do_trap(struct exception_info *except_info, struct pt_regs *regs) 245e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 246e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot unsigned long addr = instruction_pointer(regs); 247e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot siginfo_t info; 248e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 249e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (except_info->code != TRAP_BRKPT) 250e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("TRAP: %s PC[0x%lx] signo[%d] code[%d]\n", 251e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot except_info->kernel_str, regs->pc, 252e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot except_info->signo, except_info->code); 253e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 254e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot die_if_kernel(except_info->kernel_str, regs, addr); 255e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 256e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot info.si_signo = except_info->signo; 257e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot info.si_errno = 0; 258e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot info.si_code = except_info->code; 259e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot info.si_addr = (void __user *)addr; 260e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 261e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot force_sig_info(except_info->signo, &info, current); 262e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 263e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 264e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot/* 265e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * Process an internal exception (non maskable) 266e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot */ 267e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotstatic int process_iexcept(struct pt_regs *regs) 268e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 269e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot unsigned int iexcept_report = get_iexcept(); 270e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot unsigned int iexcept_num; 271e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 272e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot ack_exception(EXCEPT_TYPE_IXF); 273e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 274e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("IEXCEPT: PC[0x%lx]\n", regs->pc); 275e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 276e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot while (iexcept_report) { 277e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot iexcept_num = __ffs(iexcept_report); 278e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot iexcept_report &= ~(1 << iexcept_num); 279e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot set_iexcept(iexcept_report); 280e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (*(unsigned int *)regs->pc == BKPT_OPCODE) { 281e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot /* This is a breakpoint */ 282e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot struct exception_info bkpt_exception = { 283e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot "Oops - undefined instruction", 284e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot SIGTRAP, TRAP_BRKPT 285e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot }; 286e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot do_trap(&bkpt_exception, regs); 287e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot iexcept_report &= ~(0xFF); 288e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot set_iexcept(iexcept_report); 289e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot continue; 290e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot } 291e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 292e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot do_trap(&iexcept_table[iexcept_num], regs); 293e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot } 294e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot return 0; 295e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 296e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 297e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot/* 298e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * Process an external exception (maskable) 299e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot */ 300e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotstatic void process_eexcept(struct pt_regs *regs) 301e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 302e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot int evt; 303e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 304e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_err("EEXCEPT: PC[0x%lx]\n", regs->pc); 305e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 306e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot while ((evt = soc_get_exception()) >= 0) 307e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot do_trap(&eexcept_table[evt], regs); 308e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 309e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot ack_exception(EXCEPT_TYPE_EXC); 310e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 311e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 312e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot/* 313e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * Main exception processing 314e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot */ 315e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotasmlinkage int process_exception(struct pt_regs *regs) 316e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 317e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot unsigned int type; 318e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot unsigned int type_num; 319e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot unsigned int ie_num = 9; /* default is unknown exception */ 320e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 321e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot while ((type = get_except_type()) != 0) { 322e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot type_num = fls(type) - 1; 323e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 324e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot switch (type_num) { 325e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot case EXCEPT_TYPE_NXF: 326e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot ack_exception(EXCEPT_TYPE_NXF); 327e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (c6x_nmi_handler) 328e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot (c6x_nmi_handler)(regs); 329e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot else 330e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_alert("NMI interrupt!\n"); 331e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot break; 332e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 333e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot case EXCEPT_TYPE_IXF: 334e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (process_iexcept(regs)) 335e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot return 1; 336e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot break; 337e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 338e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot case EXCEPT_TYPE_EXC: 339e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot process_eexcept(regs); 340e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot break; 341e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 342e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot case EXCEPT_TYPE_SXF: 343e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot ie_num = 8; 344e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot default: 345e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot ack_exception(type_num); 346e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot do_trap(&iexcept_table[ie_num], regs); 347e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot break; 348e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot } 349e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot } 350e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot return 0; 351e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 352e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 353e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotstatic int kstack_depth_to_print = 48; 354e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 355e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotstatic void show_trace(unsigned long *stack, unsigned long *endstack) 356e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 357e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot unsigned long addr; 358e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot int i; 359e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 360e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_debug("Call trace:"); 361e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot i = 0; 362e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot while (stack + 1 <= endstack) { 363e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot addr = *stack++; 364e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot /* 365e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * If the address is either in the text segment of the 366e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * kernel, or in the region which contains vmalloc'ed 367e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * memory, it *may* be the address of a calling 368e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * routine; if so, print it so that someone tracing 369e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * down the cause of the crash will be able to figure 370e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot * out the call path that was taken. 371e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot */ 372e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (__kernel_text_address(addr)) { 373e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot#ifndef CONFIG_KALLSYMS 374e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (i % 5 == 0) 375e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_debug("\n "); 376e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot#endif 377e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_debug(" [<%08lx>]", addr); 378e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot print_symbol(" %s\n", addr); 379e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot i++; 380e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot } 381e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot } 382e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_debug("\n"); 383e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 384e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 385e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotvoid show_stack(struct task_struct *task, unsigned long *stack) 386e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 387e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot unsigned long *p, *endstack; 388e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot int i; 389e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 390e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (!stack) { 391e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (task && task != current) 392e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot /* We know this is a kernel stack, 393e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot so this is the start/end */ 394e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot stack = (unsigned long *)thread_saved_ksp(task); 395e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot else 396e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot stack = (unsigned long *)&stack; 397e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot } 398e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot endstack = (unsigned long *)(((unsigned long)stack + THREAD_SIZE - 1) 399e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot & -THREAD_SIZE); 400e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 401e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_debug("Stack from %08lx:", (unsigned long)stack); 402e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot for (i = 0, p = stack; i < kstack_depth_to_print; i++) { 403e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (p + 1 > endstack) 404e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot break; 405e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot if (i % 8 == 0) 406e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_cont("\n "); 407e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_cont(" %08lx", *p++); 408e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot } 409e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot pr_cont("\n"); 410e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot show_trace(stack, endstack); 411e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 412e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot 413e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiotint is_valid_bugaddr(unsigned long addr) 414e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot{ 415e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot return __kernel_text_address(addr); 416e94e668251ab31b17ef6dcd16ba7fe05ffc1917aAurelien Jacquiot} 417