/*************************************************************************** * Copyright (c) 2024 Microsoft Corporation * * This program and the accompanying materials are made available under the * terms of the MIT License which is available at * https://opensource.org/licenses/MIT. * * SPDX-License-Identifier: MIT **************************************************************************/ .section .text .align 4 #include "tx_port.h" /**************************************************************************/ /* */ /* FUNCTION RELEASE */ /* */ /* trap_entry RISC-V64/GNU */ /* 6.2.1 */ /* AUTHOR */ /* */ /* Jer6y , luojun@oerv.isrc.iscas.ac.cn */ /* */ /* DESCRIPTION */ /* */ /* This function is responsible for riscv processor trap handle */ /* It will do the contex save and call c trap_handler and do contex */ /* load */ /* */ /* INPUT */ /* */ /* None */ /* */ /* OUTPUT */ /* */ /* None */ /* */ /* CALLS */ /* */ /* trap_handler */ /* */ /* CALLED BY */ /* */ /* hardware exception */ /* RELEASE HISTORY */ /* */ /* DATE NAME DESCRIPTION */ /* */ /* 10-25-2024 Jerry Luo */ /* */ /**************************************************************************/ /**************************************************************************/ /**************************************************************************/ /** */ /** ThreadX Component */ /** */ /** Initialize */ /** */ /**************************************************************************/ /**************************************************************************/ .global trap_entry .extern _tx_thread_context_restore trap_entry: #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double) addi sp, sp, -65*REGBYTES // Allocate space for all registers - with floating point enabled #else addi sp, sp, -32*REGBYTES // Allocate space for all registers - without floating point enabled #endif STORE x1, 28*REGBYTES(sp) // Store RA, 28*REGBYTES(because call will override ra [ra is a calle register in riscv]) call _tx_thread_context_save csrr a0, mcause csrr a1, mepc csrr a2, mtval addi sp, sp, -8 STORE ra, 0(sp) call trap_handler LOAD ra, 0(sp) addi sp, sp, 8 call _tx_thread_context_restore // it will nerver return .weak trap_handler trap_handler: 1: j 1b .section .text