| /* 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 |
| |
| ENTRY(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 |
| END(sifive_cip_453_page_fault_trp) |
| |
| ENTRY(sifive_cip_453_insn_fault_trp) |
| ADD_SIGN_EXT a0, t0, t1 |
| la t0, do_trap_insn_fault |
| jr t0 |
| END(sifive_cip_453_insn_fault_trp) |