diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/sbi/riscv_encoding.h | 34 | ||||
| -rw-r--r-- | include/sbi/sbi_illegal_atomic.h | 17 | ||||
| -rw-r--r-- | include/sbi/sbi_illegal_insn.h | 4 |
3 files changed, 41 insertions, 14 deletions
diff --git a/include/sbi/riscv_encoding.h b/include/sbi/riscv_encoding.h index 2082783c..e1256e31 100644 --- a/include/sbi/riscv_encoding.h +++ b/include/sbi/riscv_encoding.h @@ -986,13 +986,14 @@ #define INSN_MATCH_VS4RV 0x62800027 #define INSN_MATCH_VS8RV 0xe2800027 -#define INSN_MASK_VECTOR_LOAD_STORE 0x7f -#define INSN_MATCH_VECTOR_LOAD 0x07 -#define INSN_MATCH_VECTOR_STORE 0x27 +#define INSN_OPCODE_MASK 0x7f +#define INSN_OPCODE_VECTOR_LOAD 0x07 +#define INSN_OPCODE_VECTOR_STORE 0x27 +#define INSN_OPCODE_AMO 0x2f #define IS_VECTOR_LOAD_STORE(insn) \ - ((((insn) & INSN_MASK_VECTOR_LOAD_STORE) == INSN_MATCH_VECTOR_LOAD) || \ - (((insn) & INSN_MASK_VECTOR_LOAD_STORE) == INSN_MATCH_VECTOR_STORE)) + ((((insn) & INSN_OPCODE_MASK) == INSN_OPCODE_VECTOR_LOAD) || \ + (((insn) & INSN_OPCODE_MASK) == INSN_OPCODE_VECTOR_STORE)) #define IS_VECTOR_INSN_MATCH(insn, match, mask) \ (((insn) & (mask)) == ((match) & (mask))) @@ -1286,6 +1287,17 @@ #error "Unexpected __riscv_xlen" #endif +#define MASK_FUNCT3 0x7000 +#define SHIFT_FUNCT3 12 + +#define MASK_RS1 0xf8000 + +#define MASK_CSR 0xfff00000 +#define SHIFT_CSR 20 + +#define MASK_AQRL 0x06000000 +#define SHIFT_AQRL 25 + #define VM_MASK 0x1 #define VIEW_MASK 0x3 #define VSEW_MASK 0x3 @@ -1353,10 +1365,11 @@ #define REG_PTR(insn, pos, regs) \ (ulong *)((ulong)(regs) + REG_OFFSET(insn, pos)) -#define GET_RM(insn) ((insn & MASK_FUNCT3) >> SHIFT_FUNCT3) - +#define GET_FUNC3(insn) ((insn & MASK_FUNCT3) >> SHIFT_FUNCT3) +#define GET_RM(insn) GET_FUNC3(insn) #define GET_RS1_NUM(insn) ((insn & MASK_RS1) >> 15) #define GET_CSR_NUM(insn) ((insn & MASK_CSR) >> SHIFT_CSR) +#define GET_AQRL(insn) ((insn & MASK_AQRL) >> SHIFT_AQRL) #define GET_RS1(insn, regs) (*REG_PTR(insn, SH_RS1, regs)) #define GET_RS2(insn, regs) (*REG_PTR(insn, SH_RS2, regs)) @@ -1381,13 +1394,6 @@ #define GET_VEMUL(vlmul, view, vsew) ((vlmul + view - vsew) & 7) #define GET_EMUL(vemul) (1UL << ((vemul) >= 4 ? 0 : (vemul))) -#define MASK_FUNCT3 0x7000 -#define MASK_RS1 0xf8000 -#define MASK_CSR 0xfff00000 - -#define SHIFT_FUNCT3 12 -#define SHIFT_CSR 20 - #define CSRRW 1 #define CSRRS 2 #define CSRRC 3 diff --git a/include/sbi/sbi_illegal_atomic.h b/include/sbi/sbi_illegal_atomic.h new file mode 100644 index 00000000..e25ecadf --- /dev/null +++ b/include/sbi/sbi_illegal_atomic.h @@ -0,0 +1,17 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2025 MIPS + * + */ + +#ifndef __SBI_ILLEGAL_ATOMIC_H__ +#define __SBI_ILLEGAL_ATOMIC_H__ + +#include <sbi/sbi_types.h> + +struct sbi_trap_regs; + +int sbi_illegal_atomic(ulong insn, struct sbi_trap_regs *regs); + +#endif diff --git a/include/sbi/sbi_illegal_insn.h b/include/sbi/sbi_illegal_insn.h index 7be72ac0..5732e3cd 100644 --- a/include/sbi/sbi_illegal_insn.h +++ b/include/sbi/sbi_illegal_insn.h @@ -14,6 +14,10 @@ struct sbi_trap_context; +typedef int (*illegal_insn_func)(ulong insn, struct sbi_trap_regs *regs); + +int truly_illegal_insn(ulong insn, struct sbi_trap_regs *regs); + int sbi_illegal_insn_handler(struct sbi_trap_context *tcntx); #endif |
