root/arch/riscv/errata/sifive/errata_cip_453.S
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2021 SiFive
 */

#include <linux/linkage.h>
#include <asm/asm.h>
#include <asm/asm-offsets.h>
#include <asm/alternative.h>

.macro ADD_SIGN_EXT pt_reg badaddr tmp_reg
        REG_L \badaddr, PT_BADADDR(\pt_reg)
        li \tmp_reg,1
        slli \tmp_reg,\tmp_reg,0x26
        and \tmp_reg,\tmp_reg,\badaddr
        beqz \tmp_reg, 1f
        li \tmp_reg,-1
        slli \tmp_reg,\tmp_reg,0x27
        or \badaddr,\tmp_reg,\badaddr
        REG_S \badaddr, PT_BADADDR(\pt_reg)
1:
.endm

SYM_FUNC_START(sifive_cip_453_page_fault_trp)
        ADD_SIGN_EXT a0, t0, t1
#ifdef CONFIG_MMU
        la t0, do_page_fault
#else
        la t0, do_trap_unknown
#endif
        jr t0
SYM_FUNC_END(sifive_cip_453_page_fault_trp)

SYM_FUNC_START(sifive_cip_453_insn_fault_trp)
        ADD_SIGN_EXT a0, t0, t1
        la t0, do_trap_insn_fault
        jr t0
SYM_FUNC_END(sifive_cip_453_insn_fault_trp)