162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2021 SiFive
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/linkage.h>
762306a36Sopenharmony_ci#include <asm/asm.h>
862306a36Sopenharmony_ci#include <asm/asm-offsets.h>
962306a36Sopenharmony_ci#include <asm/alternative.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci.macro ADD_SIGN_EXT pt_reg badaddr tmp_reg
1262306a36Sopenharmony_ci	REG_L \badaddr, PT_BADADDR(\pt_reg)
1362306a36Sopenharmony_ci	li \tmp_reg,1
1462306a36Sopenharmony_ci	slli \tmp_reg,\tmp_reg,0x26
1562306a36Sopenharmony_ci	and \tmp_reg,\tmp_reg,\badaddr
1662306a36Sopenharmony_ci	beqz \tmp_reg, 1f
1762306a36Sopenharmony_ci	li \tmp_reg,-1
1862306a36Sopenharmony_ci	slli \tmp_reg,\tmp_reg,0x27
1962306a36Sopenharmony_ci	or \badaddr,\tmp_reg,\badaddr
2062306a36Sopenharmony_ci	REG_S \badaddr, PT_BADADDR(\pt_reg)
2162306a36Sopenharmony_ci1:
2262306a36Sopenharmony_ci.endm
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ciENTRY(sifive_cip_453_page_fault_trp)
2562306a36Sopenharmony_ci	ADD_SIGN_EXT a0, t0, t1
2662306a36Sopenharmony_ci#ifdef CONFIG_MMU
2762306a36Sopenharmony_ci	la t0, do_page_fault
2862306a36Sopenharmony_ci#else
2962306a36Sopenharmony_ci	la t0, do_trap_unknown
3062306a36Sopenharmony_ci#endif
3162306a36Sopenharmony_ci	jr t0
3262306a36Sopenharmony_ciEND(sifive_cip_453_page_fault_trp)
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciENTRY(sifive_cip_453_insn_fault_trp)
3562306a36Sopenharmony_ci	ADD_SIGN_EXT a0, t0, t1
3662306a36Sopenharmony_ci	la t0, do_trap_insn_fault
3762306a36Sopenharmony_ci	jr t0
3862306a36Sopenharmony_ciEND(sifive_cip_453_insn_fault_trp)
39