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> 10*64982915SAlexander Graf #include <efi_loader.h> 110ae76531SDavid Feng 120ae76531SDavid Feng 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 } 270ae76531SDavid Feng 280ae76531SDavid Feng void show_regs(struct pt_regs *regs) 290ae76531SDavid Feng { 300ae76531SDavid Feng int i; 310ae76531SDavid Feng 320ae76531SDavid Feng printf("ELR: %lx\n", regs->elr); 330ae76531SDavid Feng printf("LR: %lx\n", regs->regs[30]); 340ae76531SDavid Feng for (i = 0; i < 29; i += 2) 350ae76531SDavid Feng printf("x%-2d: %016lx x%-2d: %016lx\n", 360ae76531SDavid Feng i, regs->regs[i], i+1, regs->regs[i+1]); 370ae76531SDavid Feng printf("\n"); 380ae76531SDavid Feng } 390ae76531SDavid Feng 400ae76531SDavid Feng /* 410ae76531SDavid Feng * do_bad_sync handles the impossible case in the Synchronous Abort vector. 420ae76531SDavid Feng */ 430ae76531SDavid Feng void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr) 440ae76531SDavid Feng { 45*64982915SAlexander Graf efi_restore_gd(); 460ae76531SDavid Feng printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr); 470ae76531SDavid Feng show_regs(pt_regs); 480ae76531SDavid Feng panic("Resetting CPU ...\n"); 490ae76531SDavid Feng } 500ae76531SDavid Feng 510ae76531SDavid Feng /* 520ae76531SDavid Feng * do_bad_irq handles the impossible case in the Irq vector. 530ae76531SDavid Feng */ 540ae76531SDavid Feng void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr) 550ae76531SDavid Feng { 56*64982915SAlexander Graf efi_restore_gd(); 570ae76531SDavid Feng printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr); 580ae76531SDavid Feng show_regs(pt_regs); 590ae76531SDavid Feng panic("Resetting CPU ...\n"); 600ae76531SDavid Feng } 610ae76531SDavid Feng 620ae76531SDavid Feng /* 630ae76531SDavid Feng * do_bad_fiq handles the impossible case in the Fiq vector. 640ae76531SDavid Feng */ 650ae76531SDavid Feng void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr) 660ae76531SDavid Feng { 67*64982915SAlexander Graf efi_restore_gd(); 680ae76531SDavid Feng printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr); 690ae76531SDavid Feng show_regs(pt_regs); 700ae76531SDavid Feng panic("Resetting CPU ...\n"); 710ae76531SDavid Feng } 720ae76531SDavid Feng 730ae76531SDavid Feng /* 740ae76531SDavid Feng * do_bad_error handles the impossible case in the Error vector. 750ae76531SDavid Feng */ 760ae76531SDavid Feng void do_bad_error(struct pt_regs *pt_regs, unsigned int esr) 770ae76531SDavid Feng { 78*64982915SAlexander Graf efi_restore_gd(); 790ae76531SDavid Feng printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr); 800ae76531SDavid Feng show_regs(pt_regs); 810ae76531SDavid Feng panic("Resetting CPU ...\n"); 820ae76531SDavid Feng } 830ae76531SDavid Feng 840ae76531SDavid Feng /* 850ae76531SDavid Feng * do_sync handles the Synchronous Abort exception. 860ae76531SDavid Feng */ 870ae76531SDavid Feng void do_sync(struct pt_regs *pt_regs, unsigned int esr) 880ae76531SDavid Feng { 89*64982915SAlexander Graf efi_restore_gd(); 900ae76531SDavid Feng printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr); 910ae76531SDavid Feng show_regs(pt_regs); 920ae76531SDavid Feng panic("Resetting CPU ...\n"); 930ae76531SDavid Feng } 940ae76531SDavid Feng 950ae76531SDavid Feng /* 960ae76531SDavid Feng * do_irq handles the Irq exception. 970ae76531SDavid Feng */ 980ae76531SDavid Feng void do_irq(struct pt_regs *pt_regs, unsigned int esr) 990ae76531SDavid Feng { 100*64982915SAlexander Graf efi_restore_gd(); 1010ae76531SDavid Feng printf("\"Irq\" handler, esr 0x%08x\n", esr); 1020ae76531SDavid Feng show_regs(pt_regs); 1030ae76531SDavid Feng panic("Resetting CPU ...\n"); 1040ae76531SDavid Feng } 1050ae76531SDavid Feng 1060ae76531SDavid Feng /* 1070ae76531SDavid Feng * do_fiq handles the Fiq exception. 1080ae76531SDavid Feng */ 1090ae76531SDavid Feng void do_fiq(struct pt_regs *pt_regs, unsigned int esr) 1100ae76531SDavid Feng { 111*64982915SAlexander Graf efi_restore_gd(); 1120ae76531SDavid Feng printf("\"Fiq\" handler, esr 0x%08x\n", esr); 1130ae76531SDavid Feng show_regs(pt_regs); 1140ae76531SDavid Feng panic("Resetting CPU ...\n"); 1150ae76531SDavid Feng } 1160ae76531SDavid Feng 1170ae76531SDavid Feng /* 1180ae76531SDavid Feng * do_error handles the Error exception. 1190ae76531SDavid Feng * Errors are more likely to be processor specific, 1200ae76531SDavid Feng * it is defined with weak attribute and can be redefined 1210ae76531SDavid Feng * in processor specific code. 1220ae76531SDavid Feng */ 1230ae76531SDavid Feng void __weak do_error(struct pt_regs *pt_regs, unsigned int esr) 1240ae76531SDavid Feng { 125*64982915SAlexander Graf efi_restore_gd(); 1260ae76531SDavid Feng printf("\"Error\" handler, esr 0x%08x\n", esr); 1270ae76531SDavid Feng show_regs(pt_regs); 1280ae76531SDavid Feng panic("Resetting CPU ...\n"); 1290ae76531SDavid Feng } 130