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