mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-24 23:41:23 +01:00

In the only places this value is used, it duplicates mepc from struct sbi_trap_regs. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org>
66 lines
1.6 KiB
ArmAsm
66 lines
1.6 KiB
ArmAsm
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2020 Western Digital Corporation or its affiliates.
|
|
*
|
|
* Authors:
|
|
* Anup Patel <anup.patel@wdc.com>
|
|
*/
|
|
|
|
#include <sbi/riscv_asm.h>
|
|
#include <sbi/sbi_trap.h>
|
|
|
|
/*
|
|
* We assume that faulting instruction is 4-byte long and blindly
|
|
* increment SEPC by 4.
|
|
*
|
|
* The trap info will be saved as follows:
|
|
* A3 <- pointer struct sbi_trap_info
|
|
* A4 <- temporary
|
|
*/
|
|
|
|
.align 3
|
|
.global __sbi_expected_trap
|
|
__sbi_expected_trap:
|
|
/* Without H-extension so, MTVAL2 and MTINST CSRs and GVA not available */
|
|
csrr a4, CSR_MCAUSE
|
|
REG_S a4, SBI_TRAP_INFO_OFFSET(cause)(a3)
|
|
csrr a4, CSR_MTVAL
|
|
REG_S a4, SBI_TRAP_INFO_OFFSET(tval)(a3)
|
|
REG_S zero, SBI_TRAP_INFO_OFFSET(tval2)(a3)
|
|
REG_S zero, SBI_TRAP_INFO_OFFSET(tinst)(a3)
|
|
REG_S zero, SBI_TRAP_INFO_OFFSET(gva)(a3)
|
|
csrr a4, CSR_MEPC
|
|
addi a4, a4, 4
|
|
csrw CSR_MEPC, a4
|
|
mret
|
|
|
|
.align 3
|
|
.global __sbi_expected_trap_hext
|
|
__sbi_expected_trap_hext:
|
|
/* With H-extension so, MTVAL2 and MTINST CSRs and GVA available */
|
|
csrr a4, CSR_MCAUSE
|
|
REG_S a4, SBI_TRAP_INFO_OFFSET(cause)(a3)
|
|
csrr a4, CSR_MTVAL
|
|
REG_S a4, SBI_TRAP_INFO_OFFSET(tval)(a3)
|
|
csrr a4, CSR_MTVAL2
|
|
REG_S a4, SBI_TRAP_INFO_OFFSET(tval2)(a3)
|
|
csrr a4, CSR_MTINST
|
|
REG_S a4, SBI_TRAP_INFO_OFFSET(tinst)(a3)
|
|
|
|
/* Extract GVA bit from MSTATUS or MSTATUSH */
|
|
#if __riscv_xlen == 32
|
|
csrr a4, CSR_MSTATUSH
|
|
srli a4, a4, MSTATUSH_GVA_SHIFT
|
|
#else
|
|
csrr a4, CSR_MSTATUS
|
|
srli a4, a4, MSTATUS_GVA_SHIFT
|
|
#endif
|
|
andi a4, a4, 1
|
|
REG_S a4, SBI_TRAP_INFO_OFFSET(gva)(a3)
|
|
|
|
csrr a4, CSR_MEPC
|
|
addi a4, a4, 4
|
|
csrw CSR_MEPC, a4
|
|
mret
|