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 | // SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2016-17 Microsemi Corporation. * Padmarao Begari, Microsemi Corporation <padmarao.begari@microsemi.com> * * Copyright (C) 2017 Andes Technology Corporation * Rick Chen, Andes Technology Corporation <rick@andestech.com> */ #include <common.h> #include <irq_func.h> #include <asm/ptrace.h> #include <asm/system.h> #include <asm/encoding.h> static void _exit_trap(ulong code, ulong epc, struct pt_regs *regs) { static const char * const exception_code[] = { "Instruction address misaligned", "Instruction access fault", "Illegal instruction", "Breakpoint", "Load address misaligned", "Load access fault", "Store/AMO address misaligned", "Store/AMO access fault", "Environment call from U-mode", "Environment call from S-mode", "Reserved", "Environment call from M-mode", "Instruction page fault", "Load page fault", "Reserved", "Store/AMO page fault", }; if (code < ARRAY_SIZE(exception_code)) { printf("exception code: %ld , %s , epc %lx , ra %lx\n", code, exception_code[code], epc, regs->ra); } else { printf("reserved exception code: %ld , epc %lx , ra %lx\n", code, epc, regs->ra); } hang(); } int interrupt_init(void) { return 0; } /* * enable interrupts */ void enable_interrupts(void) { } /* * disable interrupts */ int disable_interrupts(void) { return 0; } ulong handle_trap(ulong cause, ulong epc, struct pt_regs *regs) { ulong is_irq, irq; is_irq = (cause & MCAUSE_INT); irq = (cause & ~MCAUSE_INT); if (is_irq) { switch (irq) { case IRQ_M_EXT: case IRQ_S_EXT: external_interrupt(0); /* handle external interrupt */ break; case IRQ_M_TIMER: case IRQ_S_TIMER: timer_interrupt(0); /* handle timer interrupt */ break; default: _exit_trap(cause, epc, regs); break; }; } else { _exit_trap(cause, epc, regs); } return epc; } /* *Entry Point for PLIC Interrupt Handler */ __attribute__((weak)) void external_interrupt(struct pt_regs *regs) { } __attribute__((weak)) void timer_interrupt(struct pt_regs *regs) { } |