traps.c revision 9ba3c24f10c948dadac2ca91ed714dfbcedd61ca
11394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* 21394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * File: arch/blackfin/kernel/traps.c 31394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * Based on: 41394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * Author: Hamish Macdonald 51394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * 61394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * Created: 71394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * Description: uses S/W interrupt 15 for the system calls 81394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * 91394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * Modified: 101394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * Copyright 2004-2006 Analog Devices Inc. 111394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * 121394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * Bugs: Enter bugs at http://blackfin.uclinux.org/ 131394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * 141394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * This program is free software; you can redistribute it and/or modify 151394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * it under the terms of the GNU General Public License as published by 161394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * the Free Software Foundation; either version 2 of the License, or 171394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * (at your option) any later version. 181394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * 191394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * This program is distributed in the hope that it will be useful, 201394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * but WITHOUT ANY WARRANTY; without even the implied warranty of 211394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 221394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * GNU General Public License for more details. 231394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * 241394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * You should have received a copy of the GNU General Public License 251394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * along with this program; if not, see the file COPYING, or write 261394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * to the Free Software Foundation, Inc., 271394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 281394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu */ 291394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 301f83b8f148a1eb967d2a628cbb741cd56fb54572Mike Frysinger#include <linux/uaccess.h> 311f83b8f148a1eb967d2a628cbb741cd56fb54572Mike Frysinger#include <linux/interrupt.h> 321f83b8f148a1eb967d2a628cbb741cd56fb54572Mike Frysinger#include <linux/module.h> 331f83b8f148a1eb967d2a628cbb741cd56fb54572Mike Frysinger#include <linux/kallsyms.h> 34d31c5ab147e0b17b9ec0daa5e4d1fc0bd6b19974Bryan Wu#include <linux/fs.h> 358feae13110d60cc6287afabc2887366b0eb226c2David Howells#include <linux/rbtree.h> 361394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#include <asm/traps.h> 371394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#include <asm/cacheflush.h> 38f4585a08479a730fb809606b8ee327a5398c117cMike Frysinger#include <asm/cplb.h> 391394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#include <asm/blackfin.h> 401394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#include <asm/irq_handler.h> 41d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz#include <linux/irq.h> 42669b792c77bbc30e9f4d9c95dbc918dc348c49c2Robin Getz#include <asm/trace.h> 43226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz#include <asm/fixed_code.h> 441394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 451394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#ifdef CONFIG_KGDB 461394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu# include <linux/kgdb.h> 47226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 48226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz# define CHK_DEBUGGER_TRAP() \ 49226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz do { \ 50a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang kgdb_handle_exception(trapnr, sig, info.si_code, fp); \ 51226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz } while (0) 52226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz# define CHK_DEBUGGER_TRAP_MAYBE() \ 53226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz do { \ 54226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz if (kgdb_connected) \ 55226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz CHK_DEBUGGER_TRAP(); \ 56226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz } while (0) 57226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz#else 58226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz# define CHK_DEBUGGER_TRAP() do { } while (0) 59226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz# define CHK_DEBUGGER_TRAP_MAYBE() do { } while (0) 601394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif 611394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 629f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz 634ee1c45337e7b529eed644c6f62399d797dcbc10Robin Getz#ifdef CONFIG_DEBUG_VERBOSE 649f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#define verbose_printk(fmt, arg...) \ 659f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz printk(fmt, ##arg) 669f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#else 679f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#define verbose_printk(fmt, arg...) \ 689f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz ({ if (0) printk(fmt, ##arg); 0; }) 699f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#endif 709f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz 711394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* Initiate the event table handler */ 721394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wuvoid __init trap_init(void) 731394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu{ 741394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu CSYNC(); 751394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu bfin_write_EVT3(trap); 761394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu CSYNC(); 771394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu} 781394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 79226eb1ef523a33c66193bc319a92c647e47311d4Robin Getzstatic void decode_address(char *buf, unsigned long address) 801394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu{ 819f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#ifdef CONFIG_DEBUG_VERBOSE 821394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu struct vm_list_struct *vml; 831394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu struct task_struct *p; 841394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu struct mm_struct *mm; 85885be03b069131d242506f0f717d38659b2bdb6cRobin Getz unsigned long flags, offset; 86904656cda10ce985e6bc8b16488b58236eaec8e2Robin Getz unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic(); 878feae13110d60cc6287afabc2887366b0eb226c2David Howells struct rb_node *n; 881394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 891394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#ifdef CONFIG_KALLSYMS 908a0e6656030ffe9bcb81b725e956917bafc7522dMike Frysinger unsigned long symsize; 911394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu const char *symname; 921394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu char *modname; 931394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu char *delim = ":"; 941394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu char namebuf[128]; 951394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 961394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* look up the address and see if we are in kernel space */ 971394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu symname = kallsyms_lookup(address, &symsize, &offset, &modname, namebuf); 981394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 991394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu if (symname) { 1001394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* yeah! kernel space! */ 1011394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu if (!modname) 1021394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu modname = delim = ""; 103226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz sprintf(buf, "<0x%p> { %s%s%s%s + 0x%lx }", 1041f83b8f148a1eb967d2a628cbb741cd56fb54572Mike Frysinger (void *)address, delim, modname, delim, symname, 1051394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu (unsigned long)offset); 106885be03b069131d242506f0f717d38659b2bdb6cRobin Getz return; 1071394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1081394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 1091394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif 1101394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 111226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz /* Problem in fixed code section? */ 112226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz if (address >= FIXED_CODE_START && address < FIXED_CODE_END) { 113226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz sprintf(buf, "<0x%p> /* Maybe fixed code section */", (void *)address); 114226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz return; 115226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz } 116226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 117226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz /* Problem somewhere before the kernel start address */ 118226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz if (address < CONFIG_BOOT_LOAD) { 119226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz sprintf(buf, "<0x%p> /* Maybe null pointer? */", (void *)address); 120226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz return; 121226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz } 122226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 1231394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* looks like we're off in user-land, so let's walk all the 1241394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * mappings of all our processes and see if we can't be a whee 1251394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * bit more specific 1261394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu */ 127885be03b069131d242506f0f717d38659b2bdb6cRobin Getz write_lock_irqsave(&tasklist_lock, flags); 1281394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu for_each_process(p) { 129904656cda10ce985e6bc8b16488b58236eaec8e2Robin Getz mm = (in_atomic ? p->mm : get_task_mm(p)); 1301394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu if (!mm) 1311394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu continue; 1321394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1338feae13110d60cc6287afabc2887366b0eb226c2David Howells for (n = rb_first(&mm->mm_rb); n; n = rb_next(n)) { 1348feae13110d60cc6287afabc2887366b0eb226c2David Howells struct vm_area_struct *vma; 1358feae13110d60cc6287afabc2887366b0eb226c2David Howells 1368feae13110d60cc6287afabc2887366b0eb226c2David Howells vma = rb_entry(n, struct vm_area_struct, vm_rb); 1371394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1381394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu if (address >= vma->vm_start && address < vma->vm_end) { 139cf28b4863f9ee8f122e8ff3ac0d403e07ba9c6d9Jan Blunck char _tmpbuf[256]; 1401394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu char *name = p->comm; 1411394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu struct file *file = vma->vm_file; 142cf28b4863f9ee8f122e8ff3ac0d403e07ba9c6d9Jan Blunck 1436a0bfff44e4aa4ee1721b3daa004d2039576c70dTim Pepper if (file) { 1446a0bfff44e4aa4ee1721b3daa004d2039576c70dTim Pepper char *d_name = d_path(&file->f_path, _tmpbuf, 145cf28b4863f9ee8f122e8ff3ac0d403e07ba9c6d9Jan Blunck sizeof(_tmpbuf)); 1466a0bfff44e4aa4ee1721b3daa004d2039576c70dTim Pepper if (!IS_ERR(d_name)) 1476a0bfff44e4aa4ee1721b3daa004d2039576c70dTim Pepper name = d_name; 1486a0bfff44e4aa4ee1721b3daa004d2039576c70dTim Pepper } 1491394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1508a0e6656030ffe9bcb81b725e956917bafc7522dMike Frysinger /* FLAT does not have its text aligned to the start of 1518a0e6656030ffe9bcb81b725e956917bafc7522dMike Frysinger * the map while FDPIC ELF does ... 1528a0e6656030ffe9bcb81b725e956917bafc7522dMike Frysinger */ 1537f1c906808a36630990d83d872935c079b76595bRobin Getz 1547f1c906808a36630990d83d872935c079b76595bRobin Getz /* before we can check flat/fdpic, we need to 1557f1c906808a36630990d83d872935c079b76595bRobin Getz * make sure current is valid 1567f1c906808a36630990d83d872935c079b76595bRobin Getz */ 1577f1c906808a36630990d83d872935c079b76595bRobin Getz if ((unsigned long)current >= FIXED_CODE_START && 1587f1c906808a36630990d83d872935c079b76595bRobin Getz !((unsigned long)current & 0x3)) { 1597f1c906808a36630990d83d872935c079b76595bRobin Getz if (current->mm && 1607f1c906808a36630990d83d872935c079b76595bRobin Getz (address > current->mm->start_code) && 1617f1c906808a36630990d83d872935c079b76595bRobin Getz (address < current->mm->end_code)) 1627f1c906808a36630990d83d872935c079b76595bRobin Getz offset = address - current->mm->start_code; 1637f1c906808a36630990d83d872935c079b76595bRobin Getz else 1647f1c906808a36630990d83d872935c079b76595bRobin Getz offset = (address - vma->vm_start) + 1657f1c906808a36630990d83d872935c079b76595bRobin Getz (vma->vm_pgoff << PAGE_SHIFT); 1667f1c906808a36630990d83d872935c079b76595bRobin Getz 1677f1c906808a36630990d83d872935c079b76595bRobin Getz sprintf(buf, "<0x%p> [ %s + 0x%lx ]", 1687f1c906808a36630990d83d872935c079b76595bRobin Getz (void *)address, name, offset); 1697f1c906808a36630990d83d872935c079b76595bRobin Getz } else 1707f1c906808a36630990d83d872935c079b76595bRobin Getz sprintf(buf, "<0x%p> [ %s vma:0x%lx-0x%lx]", 1717f1c906808a36630990d83d872935c079b76595bRobin Getz (void *)address, name, 1727f1c906808a36630990d83d872935c079b76595bRobin Getz vma->vm_start, vma->vm_end); 1737f1c906808a36630990d83d872935c079b76595bRobin Getz 174904656cda10ce985e6bc8b16488b58236eaec8e2Robin Getz if (!in_atomic) 175885be03b069131d242506f0f717d38659b2bdb6cRobin Getz mmput(mm); 1767f1c906808a36630990d83d872935c079b76595bRobin Getz 177f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (!strlen(buf)) 178f09630bff51daaf427968c61c0f2370c64148e06Robin Getz sprintf(buf, "<0x%p> [ %s ] dynamic memory", (void *)address, name); 179f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 180885be03b069131d242506f0f717d38659b2bdb6cRobin Getz goto done; 1811394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 1821394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 183904656cda10ce985e6bc8b16488b58236eaec8e2Robin Getz if (!in_atomic) 184885be03b069131d242506f0f717d38659b2bdb6cRobin Getz mmput(mm); 1851394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 1861394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1871394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* we were unable to find this address anywhere */ 188f09630bff51daaf427968c61c0f2370c64148e06Robin Getz sprintf(buf, "<0x%p> /* kernel dynamic memory */", (void *)address); 189885be03b069131d242506f0f717d38659b2bdb6cRobin Getz 190885be03b069131d242506f0f717d38659b2bdb6cRobin Getzdone: 191885be03b069131d242506f0f717d38659b2bdb6cRobin Getz write_unlock_irqrestore(&tasklist_lock, flags); 1929f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#else 1939f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz sprintf(buf, " "); 1949f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#endif 1951394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu} 1961394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1972ebcade590dcf822dcdadcc4f8f68efd3ff2e217Robin Getzasmlinkage void double_fault_c(struct pt_regs *fp) 1982ebcade590dcf822dcdadcc4f8f68efd3ff2e217Robin Getz{ 199a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON 200a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz int j; 201a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz trace_buffer_save(j); 202a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz#endif 203a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz 204226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz console_verbose(); 205226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz oops_in_progress = 1; 2069f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#ifdef CONFIG_DEBUG_VERBOSE 2072ebcade590dcf822dcdadcc4f8f68efd3ff2e217Robin Getz printk(KERN_EMERG "\n" KERN_EMERG "Double Fault\n"); 2080c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz#ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT 2090c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz if (((long)fp->seqstat & SEQSTAT_EXCAUSE) == VEC_UNCOV) { 2108f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang unsigned int cpu = smp_processor_id(); 2110c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz char buf[150]; 2128f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang decode_address(buf, cpu_pda[cpu].retx); 2130c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz printk(KERN_EMERG "While handling exception (EXCAUSE = 0x%x) at %s:\n", 2148f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang (unsigned int)cpu_pda[cpu].seqstat & SEQSTAT_EXCAUSE, buf); 2158f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang decode_address(buf, cpu_pda[cpu].dcplb_fault_addr); 2160c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz printk(KERN_NOTICE " DCPLB_FAULT_ADDR: %s\n", buf); 2178f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang decode_address(buf, cpu_pda[cpu].icplb_fault_addr); 2180c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz printk(KERN_NOTICE " ICPLB_FAULT_ADDR: %s\n", buf); 2190c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz 2200c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz decode_address(buf, fp->retx); 2218f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang printk(KERN_NOTICE "The instruction at %s caused a double exception\n", buf); 2220c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz } else 2230c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz#endif 2240c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz { 2250c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz dump_bfin_process(fp); 2260c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz dump_bfin_mem(fp); 2270c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz show_regs(fp); 228a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz dump_bfin_trace_buffer(); 2290c7a6b2135c1bcb5139ca9ca87f292caafcb9410Robin Getz } 2309f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#endif 231d8804adf52f5991388fa9af77428e4cc7768059dMike Frysinger panic("Double Fault - unrecoverable event"); 2322ebcade590dcf822dcdadcc4f8f68efd3ff2e217Robin Getz 2332ebcade590dcf822dcdadcc4f8f68efd3ff2e217Robin Getz} 2342ebcade590dcf822dcdadcc4f8f68efd3ff2e217Robin Getz 2351394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wuasmlinkage void trap_c(struct pt_regs *fp) 2361394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu{ 237518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON 238518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz int j; 239518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#endif 2408f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO 2418f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang unsigned int cpu = smp_processor_id(); 2428f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang#endif 243518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz int sig = 0; 2441394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu siginfo_t info; 2451394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE; 2461394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 247226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz trace_buffer_save(j); 248226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 249226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz /* Important - be very careful dereferncing pointers - will lead to 250226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz * double faults if the stack has become corrupt 251226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz */ 252226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 253226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz /* If the fault was caused by a kernel thread, or interrupt handler 254226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz * we will kernel panic, so the system reboots. 255226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz * If KGDB is enabled, don't set this for kernel breakpoints 256226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz */ 257b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz 258b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz /* TODO: check to see if we are in some sort of deferred HWERR 259b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz * that we should be able to recover from, not kernel panic 260b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz */ 2616b5eace2f15b53d5a6849078d22e78db77625929Robin Getz if ((bfin_read_IPEND() & 0xFFC0) && (trapnr != VEC_STEP) 2621394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#ifdef CONFIG_KGDB 2636b5eace2f15b53d5a6849078d22e78db77625929Robin Getz && (trapnr != VEC_EXCPT02) 2641394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif 265226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz ){ 266226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz console_verbose(); 267226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz oops_in_progress = 1; 268226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz } else if (current) { 269226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz if (current->mm == NULL) { 270226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz console_verbose(); 271226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz oops_in_progress = 1; 272226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz } 273226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz } 2741394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 2751394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* trap_c() will be called for exceptions. During exceptions 2761394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * processing, the pc value should be set with retx value. 2771394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * With this change we can cleanup some code in signal.c- TODO 2781394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu */ 2791394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu fp->orig_pc = fp->retx; 2801394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* printk("exception: 0x%x, ipend=%x, reti=%x, retx=%x\n", 2811394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu trapnr, fp->ipend, fp->pc, fp->retx); */ 2821394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 2831394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* send the appropriate signal to the user program */ 2841394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu switch (trapnr) { 2851394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 2861394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* This table works in conjuction with the one in ./mach-common/entry.S 2871394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * Some exceptions are handled there (in assembly, in exception space) 2881394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * Some are handled here, (in C, in interrupt space) 2891394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * Some, like CPLB, are handled in both, where the normal path is 2901394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * handled in assembly/exception space, and the error path is handled 2911394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * here 2921394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu */ 2931394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 2941394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x00 - Linux Syscall, getting here is an error */ 2951394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x01 - userspace gdb breakpoint, handled here */ 2961394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_EXCPT01: 2971394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = TRAP_ILLTRAP; 2981394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGTRAP; 2991394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu CHK_DEBUGGER_TRAP_MAYBE(); 3001394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* Check if this is a breakpoint in kernel space */ 3011394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu if (fp->ipend & 0xffc0) 3021394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu return; 3031394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu else 3041394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 3059401e618c8f70920f34893946239e24d40a3519aMike Frysinger /* 0x03 - User Defined, userspace stack overflow */ 3061394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_EXCPT03: 3071394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = SEGV_STACKFLOW; 3081394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGSEGV; 3099f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x03(KERN_NOTICE)); 310a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 3111394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 31227707d3e43e3a9c53e75cd7769f3ef74b1d56625Sonic Zhang /* 0x02 - KGDB initial connection and break signal trap */ 31327707d3e43e3a9c53e75cd7769f3ef74b1d56625Sonic Zhang case VEC_EXCPT02: 31427707d3e43e3a9c53e75cd7769f3ef74b1d56625Sonic Zhang#ifdef CONFIG_KGDB 31527707d3e43e3a9c53e75cd7769f3ef74b1d56625Sonic Zhang info.si_code = TRAP_ILLTRAP; 31627707d3e43e3a9c53e75cd7769f3ef74b1d56625Sonic Zhang sig = SIGTRAP; 31727707d3e43e3a9c53e75cd7769f3ef74b1d56625Sonic Zhang CHK_DEBUGGER_TRAP(); 31827707d3e43e3a9c53e75cd7769f3ef74b1d56625Sonic Zhang return; 31927707d3e43e3a9c53e75cd7769f3ef74b1d56625Sonic Zhang#endif 3205c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x04 - User Defined */ 3215c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x05 - User Defined */ 3225c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x06 - User Defined */ 3235c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x07 - User Defined */ 3245c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x08 - User Defined */ 3255c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x09 - User Defined */ 3265c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x0A - User Defined */ 3275c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x0B - User Defined */ 3285c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x0C - User Defined */ 3295c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x0D - User Defined */ 3305c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x0E - User Defined */ 3315c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 0x0F - User Defined */ 33227707d3e43e3a9c53e75cd7769f3ef74b1d56625Sonic Zhang /* If we got here, it is most likely that someone was trying to use a 3335c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz * custom exception handler, and it is not actually installed properly 3345c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz */ 3355c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz case VEC_EXCPT04 ... VEC_EXCPT15: 3365c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz info.si_code = ILL_ILLPARAOP; 3375c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz sig = SIGILL; 3389f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x04(KERN_NOTICE)); 3395c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz CHK_DEBUGGER_TRAP_MAYBE(); 3405c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz break; 3411394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x10 HW Single step, handled here */ 3421394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_STEP: 3431394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = TRAP_STEP; 3441394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGTRAP; 3451394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu CHK_DEBUGGER_TRAP_MAYBE(); 3461394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* Check if this is a single step in kernel space */ 3471394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu if (fp->ipend & 0xffc0) 3481394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu return; 3491394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu else 3501394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 3511394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x11 - Trace Buffer Full, handled here */ 3521394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_OVFLOW: 3531394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = TRAP_TRACEFLOW; 3541394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGTRAP; 3559f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x11(KERN_NOTICE)); 356a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 3571394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 3581394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x12 - Reserved, Caught by default */ 3591394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x13 - Reserved, Caught by default */ 3601394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x14 - Reserved, Caught by default */ 3611394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x15 - Reserved, Caught by default */ 3621394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x16 - Reserved, Caught by default */ 3631394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x17 - Reserved, Caught by default */ 3641394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x18 - Reserved, Caught by default */ 3651394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x19 - Reserved, Caught by default */ 3661394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x1A - Reserved, Caught by default */ 3671394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x1B - Reserved, Caught by default */ 3681394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x1C - Reserved, Caught by default */ 3691394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x1D - Reserved, Caught by default */ 3701394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x1E - Reserved, Caught by default */ 3711394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x1F - Reserved, Caught by default */ 3721394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x20 - Reserved, Caught by default */ 3731394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x21 - Undefined Instruction, handled here */ 3741394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_UNDEF_I: 3751394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = ILL_ILLOPC; 3761394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGILL; 3779f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x21(KERN_NOTICE)); 378a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 3791394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 3801394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x22 - Illegal Instruction Combination, handled here */ 3811394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_ILGAL_I: 3821394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = ILL_ILLPARAOP; 3831394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGILL; 3849f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x22(KERN_NOTICE)); 385a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 3861394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 387f26fbc48f130962fce15f37d079968f0f272e0c2Robin Getz /* 0x23 - Data CPLB protection violation, handled here */ 3881394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_CPLB_VL: 3891394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = ILL_CPLB_VI; 390f26fbc48f130962fce15f37d079968f0f272e0c2Robin Getz sig = SIGBUS; 3919f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x23(KERN_NOTICE)); 392a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 3931394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 3941394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x24 - Data access misaligned, handled here */ 3951394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_MISALI_D: 3961394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = BUS_ADRALN; 3971394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGBUS; 3989f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x24(KERN_NOTICE)); 399a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 4001394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 4011394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x25 - Unrecoverable Event, handled here */ 4021394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_UNCOV: 4031394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = ILL_ILLEXCPT; 4041394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGILL; 4059f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x25(KERN_NOTICE)); 406a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 4071394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 4081394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x26 - Data CPLB Miss, normal case is handled in _cplb_hdr, 4091394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu error case is handled here */ 4101394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_CPLB_M: 4111394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = BUS_ADRALN; 4121394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGBUS; 4139f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x26(KERN_NOTICE)); 4141394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 4151394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x27 - Data CPLB Multiple Hits - Linux Trap Zero, handled here */ 4161394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_CPLB_MHIT: 4171394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = ILL_CPLB_MULHIT; 4181394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGSEGV; 419c6c6f75d54ca734c409e336245662934c21fcee0Mike Frysinger#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO 4208f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang if (cpu_pda[cpu].dcplb_fault_addr < FIXED_CODE_START) 4219f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "NULL pointer access\n"); 422c6c6f75d54ca734c409e336245662934c21fcee0Mike Frysinger else 4231394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif 4249f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x27(KERN_NOTICE)); 425a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 4261394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 4271394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x28 - Emulation Watchpoint, handled here */ 4281394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_WATCH: 4291394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = TRAP_WATCHPT; 4301394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGTRAP; 431569a50ca3f56cd69199733580e7ca0e81029473aRobin Getz pr_debug(EXC_0x28(KERN_DEBUG)); 4321394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu CHK_DEBUGGER_TRAP_MAYBE(); 4331394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* Check if this is a watchpoint in kernel space */ 4341394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu if (fp->ipend & 0xffc0) 4351394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu return; 4361394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu else 4371394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 4381394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#ifdef CONFIG_BF535 4391394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x29 - Instruction fetch access error (535 only) */ 4401394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_ISTRU_VL: /* ADSP-BF535 only (MH) */ 4411394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = BUS_OPFETCH; 4421394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGBUS; 4439f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "BF535: VEC_ISTRU_VL\n"); 444a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 4451394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 4461394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#else 4471394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x29 - Reserved, Caught by default */ 4481394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif 4491394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x2A - Instruction fetch misaligned, handled here */ 4501394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_MISALI_I: 4511394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = BUS_ADRALN; 4521394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGBUS; 4539f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x2A(KERN_NOTICE)); 454a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 4551394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 456f26fbc48f130962fce15f37d079968f0f272e0c2Robin Getz /* 0x2B - Instruction CPLB protection violation, handled here */ 4571394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_CPLB_I_VL: 4581394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = ILL_CPLB_VI; 459f26fbc48f130962fce15f37d079968f0f272e0c2Robin Getz sig = SIGBUS; 4609f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x2B(KERN_NOTICE)); 461a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 4621394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 4631394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x2C - Instruction CPLB miss, handled in _cplb_hdr */ 4641394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_CPLB_I_M: 4651394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = ILL_CPLB_MISS; 4661394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGBUS; 4679f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x2C(KERN_NOTICE)); 4681394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 4691394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x2D - Instruction CPLB Multiple Hits, handled here */ 4701394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_CPLB_I_MHIT: 4711394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = ILL_CPLB_MULHIT; 4721394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGSEGV; 473c6c6f75d54ca734c409e336245662934c21fcee0Mike Frysinger#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO 4748f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang if (cpu_pda[cpu].icplb_fault_addr < FIXED_CODE_START) 4759f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "Jump to NULL address\n"); 476c6c6f75d54ca734c409e336245662934c21fcee0Mike Frysinger else 4771394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif 4789f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x2D(KERN_NOTICE)); 479a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 4801394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 4811394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x2E - Illegal use of Supervisor Resource, handled here */ 4821394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case VEC_ILL_RES: 4831394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu info.si_code = ILL_PRVOPC; 4841394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu sig = SIGILL; 4859f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE EXC_0x2E(KERN_NOTICE)); 486a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 4871394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 4881394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x2F - Reserved, Caught by default */ 4891394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x30 - Reserved, Caught by default */ 4901394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x31 - Reserved, Caught by default */ 4911394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x32 - Reserved, Caught by default */ 4921394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x33 - Reserved, Caught by default */ 4931394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x34 - Reserved, Caught by default */ 4941394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x35 - Reserved, Caught by default */ 4951394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x36 - Reserved, Caught by default */ 4961394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x37 - Reserved, Caught by default */ 4971394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x38 - Reserved, Caught by default */ 4981394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x39 - Reserved, Caught by default */ 4991394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x3A - Reserved, Caught by default */ 5001394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x3B - Reserved, Caught by default */ 5011394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x3C - Reserved, Caught by default */ 5021394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x3D - Reserved, Caught by default */ 5031394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x3E - Reserved, Caught by default */ 5041394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu /* 0x3F - Reserved, Caught by default */ 50513fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz case VEC_HWERR: 50613fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz info.si_code = BUS_ADRALN; 50713fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz sig = SIGBUS; 50813fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz switch (fp->seqstat & SEQSTAT_HWERRCAUSE) { 50913fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz /* System MMR Error */ 51013fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz case (SEQSTAT_HWERRCAUSE_SYSTEM_MMR): 51113fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz info.si_code = BUS_ADRALN; 51213fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz sig = SIGBUS; 5139f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE HWC_x2(KERN_NOTICE)); 51413fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz break; 51513fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz /* External Memory Addressing Error */ 51613fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz case (SEQSTAT_HWERRCAUSE_EXTERN_ADDR): 51713fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz info.si_code = BUS_ADRERR; 51813fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz sig = SIGBUS; 5199f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE HWC_x3(KERN_NOTICE)); 52013fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz break; 52113fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz /* Performance Monitor Overflow */ 52213fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz case (SEQSTAT_HWERRCAUSE_PERF_FLOW): 5239f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE HWC_x12(KERN_NOTICE)); 52413fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz break; 52513fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz /* RAISE 5 instruction */ 52613fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz case (SEQSTAT_HWERRCAUSE_RAISE_5): 52713fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz printk(KERN_NOTICE HWC_x18(KERN_NOTICE)); 52813fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz break; 52913fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz default: /* Reserved */ 53013fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz printk(KERN_NOTICE HWC_default(KERN_NOTICE)); 53113fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz break; 53213fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz } 533a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 53413fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz break; 5355c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz /* 5365c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz * We should be handling all known exception types above, 5375c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz * if we get here we hit a reserved one, so panic 5385c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz */ 5391394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu default: 5405c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz oops_in_progress = 1; 5415c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz info.si_code = ILL_ILLPARAOP; 5425c64e0d5109532f8184be29c1dc163059e3ded4bRobin Getz sig = SIGILL; 5439f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_EMERG "Caught Unhandled Exception, code = %08lx\n", 5441394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu (fp->seqstat & SEQSTAT_EXCAUSE)); 545a5ac0129249611fc4a35e6d7cd9b8462d67e5798Sonic Zhang CHK_DEBUGGER_TRAP_MAYBE(); 5461394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 5471394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 5481394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 549226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz BUG_ON(sig == 0); 550226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 551226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz if (sig != SIGTRAP) { 55249dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger dump_bfin_process(fp); 553b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz dump_bfin_mem(fp); 55449dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger show_regs(fp); 555226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 556226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz /* Print out the trace buffer if it makes sense */ 557226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz#ifndef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE 558226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz if (trapnr == VEC_CPLB_I_M || trapnr == VEC_CPLB_M) 5599f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "No trace since you do not have " 560226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz "CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE enabled\n" 561226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz KERN_NOTICE "\n"); 562226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz else 563226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz#endif 564226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz dump_bfin_trace_buffer(); 565f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 566226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz if (oops_in_progress) { 567f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* Dump the current kernel stack */ 5689f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "Kernel Stack\n"); 569f09630bff51daaf427968c61c0f2370c64148e06Robin Getz show_stack(current, NULL); 570aee3a29240ad167ad7875d859506d8bb90431c70Robin Getz print_modules(); 571226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz#ifndef CONFIG_ACCESS_CHECK 5729f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_EMERG "Please turn on " 57390c7f4686f82aef875aadf8e5c9c1a9465e5143bRobin Getz "CONFIG_ACCESS_CHECK\n"); 574226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz#endif 5751394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu panic("Kernel exception"); 576f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } else { 5774ee1c45337e7b529eed644c6f62399d797dcbc10Robin Getz#ifdef CONFIG_DEBUG_VERBOSE 5789f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz unsigned long *stack; 579f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* Dump the user space stack */ 580f09630bff51daaf427968c61c0f2370c64148e06Robin Getz stack = (unsigned long *)rdusp(); 5819f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "Userspace Stack\n"); 582f09630bff51daaf427968c61c0f2370c64148e06Robin Getz show_stack(NULL, stack); 5839f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#endif 584226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz } 5851394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 586fb322915a05804a3a153f714f2f08e4c32ce84c7Robin Getz 5876a01f230339321292cf065551f8cf55361052461Yi Li#ifdef CONFIG_IPIPE 5886a01f230339321292cf065551f8cf55361052461Yi Li if (!ipipe_trap_notify(fp->seqstat & 0x3f, fp)) 5896a01f230339321292cf065551f8cf55361052461Yi Li#endif 5906a01f230339321292cf065551f8cf55361052461Yi Li { 5916a01f230339321292cf065551f8cf55361052461Yi Li info.si_signo = sig; 5926a01f230339321292cf065551f8cf55361052461Yi Li info.si_errno = 0; 5936a01f230339321292cf065551f8cf55361052461Yi Li info.si_addr = (void __user *)fp->pc; 5946a01f230339321292cf065551f8cf55361052461Yi Li force_sig_info(sig, &info, current); 5956a01f230339321292cf065551f8cf55361052461Yi Li } 5961394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 5970acad8dfee6bde7e246a95a52f864a8eee777ed8Robin Getz if (ANOMALY_05000461 && trapnr == VEC_HWERR && !access_ok(VERIFY_READ, fp->pc, 8)) 5980acad8dfee6bde7e246a95a52f864a8eee777ed8Robin Getz fp->pc = SAFE_USER_INSTRUCTION; 5990acad8dfee6bde7e246a95a52f864a8eee777ed8Robin Getz 6001394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu trace_buffer_restore(j); 6011394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu return; 6021394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu} 6031394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 6041394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* Typical exception handling routines */ 6051394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 606518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#define EXPAND_LEN ((1 << CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN) * 256 - 1) 607518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz 608f09630bff51daaf427968c61c0f2370c64148e06Robin Getz/* 609f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * Similar to get_user, do some address checking, then dereference 610f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * Return true on sucess, false on bad address 611f09630bff51daaf427968c61c0f2370c64148e06Robin Getz */ 6129f06c38fb230720371397a57faa24aa6e31b2c87Robin Getzstatic bool get_instruction(unsigned short *val, unsigned short *address) 613f09630bff51daaf427968c61c0f2370c64148e06Robin Getz{ 614f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 615f09630bff51daaf427968c61c0f2370c64148e06Robin Getz unsigned long addr; 616f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 617f09630bff51daaf427968c61c0f2370c64148e06Robin Getz addr = (unsigned long)address; 618f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 619f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* Check for odd addresses */ 620f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (addr & 0x1) 621f09630bff51daaf427968c61c0f2370c64148e06Robin Getz return false; 622f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 623f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* Check that things do not wrap around */ 624f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (addr > (addr + 2)) 625f09630bff51daaf427968c61c0f2370c64148e06Robin Getz return false; 626f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 627f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* 628f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * Since we are in exception context, we need to do a little address checking 629f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * We need to make sure we are only accessing valid memory, and 630f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * we don't read something in the async space that can hang forever 631f09630bff51daaf427968c61c0f2370c64148e06Robin Getz */ 632f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if ((addr >= FIXED_CODE_START && (addr + 2) <= physical_mem_end) || 63307aa7be5708afb3d9afa68f6f853c98e51bc64b3Mike Frysinger#if L2_LENGTH != 0 634f09630bff51daaf427968c61c0f2370c64148e06Robin Getz (addr >= L2_START && (addr + 2) <= (L2_START + L2_LENGTH)) || 635f09630bff51daaf427968c61c0f2370c64148e06Robin Getz#endif 636f09630bff51daaf427968c61c0f2370c64148e06Robin Getz (addr >= BOOT_ROM_START && (addr + 2) <= (BOOT_ROM_START + BOOT_ROM_LENGTH)) || 637f09630bff51daaf427968c61c0f2370c64148e06Robin Getz#if L1_DATA_A_LENGTH != 0 638f09630bff51daaf427968c61c0f2370c64148e06Robin Getz (addr >= L1_DATA_A_START && (addr + 2) <= (L1_DATA_A_START + L1_DATA_A_LENGTH)) || 639f09630bff51daaf427968c61c0f2370c64148e06Robin Getz#endif 640f09630bff51daaf427968c61c0f2370c64148e06Robin Getz#if L1_DATA_B_LENGTH != 0 641f09630bff51daaf427968c61c0f2370c64148e06Robin Getz (addr >= L1_DATA_B_START && (addr + 2) <= (L1_DATA_B_START + L1_DATA_B_LENGTH)) || 642f09630bff51daaf427968c61c0f2370c64148e06Robin Getz#endif 643f09630bff51daaf427968c61c0f2370c64148e06Robin Getz (addr >= L1_SCRATCH_START && (addr + 2) <= (L1_SCRATCH_START + L1_SCRATCH_LENGTH)) || 644f09630bff51daaf427968c61c0f2370c64148e06Robin Getz (!(bfin_read_EBIU_AMBCTL0() & B0RDYEN) && 645f09630bff51daaf427968c61c0f2370c64148e06Robin Getz addr >= ASYNC_BANK0_BASE && (addr + 2) <= (ASYNC_BANK0_BASE + ASYNC_BANK0_SIZE)) || 646f09630bff51daaf427968c61c0f2370c64148e06Robin Getz (!(bfin_read_EBIU_AMBCTL0() & B1RDYEN) && 647f09630bff51daaf427968c61c0f2370c64148e06Robin Getz addr >= ASYNC_BANK1_BASE && (addr + 2) <= (ASYNC_BANK1_BASE + ASYNC_BANK1_SIZE)) || 648f09630bff51daaf427968c61c0f2370c64148e06Robin Getz (!(bfin_read_EBIU_AMBCTL1() & B2RDYEN) && 649f09630bff51daaf427968c61c0f2370c64148e06Robin Getz addr >= ASYNC_BANK2_BASE && (addr + 2) <= (ASYNC_BANK2_BASE + ASYNC_BANK1_SIZE)) || 650f09630bff51daaf427968c61c0f2370c64148e06Robin Getz (!(bfin_read_EBIU_AMBCTL1() & B3RDYEN) && 651f09630bff51daaf427968c61c0f2370c64148e06Robin Getz addr >= ASYNC_BANK3_BASE && (addr + 2) <= (ASYNC_BANK3_BASE + ASYNC_BANK1_SIZE))) { 652f09630bff51daaf427968c61c0f2370c64148e06Robin Getz *val = *address; 653f09630bff51daaf427968c61c0f2370c64148e06Robin Getz return true; 654f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } 655f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 656f09630bff51daaf427968c61c0f2370c64148e06Robin Getz#if L1_CODE_LENGTH != 0 657f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (addr >= L1_CODE_START && (addr + 2) <= (L1_CODE_START + L1_CODE_LENGTH)) { 6589df10281e1c03b1c04d17f387bc59eb932c0bb87Robin Getz isram_memcpy(val, address, 2); 659f09630bff51daaf427968c61c0f2370c64148e06Robin Getz return true; 660f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } 661f09630bff51daaf427968c61c0f2370c64148e06Robin Getz#endif 662f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 663f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 664f09630bff51daaf427968c61c0f2370c64148e06Robin Getz return false; 665f09630bff51daaf427968c61c0f2370c64148e06Robin Getz} 666f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 66736f649a55aa3ad1e2196403ba95a652f9900bc50Mike Frysinger/* 668d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz * decode the instruction if we are printing out the trace, as it 669d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz * makes things easier to follow, without running it through objdump 670d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz * These are the normal instructions which cause change of flow, which 671d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz * would be at the source of the trace buffer 672d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz */ 67336f649a55aa3ad1e2196403ba95a652f9900bc50Mike Frysinger#if defined(CONFIG_DEBUG_VERBOSE) && defined(CONFIG_DEBUG_BFIN_HWTRACE_ON) 6749f06c38fb230720371397a57faa24aa6e31b2c87Robin Getzstatic void decode_instruction(unsigned short *address) 675d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz{ 676d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz unsigned short opcode; 677d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz 678d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz if (get_instruction(&opcode, address)) { 679d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz if (opcode == 0x0010) 6809f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("RTS"); 681d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if (opcode == 0x0011) 6829f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("RTI"); 683d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if (opcode == 0x0012) 6849f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("RTX"); 6850be58939146f28394a04b61fec7e0676cdafa47eRobin Getz else if (opcode == 0x0013) 6860be58939146f28394a04b61fec7e0676cdafa47eRobin Getz verbose_printk("RTN"); 6870be58939146f28394a04b61fec7e0676cdafa47eRobin Getz else if (opcode == 0x0014) 6880be58939146f28394a04b61fec7e0676cdafa47eRobin Getz verbose_printk("RTE"); 6890be58939146f28394a04b61fec7e0676cdafa47eRobin Getz else if (opcode == 0x0025) 6900be58939146f28394a04b61fec7e0676cdafa47eRobin Getz verbose_printk("EMUEXCPT"); 6910be58939146f28394a04b61fec7e0676cdafa47eRobin Getz else if (opcode == 0x0040 && opcode <= 0x0047) 6920be58939146f28394a04b61fec7e0676cdafa47eRobin Getz verbose_printk("STI R%i", opcode & 7); 693d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if (opcode >= 0x0050 && opcode <= 0x0057) 6949f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("JUMP (P%i)", opcode & 7); 695d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if (opcode >= 0x0060 && opcode <= 0x0067) 6969f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("CALL (P%i)", opcode & 7); 697d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if (opcode >= 0x0070 && opcode <= 0x0077) 6989f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("CALL (PC+P%i)", opcode & 7); 699d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if (opcode >= 0x0080 && opcode <= 0x0087) 7009f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("JUMP (PC+P%i)", opcode & 7); 7010be58939146f28394a04b61fec7e0676cdafa47eRobin Getz else if (opcode >= 0x0090 && opcode <= 0x009F) 7020be58939146f28394a04b61fec7e0676cdafa47eRobin Getz verbose_printk("RAISE 0x%x", opcode & 0xF); 7030be58939146f28394a04b61fec7e0676cdafa47eRobin Getz else if (opcode >= 0x00A0 && opcode <= 0x00AF) 7040be58939146f28394a04b61fec7e0676cdafa47eRobin Getz verbose_printk("EXCPT 0x%x", opcode & 0xF); 705d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if ((opcode >= 0x1000 && opcode <= 0x13FF) || (opcode >= 0x1800 && opcode <= 0x1BFF)) 7069f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("IF !CC JUMP"); 707d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if ((opcode >= 0x1400 && opcode <= 0x17ff) || (opcode >= 0x1c00 && opcode <= 0x1fff)) 7089f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("IF CC JUMP"); 709d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if (opcode >= 0x2000 && opcode <= 0x2fff) 7109f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("JUMP.S"); 711d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if (opcode >= 0xe080 && opcode <= 0xe0ff) 7129f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("LSETUP"); 713d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if (opcode >= 0xe200 && opcode <= 0xe2ff) 7149f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("JUMP.L"); 715d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else if (opcode >= 0xe300 && opcode <= 0xe3ff) 7169f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("CALL pcrel"); 717d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz else 7189f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("0x%04x", opcode); 719d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz } 720d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz 721d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz} 7229f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#endif 723d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz 7241394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wuvoid dump_bfin_trace_buffer(void) 7251394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu{ 7269f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#ifdef CONFIG_DEBUG_VERBOSE 727518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON 728518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz int tflags, i = 0; 729226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz char buf[150]; 730d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz unsigned short *addr; 731518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND 732518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz int j, index; 733518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#endif 734518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz 7351394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu trace_buffer_save(tflags); 7361394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 737226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz printk(KERN_NOTICE "Hardware Trace:\n"); 738518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz 739d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz#ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND 740d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz printk(KERN_NOTICE "WARNING: Expanded trace turned on - can not trace exceptions\n"); 741d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz#endif 742d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz 7431394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu if (likely(bfin_read_TBUFSTAT() & TBUFCNT)) { 744518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz for (; bfin_read_TBUFSTAT() & TBUFCNT; i++) { 745226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz decode_address(buf, (unsigned long)bfin_read_TBUF()); 746226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz printk(KERN_NOTICE "%4i Target : %s\n", i, buf); 747f09630bff51daaf427968c61c0f2370c64148e06Robin Getz addr = (unsigned short *)bfin_read_TBUF(); 748f09630bff51daaf427968c61c0f2370c64148e06Robin Getz decode_address(buf, (unsigned long)addr); 749f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk(KERN_NOTICE " Source : %s ", buf); 750d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz decode_instruction(addr); 751f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk("\n"); 7521394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 7531394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 7541394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 755518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND 756518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz if (trace_buff_offset) 757d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz index = trace_buff_offset / 4; 758518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz else 759518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz index = EXPAND_LEN; 760518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz 761518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz j = (1 << CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN) * 128; 762518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz while (j) { 763226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz decode_address(buf, software_trace_buff[index]); 764226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz printk(KERN_NOTICE "%4i Target : %s\n", i, buf); 765518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz index -= 1; 766518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz if (index < 0 ) 767518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz index = EXPAND_LEN; 768226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz decode_address(buf, software_trace_buff[index]); 769d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz printk(KERN_NOTICE " Source : %s ", buf); 770d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz decode_instruction((unsigned short *)software_trace_buff[index]); 771d3d0ac23a308f92fc5e5e2846ca40e7bffa5cec3Robin Getz printk("\n"); 772518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz index -= 1; 773518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz if (index < 0) 774518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz index = EXPAND_LEN; 775518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz j--; 776518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz i++; 777518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz } 778518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#endif 779518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz 7801394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu trace_buffer_restore(tflags); 781518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#endif 7829f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#endif 7831394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu} 7841394f03221790a988afc3e4b3cb79f2e477246a9Bryan WuEXPORT_SYMBOL(dump_bfin_trace_buffer); 7851394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 786f09630bff51daaf427968c61c0f2370c64148e06Robin Getz/* 787f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * Checks to see if the address pointed to is either a 788f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * 16-bit CALL instruction, or a 32-bit CALL instruction 789f09630bff51daaf427968c61c0f2370c64148e06Robin Getz */ 7909f06c38fb230720371397a57faa24aa6e31b2c87Robin Getzstatic bool is_bfin_call(unsigned short *addr) 7911394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu{ 792f09630bff51daaf427968c61c0f2370c64148e06Robin Getz unsigned short opcode = 0, *ins_addr; 793f09630bff51daaf427968c61c0f2370c64148e06Robin Getz ins_addr = (unsigned short *)addr; 7941394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 795f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (!get_instruction(&opcode, ins_addr)) 796f09630bff51daaf427968c61c0f2370c64148e06Robin Getz return false; 7971394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 798f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if ((opcode >= 0x0060 && opcode <= 0x0067) || 799f09630bff51daaf427968c61c0f2370c64148e06Robin Getz (opcode >= 0x0070 && opcode <= 0x0077)) 800f09630bff51daaf427968c61c0f2370c64148e06Robin Getz return true; 801f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 802f09630bff51daaf427968c61c0f2370c64148e06Robin Getz ins_addr--; 803f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (!get_instruction(&opcode, ins_addr)) 804f09630bff51daaf427968c61c0f2370c64148e06Robin Getz return false; 8051394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 806f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (opcode >= 0xE300 && opcode <= 0xE3FF) 807f09630bff51daaf427968c61c0f2370c64148e06Robin Getz return true; 808f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 809f09630bff51daaf427968c61c0f2370c64148e06Robin Getz return false; 810f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 811f09630bff51daaf427968c61c0f2370c64148e06Robin Getz} 8129f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz 8131394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wuvoid show_stack(struct task_struct *task, unsigned long *stack) 8141394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu{ 8159f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#ifdef CONFIG_PRINTK 816f09630bff51daaf427968c61c0f2370c64148e06Robin Getz unsigned int *addr, *endstack, *fp = 0, *frame; 817f09630bff51daaf427968c61c0f2370c64148e06Robin Getz unsigned short *ins_addr; 818f09630bff51daaf427968c61c0f2370c64148e06Robin Getz char buf[150]; 819f09630bff51daaf427968c61c0f2370c64148e06Robin Getz unsigned int i, j, ret_addr, frame_no = 0; 8201394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 821f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* 822f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * If we have been passed a specific stack, use that one otherwise 823f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * if we have been passed a task structure, use that, otherwise 824f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * use the stack of where the variable "stack" exists 8251394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu */ 8261394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 827f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (stack == NULL) { 828f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (task) { 829f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* We know this is a kernel stack, so this is the start/end */ 8301394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu stack = (unsigned long *)task->thread.ksp; 831f09630bff51daaf427968c61c0f2370c64148e06Robin Getz endstack = (unsigned int *)(((unsigned int)(stack) & ~(THREAD_SIZE - 1)) + THREAD_SIZE); 832f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } else { 833f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* print out the existing stack info */ 8341394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu stack = (unsigned long *)&stack; 835f09630bff51daaf427968c61c0f2370c64148e06Robin Getz endstack = (unsigned int *)PAGE_ALIGN((unsigned int)stack); 836f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } 837f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } else 838f09630bff51daaf427968c61c0f2370c64148e06Robin Getz endstack = (unsigned int *)PAGE_ALIGN((unsigned int)stack); 839f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 8409f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz printk(KERN_NOTICE "Stack info:\n"); 841f09630bff51daaf427968c61c0f2370c64148e06Robin Getz decode_address(buf, (unsigned int)stack); 8429f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz printk(KERN_NOTICE " SP: [0x%p] %s\n", stack, buf); 8439f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz 844a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz if (!access_ok(VERIFY_READ, stack, (unsigned int)endstack - (unsigned int)stack)) { 845a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz printk(KERN_NOTICE "Invalid stack pointer\n"); 846a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz return; 847a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz } 848a0cab65642813b7990e1b4b2ab6ad92e171571f4Robin Getz 849f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* First thing is to look for a frame pointer */ 850881eb621fc191e58fa638c533073683be2b63c24Jie Zhang for (addr = (unsigned int *)((unsigned int)stack & ~0xF); addr < endstack; addr++) { 851f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (*addr & 0x1) 852f09630bff51daaf427968c61c0f2370c64148e06Robin Getz continue; 853f09630bff51daaf427968c61c0f2370c64148e06Robin Getz ins_addr = (unsigned short *)*addr; 854f09630bff51daaf427968c61c0f2370c64148e06Robin Getz ins_addr--; 855f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (is_bfin_call(ins_addr)) 856f09630bff51daaf427968c61c0f2370c64148e06Robin Getz fp = addr - 1; 857f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 858f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (fp) { 859f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* Let's check to see if it is a frame pointer */ 860881eb621fc191e58fa638c533073683be2b63c24Jie Zhang while (fp >= (addr - 1) && fp < endstack 861881eb621fc191e58fa638c533073683be2b63c24Jie Zhang && fp && ((unsigned int) fp & 0x3) == 0) 862f09630bff51daaf427968c61c0f2370c64148e06Robin Getz fp = (unsigned int *)*fp; 863f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (fp == 0 || fp == endstack) { 864f09630bff51daaf427968c61c0f2370c64148e06Robin Getz fp = addr - 1; 865f09630bff51daaf427968c61c0f2370c64148e06Robin Getz break; 866f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } 867f09630bff51daaf427968c61c0f2370c64148e06Robin Getz fp = 0; 868f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } 8691394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 870f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (fp) { 871f09630bff51daaf427968c61c0f2370c64148e06Robin Getz frame = fp; 872b339dc79b49841eff0aeecfc444cbb7b26007649Jie Zhang printk(KERN_NOTICE " FP: (0x%p)\n", fp); 873f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } else 874f09630bff51daaf427968c61c0f2370c64148e06Robin Getz frame = 0; 8751394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 876f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* 877f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * Now that we think we know where things are, we 878f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * walk the stack again, this time printing things out 879f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * incase there is no frame pointer, we still look for 880f09630bff51daaf427968c61c0f2370c64148e06Robin Getz * valid return addresses 881f09630bff51daaf427968c61c0f2370c64148e06Robin Getz */ 8821394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 883f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* First time print out data, next time, print out symbols */ 884f09630bff51daaf427968c61c0f2370c64148e06Robin Getz for (j = 0; j <= 1; j++) { 885f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (j) 886f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk(KERN_NOTICE "Return addresses in stack:\n"); 887f09630bff51daaf427968c61c0f2370c64148e06Robin Getz else 888f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk(KERN_NOTICE " Memory from 0x%08lx to %p", ((long unsigned int)stack & ~0xF), endstack); 889f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 890f09630bff51daaf427968c61c0f2370c64148e06Robin Getz fp = frame; 891f09630bff51daaf427968c61c0f2370c64148e06Robin Getz frame_no = 0; 892f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 893f09630bff51daaf427968c61c0f2370c64148e06Robin Getz for (addr = (unsigned int *)((unsigned int)stack & ~0xF), i = 0; 894f09630bff51daaf427968c61c0f2370c64148e06Robin Getz addr <= endstack; addr++, i++) { 895f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 896f09630bff51daaf427968c61c0f2370c64148e06Robin Getz ret_addr = 0; 897f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (!j && i % 8 == 0) 898f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk("\n" KERN_NOTICE "%p:",addr); 899f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 900f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* if it is an odd address, or zero, just skip it */ 901f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (*addr & 0x1 || !*addr) 902f09630bff51daaf427968c61c0f2370c64148e06Robin Getz goto print; 903f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 904f09630bff51daaf427968c61c0f2370c64148e06Robin Getz ins_addr = (unsigned short *)*addr; 905f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 906f09630bff51daaf427968c61c0f2370c64148e06Robin Getz /* Go back one instruction, and see if it is a CALL */ 907f09630bff51daaf427968c61c0f2370c64148e06Robin Getz ins_addr--; 908f09630bff51daaf427968c61c0f2370c64148e06Robin Getz ret_addr = is_bfin_call(ins_addr); 909f09630bff51daaf427968c61c0f2370c64148e06Robin Getz print: 910f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (!j && stack == (unsigned long *)addr) 911f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk("[%08x]", *addr); 912f09630bff51daaf427968c61c0f2370c64148e06Robin Getz else if (ret_addr) 913f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (j) { 914f09630bff51daaf427968c61c0f2370c64148e06Robin Getz decode_address(buf, (unsigned int)*addr); 915f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (frame == addr) { 916f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk(KERN_NOTICE " frame %2i : %s\n", frame_no, buf); 917f09630bff51daaf427968c61c0f2370c64148e06Robin Getz continue; 918f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } 919f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk(KERN_NOTICE " address : %s\n", buf); 920f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } else 921f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk("<%08x>", *addr); 922f09630bff51daaf427968c61c0f2370c64148e06Robin Getz else if (fp == addr) { 923f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (j) 924f09630bff51daaf427968c61c0f2370c64148e06Robin Getz frame = addr+1; 925f09630bff51daaf427968c61c0f2370c64148e06Robin Getz else 926f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk("(%08x)", *addr); 927f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 928f09630bff51daaf427968c61c0f2370c64148e06Robin Getz fp = (unsigned int *)*addr; 929f09630bff51daaf427968c61c0f2370c64148e06Robin Getz frame_no++; 930f09630bff51daaf427968c61c0f2370c64148e06Robin Getz 931f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } else if (!j) 932f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk(" %08x ", *addr); 933f09630bff51daaf427968c61c0f2370c64148e06Robin Getz } 934f09630bff51daaf427968c61c0f2370c64148e06Robin Getz if (!j) 935f09630bff51daaf427968c61c0f2370c64148e06Robin Getz printk("\n"); 9361394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 9379f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#endif 9381394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu} 9391394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 9401394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wuvoid dump_stack(void) 9411394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu{ 9421394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned long stack; 943518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON 9441394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu int tflags; 945518039bc24cbb9ce34665814fe120eac50bedd9aRobin Getz#endif 9461394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu trace_buffer_save(tflags); 9471394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu dump_bfin_trace_buffer(); 9481394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu show_stack(current, &stack); 9491394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu trace_buffer_restore(tflags); 9501394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu} 9511394f03221790a988afc3e4b3cb79f2e477246a9Bryan WuEXPORT_SYMBOL(dump_stack); 9521394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 95349dce9124b41984bf1e918847bc17929c2e8f80fMike Frysingervoid dump_bfin_process(struct pt_regs *fp) 9541394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu{ 9559f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#ifdef CONFIG_DEBUG_VERBOSE 95649dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger /* We should be able to look at fp->ipend, but we don't push it on the 95749dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger * stack all the time, so do this until we fix that */ 95849dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger unsigned int context = bfin_read_IPEND(); 95949dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger 96049dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger if (oops_in_progress) 9619f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_EMERG "Kernel OOPS in progress\n"); 96249dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger 963b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz if (context & 0x0020 && (fp->seqstat & SEQSTAT_EXCAUSE) == VEC_HWERR) 9649f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "HW Error context\n"); 965b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz else if (context & 0x0020) 9669f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "Deferred Exception context\n"); 96749dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger else if (context & 0x3FC0) 9689f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "Interrupt context\n"); 96949dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger else if (context & 0x4000) 9709f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "Deferred Interrupt context\n"); 97149dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger else if (context & 0x8000) 9729f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "Kernel process context\n"); 97349dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger 9749a62ca40fd793742f92565104c6b44319af8c282Robin Getz /* Because we are crashing, and pointers could be bad, we check things 9759a62ca40fd793742f92565104c6b44319af8c282Robin Getz * pretty closely before we use them 9769a62ca40fd793742f92565104c6b44319af8c282Robin Getz */ 9777f1c906808a36630990d83d872935c079b76595bRobin Getz if ((unsigned long)current >= FIXED_CODE_START && 9787f1c906808a36630990d83d872935c079b76595bRobin Getz !((unsigned long)current & 0x3) && current->pid) { 9799f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "CURRENT PROCESS:\n"); 9809a62ca40fd793742f92565104c6b44319af8c282Robin Getz if (current->comm >= (char *)FIXED_CODE_START) 9819f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "COMM=%s PID=%d\n", 9829a62ca40fd793742f92565104c6b44319af8c282Robin Getz current->comm, current->pid); 9839a62ca40fd793742f92565104c6b44319af8c282Robin Getz else 9849f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "COMM= invalid\n"); 9859a62ca40fd793742f92565104c6b44319af8c282Robin Getz 9868f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang printk(KERN_NOTICE "CPU = %d\n", current_thread_info()->cpu); 9879a62ca40fd793742f92565104c6b44319af8c282Robin Getz if (!((unsigned long)current->mm & 0x3) && (unsigned long)current->mm >= FIXED_CODE_START) 9889f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "TEXT = 0x%p-0x%p DATA = 0x%p-0x%p\n" 9899a62ca40fd793742f92565104c6b44319af8c282Robin Getz KERN_NOTICE " BSS = 0x%p-0x%p USER-STACK = 0x%p\n" 9909a62ca40fd793742f92565104c6b44319af8c282Robin Getz KERN_NOTICE "\n", 9919a62ca40fd793742f92565104c6b44319af8c282Robin Getz (void *)current->mm->start_code, 9929a62ca40fd793742f92565104c6b44319af8c282Robin Getz (void *)current->mm->end_code, 9939a62ca40fd793742f92565104c6b44319af8c282Robin Getz (void *)current->mm->start_data, 9949a62ca40fd793742f92565104c6b44319af8c282Robin Getz (void *)current->mm->end_data, 9959a62ca40fd793742f92565104c6b44319af8c282Robin Getz (void *)current->mm->end_data, 9969a62ca40fd793742f92565104c6b44319af8c282Robin Getz (void *)current->mm->brk, 9979a62ca40fd793742f92565104c6b44319af8c282Robin Getz (void *)current->mm->start_stack); 9989a62ca40fd793742f92565104c6b44319af8c282Robin Getz else 9999f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "invalid mm\n"); 100049dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger } else 10019f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "\n" KERN_NOTICE 100249dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger "No Valid process in current context\n"); 10039f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#endif 100449dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger} 1005226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 1006b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getzvoid dump_bfin_mem(struct pt_regs *fp) 100749dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger{ 10089f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#ifdef CONFIG_DEBUG_VERBOSE 1009b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz unsigned short *addr, *erraddr, val = 0, err = 0; 1010b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz char sti = 0, buf[6]; 10111394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 10125d750b9e4f6ca7d366b4954517ff8be9ee07e1bfBernd Schmidt erraddr = (void *)fp->pc; 1013b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz 10149f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "return address: [0x%p]; contents of:", erraddr); 1015b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz 1016b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz for (addr = (unsigned short *)((unsigned long)erraddr & ~0xF) - 0x10; 1017b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz addr < (unsigned short *)((unsigned long)erraddr & ~0xF) + 0x10; 1018b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz addr++) { 1019b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz if (!((unsigned long)addr & 0xF)) 10209f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("\n" KERN_NOTICE "0x%p: ", addr); 1021b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz 10227d98c881eed9e19767bc77ffd650d0041b4f41ecRobin Getz if (!get_instruction(&val, addr)) { 1023b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz val = 0; 1024b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz sprintf(buf, "????"); 1025b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz } else 1026b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz sprintf(buf, "%04x", val); 1027b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz 1028b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz if (addr == erraddr) { 10299f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("[%s]", buf); 1030b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz err = val; 1031b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz } else 10329f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(" %s ", buf); 1033b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz 1034b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz /* Do any previous instructions turn on interrupts? */ 1035b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz if (addr <= erraddr && /* in the past */ 1036b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz ((val >= 0x0040 && val <= 0x0047) || /* STI instruction */ 1037b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz val == 0x017b)) /* [SP++] = RETI */ 1038b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz sti = 1; 1039b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz } 1040b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz 10419f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("\n"); 1042b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz 1043b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz /* Hardware error interrupts can be deferred */ 1044b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz if (unlikely(sti && (fp->seqstat & SEQSTAT_EXCAUSE) == VEC_HWERR && 1045b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz oops_in_progress)){ 10469f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "Looks like this was a deferred error - sorry\n"); 10471394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#ifndef CONFIG_DEBUG_HWERR 10489f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "The remaining message may be meaningless\n" 1049b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz KERN_NOTICE "You should enable CONFIG_DEBUG_HWERR to get a" 1050b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz " better idea where it came from\n"); 1051b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz#else 1052b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz /* If we are handling only one peripheral interrupt 1053b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz * and current mm and pid are valid, and the last error 1054b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz * was in that user space process's text area 1055b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz * print it out - because that is where the problem exists 1056b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz */ 1057b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz if ((!(((fp)->ipend & ~0x30) & (((fp)->ipend & ~0x30) - 1))) && 1058b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz (current->pid && current->mm)) { 1059b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz /* And the last RETI points to the current userspace context */ 1060b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz if ((fp + 1)->pc >= current->mm->start_code && 1061b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz (fp + 1)->pc <= current->mm->end_code) { 10629f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "It might be better to look around here : \n"); 10639f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "-------------------------------------------\n"); 1064b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz show_regs(fp + 1); 10659f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "-------------------------------------------\n"); 1066b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz } 10671394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 1068b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz#endif 1069b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz } 10709f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#endif 107149dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger} 107249dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger 107349dce9124b41984bf1e918847bc17929c2e8f80fMike Frysingervoid show_regs(struct pt_regs *fp) 107449dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger{ 10759f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#ifdef CONFIG_DEBUG_VERBOSE 107649dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger char buf [150]; 1077d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz struct irqaction *action; 1078d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz unsigned int i; 10792f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz unsigned long flags = 0; 10808f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang unsigned int cpu = smp_processor_id(); 10812f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic(); 1082226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 10839ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz verbose_printk(KERN_NOTICE "\n"); 10849ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz if (CPUID != bfin_cpuid()) 10859ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz verbose_printk(KERN_NOTICE "Compiled for cpu family 0x%04x (Rev %d), " 10869ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz "but running on:0x%04x (Rev %d)\n", 10879ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz CPUID, bfin_compiled_revid(), bfin_cpuid(), bfin_revid()); 10889ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz 10899ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz verbose_printk(KERN_NOTICE "ADSP-%s-0.%d", 10909ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz CPU, bfin_compiled_revid()); 10919ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz 10929ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz if (bfin_compiled_revid() != bfin_revid()) 10939ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz verbose_printk("(Detected 0.%d)", bfin_revid()); 10949ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz 10959ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz verbose_printk(" %lu(MHz CCLK) %lu(MHz SCLK) (%s)\n", 10969ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz get_cclk()/1000000, get_sclk()/1000000, 10979ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz#ifdef CONFIG_MPU 10989ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz "mpu on" 10999ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz#else 11009ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz "mpu off" 11019ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz#endif 11029ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz ); 11039ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz 11049ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz verbose_printk(KERN_NOTICE "%s", linux_banner); 11059ba3c24f10c948dadac2ca91ed714dfbcedd61caRobin Getz 11069f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted()); 11079f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n", 1108226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz (long)fp->seqstat, fp->ipend, fp->syscfg); 11091d5ff7e27d2ca30cd3f61afd353b03dd67330818Robin Getz if ((fp->seqstat & SEQSTAT_EXCAUSE) == VEC_HWERR) { 11109f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " HWERRCAUSE: 0x%lx\n", 11111d5ff7e27d2ca30cd3f61afd353b03dd67330818Robin Getz (fp->seqstat & SEQSTAT_HWERRCAUSE) >> 14); 11121d5ff7e27d2ca30cd3f61afd353b03dd67330818Robin Getz#ifdef EBIU_ERRMST 11131d5ff7e27d2ca30cd3f61afd353b03dd67330818Robin Getz /* If the error was from the EBIU, print it out */ 11141d5ff7e27d2ca30cd3f61afd353b03dd67330818Robin Getz if (bfin_read_EBIU_ERRMST() & CORE_ERROR) { 11159f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " EBIU Error Reason : 0x%04x\n", 11161d5ff7e27d2ca30cd3f61afd353b03dd67330818Robin Getz bfin_read_EBIU_ERRMST()); 11179f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " EBIU Error Address : 0x%08x\n", 11181d5ff7e27d2ca30cd3f61afd353b03dd67330818Robin Getz bfin_read_EBIU_ERRADD()); 11191d5ff7e27d2ca30cd3f61afd353b03dd67330818Robin Getz } 11201d5ff7e27d2ca30cd3f61afd353b03dd67330818Robin Getz#endif 11211d5ff7e27d2ca30cd3f61afd353b03dd67330818Robin Getz } 11229f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " EXCAUSE : 0x%lx\n", 112313fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz fp->seqstat & SEQSTAT_EXCAUSE); 11242f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz for (i = 2; i <= 15 ; i++) { 1125d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz if (fp->ipend & (1 << i)) { 11262f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz if (i != 4) { 11272f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz decode_address(buf, bfin_read32(EVT0 + 4*i)); 11282f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz verbose_printk(KERN_NOTICE " physical IVG%i asserted : %s\n", i, buf); 11292f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz } else 11302f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz verbose_printk(KERN_NOTICE " interrupts disabled\n"); 1131d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz } 1132d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz } 1133d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz 1134d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz /* if no interrupts are going off, don't print this out */ 1135d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz if (fp->ipend & ~0x3F) { 1136d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz for (i = 0; i < (NR_IRQS - 1); i++) { 11372f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz if (!in_atomic) 11382f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz spin_lock_irqsave(&irq_desc[i].lock, flags); 11392f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz 1140d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz action = irq_desc[i].action; 1141d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz if (!action) 1142d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz goto unlock; 1143d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz 1144d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz decode_address(buf, (unsigned int)action->handler); 11459f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " logical irq %3d mapped : %s", i, buf); 1146d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz for (action = action->next; action; action = action->next) { 1147d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz decode_address(buf, (unsigned int)action->handler); 11489f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(", %s", buf); 1149d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz } 11509f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk("\n"); 1151d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getzunlock: 11522f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz if (!in_atomic) 11532f95d5bd84bfbe8cf62cb1c4306354cfc139370bRobin Getz spin_unlock_irqrestore(&irq_desc[i].lock, flags); 1154d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz } 1155d8f66c8c1ea8e948483ee4739ad91120f5f7de51Robin Getz } 1156c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz 1157226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz decode_address(buf, fp->rete); 11589f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " RETE: %s\n", buf); 1159226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz decode_address(buf, fp->retn); 11609f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " RETN: %s\n", buf); 1161226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz decode_address(buf, fp->retx); 11629f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " RETX: %s\n", buf); 1163226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz decode_address(buf, fp->rets); 11649f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " RETS: %s\n", buf); 116549dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger decode_address(buf, fp->pc); 11669f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " PC : %s\n", buf); 1167c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz 116813fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz if (((long)fp->seqstat & SEQSTAT_EXCAUSE) && 116913fe24f37df20e580a5a364e67ec8cf3219d8f8cRobin Getz (((long)fp->seqstat & SEQSTAT_EXCAUSE) != VEC_HWERR)) { 11708f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang decode_address(buf, cpu_pda[cpu].dcplb_fault_addr); 11719f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "DCPLB_FAULT_ADDR: %s\n", buf); 11728f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang decode_address(buf, cpu_pda[cpu].icplb_fault_addr); 11739f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "ICPLB_FAULT_ADDR: %s\n", buf); 1174226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz } 1175226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 11769f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "PROCESSOR STATE:\n"); 11779f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " R0 : %08lx R1 : %08lx R2 : %08lx R3 : %08lx\n", 1178c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz fp->r0, fp->r1, fp->r2, fp->r3); 11799f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " R4 : %08lx R5 : %08lx R6 : %08lx R7 : %08lx\n", 1180c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz fp->r4, fp->r5, fp->r6, fp->r7); 11819f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " P0 : %08lx P1 : %08lx P2 : %08lx P3 : %08lx\n", 1182c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz fp->p0, fp->p1, fp->p2, fp->p3); 11839f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " P4 : %08lx P5 : %08lx FP : %08lx SP : %08lx\n", 1184226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz fp->p4, fp->p5, fp->fp, (long)fp); 11859f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " LB0: %08lx LT0: %08lx LC0: %08lx\n", 1186c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz fp->lb0, fp->lt0, fp->lc0); 11879f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " LB1: %08lx LT1: %08lx LC1: %08lx\n", 1188c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz fp->lb1, fp->lt1, fp->lc1); 11899f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " B0 : %08lx L0 : %08lx M0 : %08lx I0 : %08lx\n", 1190c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz fp->b0, fp->l0, fp->m0, fp->i0); 11919f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " B1 : %08lx L1 : %08lx M1 : %08lx I1 : %08lx\n", 1192c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz fp->b1, fp->l1, fp->m1, fp->i1); 11939f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " B2 : %08lx L2 : %08lx M2 : %08lx I2 : %08lx\n", 1194c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz fp->b2, fp->l2, fp->m2, fp->i2); 11959f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE " B3 : %08lx L3 : %08lx M3 : %08lx I3 : %08lx\n", 1196c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz fp->b3, fp->l3, fp->m3, fp->i3); 11979f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "A0.w: %08lx A0.x: %08lx A1.w: %08lx A1.x: %08lx\n", 1198226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz fp->a0w, fp->a0x, fp->a1w, fp->a1x); 1199c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz 12009f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "USP : %08lx ASTAT: %08lx\n", 1201c5d88d9e2566e7ddccb0e001446b9a39882560a3Robin Getz rdusp(), fp->astat); 12021394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 12039f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz verbose_printk(KERN_NOTICE "\n"); 12049f06c38fb230720371397a57faa24aa6e31b2c87Robin Getz#endif 12051394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu} 12061394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 12071394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#ifdef CONFIG_SYS_BFIN_SPINLOCK_L1 12081394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wuasmlinkage int sys_bfin_spinlock(int *spinlock)__attribute__((l1_text)); 12091394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif 12101394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 12118f65873e47784a390949f0d61e5692dbf2a8253eGraf Yangstatic DEFINE_SPINLOCK(bfin_spinlock_lock); 12128f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang 12138f65873e47784a390949f0d61e5692dbf2a8253eGraf Yangasmlinkage int sys_bfin_spinlock(int *p) 12141394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu{ 12158f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang int ret, tmp = 0; 12161394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 12178f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang spin_lock(&bfin_spinlock_lock); /* This would also hold kernel preemption. */ 12188f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang ret = get_user(tmp, p); 12198f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang if (likely(ret == 0)) { 12208f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang if (unlikely(tmp)) 12211394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu ret = 1; 12228f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang else 12238f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang put_user(1, p); 12241394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 12258f65873e47784a390949f0d61e5692dbf2a8253eGraf Yang spin_unlock(&bfin_spinlock_lock); 12261394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu return ret; 12271394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu} 12281394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 12291ffe6646babf8471714e649849ec2c9662bf410cMike Frysingerint bfin_request_exception(unsigned int exception, void (*handler)(void)) 12301ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger{ 12311ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger void (*curr_handler)(void); 12321ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12331ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger if (exception > 0x3F) 12341ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger return -EINVAL; 12351ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12361ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger curr_handler = ex_table[exception]; 12371ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12381ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger if (curr_handler != ex_replaceable) 12391ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger return -EBUSY; 12401ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12411ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger ex_table[exception] = handler; 12421ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12431ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger return 0; 12441ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger} 12451ffe6646babf8471714e649849ec2c9662bf410cMike FrysingerEXPORT_SYMBOL(bfin_request_exception); 12461ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12471ffe6646babf8471714e649849ec2c9662bf410cMike Frysingerint bfin_free_exception(unsigned int exception, void (*handler)(void)) 12481ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger{ 12491ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger void (*curr_handler)(void); 12501ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12511ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger if (exception > 0x3F) 12521ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger return -EINVAL; 12531ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12541ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger curr_handler = ex_table[exception]; 12551ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12561ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger if (curr_handler != handler) 12571ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger return -EBUSY; 12581ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12591ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger ex_table[exception] = ex_replaceable; 12601ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12611ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger return 0; 12621ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger} 12631ffe6646babf8471714e649849ec2c9662bf410cMike FrysingerEXPORT_SYMBOL(bfin_free_exception); 12641ffe6646babf8471714e649849ec2c9662bf410cMike Frysinger 12651394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wuvoid panic_cplb_error(int cplb_panic, struct pt_regs *fp) 12661394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu{ 12671394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu switch (cplb_panic) { 12681394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case CPLB_NO_UNLOCKED: 12691394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu printk(KERN_EMERG "All CPLBs are locked\n"); 12701394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 12711394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case CPLB_PROT_VIOL: 12721394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu return; 12731394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case CPLB_NO_ADDR_MATCH: 12741394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu return; 12751394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu case CPLB_UNKNOWN_ERR: 12761394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu printk(KERN_EMERG "Unknown CPLB Exception\n"); 12771394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu break; 12781394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu } 12791394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1280226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz oops_in_progress = 1; 1281226eb1ef523a33c66193bc319a92c647e47311d4Robin Getz 128249dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger dump_bfin_process(fp); 1283b03b08ba9c7235861adf4dde712dade0bb756fe0Robin Getz dump_bfin_mem(fp); 128449dce9124b41984bf1e918847bc17929c2e8f80fMike Frysinger show_regs(fp); 12851394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu dump_stack(); 1286d8804adf52f5991388fa9af77428e4cc7768059dMike Frysinger panic("Unrecoverable event"); 12871394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu} 1288