1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * (C) Copyright 2015 4 * Kamil Lulko, <kamil.lulko@gmail.com> 5 */ 6 7#include <common.h> 8#include <cpu_func.h> 9#include <irq_func.h> 10 11/* 12 * Upon exception entry ARMv7-M processors automatically save stack 13 * frames containing some registers. For simplicity initial 14 * implementation uses only this auto-saved stack frame. 15 * This does not contain complete register set dump, 16 * only R0-R3, R12, LR, PC and xPSR are saved. 17 */ 18 19struct autosave_regs { 20 long uregs[8]; 21}; 22 23#define ARM_XPSR uregs[7] 24#define ARM_PC uregs[6] 25#define ARM_LR uregs[5] 26#define ARM_R12 uregs[4] 27#define ARM_R3 uregs[3] 28#define ARM_R2 uregs[2] 29#define ARM_R1 uregs[1] 30#define ARM_R0 uregs[0] 31 32int interrupt_init(void) 33{ 34 enable_interrupts(); 35 36 return 0; 37} 38 39void enable_interrupts(void) 40{ 41 return; 42} 43 44int disable_interrupts(void) 45{ 46 return 0; 47} 48 49void dump_regs(struct autosave_regs *regs) 50{ 51 printf("pc : %08lx lr : %08lx xPSR : %08lx\n", 52 regs->ARM_PC, regs->ARM_LR, regs->ARM_XPSR); 53 printf("r12 : %08lx r3 : %08lx r2 : %08lx\n" 54 "r1 : %08lx r0 : %08lx\n", 55 regs->ARM_R12, regs->ARM_R3, regs->ARM_R2, 56 regs->ARM_R1, regs->ARM_R0); 57} 58 59void bad_mode(void) 60{ 61 panic("Resetting CPU ...\n"); 62 reset_cpu(0); 63} 64 65void do_hard_fault(struct autosave_regs *autosave_regs) 66{ 67 printf("Hard fault\n"); 68 dump_regs(autosave_regs); 69 bad_mode(); 70} 71 72void do_mm_fault(struct autosave_regs *autosave_regs) 73{ 74 printf("Memory management fault\n"); 75 dump_regs(autosave_regs); 76 bad_mode(); 77} 78 79void do_bus_fault(struct autosave_regs *autosave_regs) 80{ 81 printf("Bus fault\n"); 82 dump_regs(autosave_regs); 83 bad_mode(); 84} 85 86void do_usage_fault(struct autosave_regs *autosave_regs) 87{ 88 printf("Usage fault\n"); 89 dump_regs(autosave_regs); 90 bad_mode(); 91} 92 93void do_invalid_entry(struct autosave_regs *autosave_regs) 94{ 95 printf("Exception\n"); 96 dump_regs(autosave_regs); 97 bad_mode(); 98} 99