10ae76531SDavid Feng /* 20ae76531SDavid Feng * (C) Copyright 2013 30ae76531SDavid Feng * David Feng <fenghua@phytium.com.cn> 40ae76531SDavid Feng * 50ae76531SDavid Feng * SPDX-License-Identifier: GPL-2.0+ 60ae76531SDavid Feng */ 70ae76531SDavid Feng 80ae76531SDavid Feng #include <common.h> 90ae76531SDavid Feng #include <linux/compiler.h> 1064982915SAlexander Graf #include <efi_loader.h> 110ae76531SDavid Feng 12*fa40f8a0SJoseph Chen #ifndef CONFIG_IRQ 130ae76531SDavid Feng int interrupt_init(void) 140ae76531SDavid Feng { 150ae76531SDavid Feng return 0; 160ae76531SDavid Feng } 170ae76531SDavid Feng 180ae76531SDavid Feng void enable_interrupts(void) 190ae76531SDavid Feng { 200ae76531SDavid Feng return; 210ae76531SDavid Feng } 220ae76531SDavid Feng 230ae76531SDavid Feng int disable_interrupts(void) 240ae76531SDavid Feng { 250ae76531SDavid Feng return 0; 260ae76531SDavid Feng } 27*fa40f8a0SJoseph Chen #endif 280ae76531SDavid Feng 290ae76531SDavid Feng void show_regs(struct pt_regs *regs) 300ae76531SDavid Feng { 310ae76531SDavid Feng int i; 320ae76531SDavid Feng 330ae76531SDavid Feng printf("ELR: %lx\n", regs->elr); 340ae76531SDavid Feng printf("LR: %lx\n", regs->regs[30]); 350ae76531SDavid Feng for (i = 0; i < 29; i += 2) 360ae76531SDavid Feng printf("x%-2d: %016lx x%-2d: %016lx\n", 370ae76531SDavid Feng i, regs->regs[i], i+1, regs->regs[i+1]); 380ae76531SDavid Feng printf("\n"); 390ae76531SDavid Feng } 400ae76531SDavid Feng 410ae76531SDavid Feng /* 420ae76531SDavid Feng * do_bad_sync handles the impossible case in the Synchronous Abort vector. 430ae76531SDavid Feng */ 440ae76531SDavid Feng void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr) 450ae76531SDavid Feng { 4664982915SAlexander Graf efi_restore_gd(); 470ae76531SDavid Feng printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr); 480ae76531SDavid Feng show_regs(pt_regs); 490ae76531SDavid Feng panic("Resetting CPU ...\n"); 500ae76531SDavid Feng } 510ae76531SDavid Feng 520ae76531SDavid Feng /* 530ae76531SDavid Feng * do_bad_irq handles the impossible case in the Irq vector. 540ae76531SDavid Feng */ 550ae76531SDavid Feng void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr) 560ae76531SDavid Feng { 5764982915SAlexander Graf efi_restore_gd(); 580ae76531SDavid Feng printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr); 590ae76531SDavid Feng show_regs(pt_regs); 600ae76531SDavid Feng panic("Resetting CPU ...\n"); 610ae76531SDavid Feng } 620ae76531SDavid Feng 630ae76531SDavid Feng /* 640ae76531SDavid Feng * do_bad_fiq handles the impossible case in the Fiq vector. 650ae76531SDavid Feng */ 660ae76531SDavid Feng void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr) 670ae76531SDavid Feng { 6864982915SAlexander Graf efi_restore_gd(); 690ae76531SDavid Feng printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr); 700ae76531SDavid Feng show_regs(pt_regs); 710ae76531SDavid Feng panic("Resetting CPU ...\n"); 720ae76531SDavid Feng } 730ae76531SDavid Feng 740ae76531SDavid Feng /* 750ae76531SDavid Feng * do_bad_error handles the impossible case in the Error vector. 760ae76531SDavid Feng */ 770ae76531SDavid Feng void do_bad_error(struct pt_regs *pt_regs, unsigned int esr) 780ae76531SDavid Feng { 7964982915SAlexander Graf efi_restore_gd(); 800ae76531SDavid Feng printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr); 810ae76531SDavid Feng show_regs(pt_regs); 820ae76531SDavid Feng panic("Resetting CPU ...\n"); 830ae76531SDavid Feng } 840ae76531SDavid Feng 850ae76531SDavid Feng /* 860ae76531SDavid Feng * do_sync handles the Synchronous Abort exception. 870ae76531SDavid Feng */ 880ae76531SDavid Feng void do_sync(struct pt_regs *pt_regs, unsigned int esr) 890ae76531SDavid Feng { 9064982915SAlexander Graf efi_restore_gd(); 910ae76531SDavid Feng printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr); 920ae76531SDavid Feng show_regs(pt_regs); 930ae76531SDavid Feng panic("Resetting CPU ...\n"); 940ae76531SDavid Feng } 950ae76531SDavid Feng 96*fa40f8a0SJoseph Chen #ifndef CONFIG_IRQ 970ae76531SDavid Feng /* 980ae76531SDavid Feng * do_irq handles the Irq exception. 990ae76531SDavid Feng */ 1000ae76531SDavid Feng void do_irq(struct pt_regs *pt_regs, unsigned int esr) 1010ae76531SDavid Feng { 10264982915SAlexander Graf efi_restore_gd(); 1030ae76531SDavid Feng printf("\"Irq\" handler, esr 0x%08x\n", esr); 1040ae76531SDavid Feng show_regs(pt_regs); 1050ae76531SDavid Feng panic("Resetting CPU ...\n"); 1060ae76531SDavid Feng } 107*fa40f8a0SJoseph Chen #endif 1080ae76531SDavid Feng 1090ae76531SDavid Feng /* 1100ae76531SDavid Feng * do_fiq handles the Fiq exception. 1110ae76531SDavid Feng */ 1120ae76531SDavid Feng void do_fiq(struct pt_regs *pt_regs, unsigned int esr) 1130ae76531SDavid Feng { 11464982915SAlexander Graf efi_restore_gd(); 1150ae76531SDavid Feng printf("\"Fiq\" handler, esr 0x%08x\n", esr); 1160ae76531SDavid Feng show_regs(pt_regs); 1170ae76531SDavid Feng panic("Resetting CPU ...\n"); 1180ae76531SDavid Feng } 1190ae76531SDavid Feng 1200ae76531SDavid Feng /* 1210ae76531SDavid Feng * do_error handles the Error exception. 1220ae76531SDavid Feng * Errors are more likely to be processor specific, 1230ae76531SDavid Feng * it is defined with weak attribute and can be redefined 1240ae76531SDavid Feng * in processor specific code. 1250ae76531SDavid Feng */ 1260ae76531SDavid Feng void __weak do_error(struct pt_regs *pt_regs, unsigned int esr) 1270ae76531SDavid Feng { 12864982915SAlexander Graf efi_restore_gd(); 1290ae76531SDavid Feng printf("\"Error\" handler, esr 0x%08x\n", esr); 1300ae76531SDavid Feng show_regs(pt_regs); 1310ae76531SDavid Feng panic("Resetting CPU ...\n"); 1320ae76531SDavid Feng } 133