1 /* 2 * (C) Copyright 2013 3 * David Feng <fenghua@phytium.com.cn> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <common.h> 9 #include <linux/compiler.h> 10 #include <efi_loader.h> 11 12 DECLARE_GLOBAL_DATA_PTR; 13 14 int interrupt_init(void) 15 { 16 return 0; 17 } 18 19 void enable_interrupts(void) 20 { 21 return; 22 } 23 24 int disable_interrupts(void) 25 { 26 return 0; 27 } 28 29 void show_regs(struct pt_regs *regs) 30 { 31 int i; 32 33 if (gd->flags & GD_FLG_RELOC) 34 printf("elr: %016lx lr : %016lx (reloc)\n", 35 regs->elr - gd->reloc_off, 36 regs->regs[30] - gd->reloc_off); 37 printf("elr: %016lx lr : %016lx\n", regs->elr, regs->regs[30]); 38 39 for (i = 0; i < 29; i += 2) 40 printf("x%-2d: %016lx x%-2d: %016lx\n", 41 i, regs->regs[i], i+1, regs->regs[i+1]); 42 printf("\n"); 43 } 44 45 /* 46 * do_bad_sync handles the impossible case in the Synchronous Abort vector. 47 */ 48 void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr) 49 { 50 efi_restore_gd(); 51 printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr); 52 show_regs(pt_regs); 53 panic("Resetting CPU ...\n"); 54 } 55 56 /* 57 * do_bad_irq handles the impossible case in the Irq vector. 58 */ 59 void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr) 60 { 61 efi_restore_gd(); 62 printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr); 63 show_regs(pt_regs); 64 panic("Resetting CPU ...\n"); 65 } 66 67 /* 68 * do_bad_fiq handles the impossible case in the Fiq vector. 69 */ 70 void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr) 71 { 72 efi_restore_gd(); 73 printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr); 74 show_regs(pt_regs); 75 panic("Resetting CPU ...\n"); 76 } 77 78 /* 79 * do_bad_error handles the impossible case in the Error vector. 80 */ 81 void do_bad_error(struct pt_regs *pt_regs, unsigned int esr) 82 { 83 efi_restore_gd(); 84 printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr); 85 show_regs(pt_regs); 86 panic("Resetting CPU ...\n"); 87 } 88 89 /* 90 * do_sync handles the Synchronous Abort exception. 91 */ 92 void do_sync(struct pt_regs *pt_regs, unsigned int esr) 93 { 94 efi_restore_gd(); 95 printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr); 96 show_regs(pt_regs); 97 panic("Resetting CPU ...\n"); 98 } 99 100 /* 101 * do_irq handles the Irq exception. 102 */ 103 void do_irq(struct pt_regs *pt_regs, unsigned int esr) 104 { 105 efi_restore_gd(); 106 printf("\"Irq\" handler, esr 0x%08x\n", esr); 107 show_regs(pt_regs); 108 panic("Resetting CPU ...\n"); 109 } 110 111 /* 112 * do_fiq handles the Fiq exception. 113 */ 114 void do_fiq(struct pt_regs *pt_regs, unsigned int esr) 115 { 116 efi_restore_gd(); 117 printf("\"Fiq\" handler, esr 0x%08x\n", esr); 118 show_regs(pt_regs); 119 panic("Resetting CPU ...\n"); 120 } 121 122 /* 123 * do_error handles the Error exception. 124 * Errors are more likely to be processor specific, 125 * it is defined with weak attribute and can be redefined 126 * in processor specific code. 127 */ 128 void __weak do_error(struct pt_regs *pt_regs, unsigned int esr) 129 { 130 efi_restore_gd(); 131 printf("\"Error\" handler, esr 0x%08x\n", esr); 132 show_regs(pt_regs); 133 panic("Resetting CPU ...\n"); 134 } 135