blob: b55b6656a87786e7f09da2bf7edc2b35429364e7 [file] [log] [blame]
/* Copyright 2019 SiFive, Inc */
/* SPDX-License-Identifier: Apache-2.0 */
#define METAL_MSTATUS_MIE_SHIFT 8
#define METAL_MSTATUS_MPP_M 3
#define METAL_MSTATUS_MPP_SHIFT 11
#define METAL_MTVEC_MODE_MASK 3
/* void _metal_trap(int ecode)
*
* Trigger a machine-mode trap with exception code ecode
*/
.global _metal_trap
.type _metal_trap, @function
_metal_trap:
/* Store the instruction which called _metal_trap in mepc */
addi t0, ra, -1
csrw mepc, t0
/* Set mcause to the desired exception code */
csrw mcause, a0
/* Read mstatus */
csrr t0, mstatus
/* Set MIE=0 */
li t1, -1
xori t1, t1, METAL_MSTATUS_MIE_SHIFT
and t0, t0, t1
/* Set MPP=M */
li t1, METAL_MSTATUS_MPP_M
slli t1, t1, METAL_MSTATUS_MPP_SHIFT
or t0, t0, t1
/* Write mstatus */
csrw mstatus, t0
/* Read mtvec */
csrr t0, mtvec
/*
* Mask the mtvec MODE bits
* Exceptions always jump to mtvec.BASE regradless of the vectoring mode.
*/
andi t0, t0, METAL_MTVEC_MODE_MASK
/* Jump to mtvec */
jr t0