123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- /* SPDX-License-Identifier: GPL-2.0-or-later */
- /**
- ******************************************************************************
- * @file trap.c
- * @author StarFive Technology
- * @version V1.0
- * @date 06/25/2020
- * @brief
- ******************************************************************************
- * @copy
- *
- * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
- * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
- * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
- * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
- * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
- * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
- *
- * COPYRIGHT 2020 Shanghai StarFive Technology Co., Ltd.
- */
- #include "encoding.h"
- #include "uart.h"
- #include "comdef.h"
- #if __riscv_xlen == 32
- #define MCAUSE_INT 0x80000000UL
- #define MCAUSE_CAUSE 0x000003FFUL
- #else
- #define MCAUSE_INT 0x8000000000000000UL
- #define MCAUSE_CAUSE 0x00000000000003FFUL
- #endif
- uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc)
- {
- #if 0
- if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) {
- rlSendString("extern interrupt.\n");
- } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){
- rlSendString("timer interrupt.\n");
- } else if (mcause & MCAUSE_INT) {
- rlSendString("local interrupt.\n");
- }
- else {
- rlSendString("unhandle trap.\n");
- }
- #endif
- printk("trap mcause:0x%x epc:0x%x\n",mcause,epc);
- return epc;
- }
- void trap_entry(void)
- {
- unsigned long mcause = read_csr(mcause);
- unsigned long mepc = read_csr(mepc);
- handle_trap(mcause, mepc);
- }
|