1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (c) 2016-17 Microsemi Corporation. 4 * Padmarao Begari, Microsemi Corporation <padmarao.begari@microsemi.com> 5 * 6 * Copyright (C) 2017 Andes Technology Corporation 7 * Rick Chen, Andes Technology Corporation <rick@andestech.com> 8 */ 9 10 #include <common.h> 11 #include <asm/ptrace.h> 12 #include <asm/system.h> 13 #include <asm/encoding.h> 14 15 static void _exit_trap(ulong code, ulong epc, struct pt_regs *regs); 16 17 int interrupt_init(void) 18 { 19 return 0; 20 } 21 22 /* 23 * enable interrupts 24 */ 25 void enable_interrupts(void) 26 { 27 } 28 29 /* 30 * disable interrupts 31 */ 32 int disable_interrupts(void) 33 { 34 return 0; 35 } 36 37 ulong handle_trap(ulong cause, ulong epc, struct pt_regs *regs) 38 { 39 ulong is_irq, irq; 40 41 is_irq = (cause & MCAUSE_INT); 42 irq = (cause & ~MCAUSE_INT); 43 44 if (is_irq) { 45 switch (irq) { 46 case IRQ_M_EXT: 47 case IRQ_S_EXT: 48 external_interrupt(0); /* handle external interrupt */ 49 break; 50 case IRQ_M_TIMER: 51 case IRQ_S_TIMER: 52 timer_interrupt(0); /* handle timer interrupt */ 53 break; 54 default: 55 _exit_trap(cause, epc, regs); 56 break; 57 }; 58 } else { 59 _exit_trap(cause, epc, regs); 60 } 61 62 return epc; 63 } 64 65 /* 66 *Entry Point for PLIC Interrupt Handler 67 */ 68 __attribute__((weak)) void external_interrupt(struct pt_regs *regs) 69 { 70 } 71 72 __attribute__((weak)) void timer_interrupt(struct pt_regs *regs) 73 { 74 } 75 76 static void _exit_trap(ulong code, ulong epc, struct pt_regs *regs) 77 { 78 static const char * const exception_code[] = { 79 "Instruction address misaligned", 80 "Instruction access fault", 81 "Illegal instruction", 82 "Breakpoint", 83 "Load address misaligned", 84 "Load access fault", 85 "Store/AMO address misaligned", 86 "Store/AMO access fault", 87 "Environment call from U-mode", 88 "Environment call from S-mode", 89 "Reserved", 90 "Environment call from M-mode", 91 "Instruction page fault", 92 "Load page fault", 93 "Reserved", 94 "Store/AMO page fault", 95 }; 96 97 if (code < ARRAY_SIZE(exception_code)) { 98 printf("exception code: %ld , %s , epc %lx , ra %lx\n", 99 code, exception_code[code], epc, regs->ra); 100 } else { 101 printf("Reserved\n"); 102 } 103 104 hang(); 105 } 106