aboutsummaryrefslogtreecommitdiffstats
path: root/roms/opensbi/include/sbi/sbi_trap.h
diff options
context:
space:
mode:
Diffstat (limited to 'roms/opensbi/include/sbi/sbi_trap.h')
-rw-r--r--roms/opensbi/include/sbi/sbi_trap.h214
1 files changed, 214 insertions, 0 deletions
diff --git a/roms/opensbi/include/sbi/sbi_trap.h b/roms/opensbi/include/sbi/sbi_trap.h
new file mode 100644
index 000000000..5fb94f980
--- /dev/null
+++ b/roms/opensbi/include/sbi/sbi_trap.h
@@ -0,0 +1,214 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2019 Western Digital Corporation or its affiliates.
+ *
+ * Authors:
+ * Anup Patel <anup.patel@wdc.com>
+ */
+
+#ifndef __SBI_TRAP_H__
+#define __SBI_TRAP_H__
+
+/* clang-format off */
+
+/** Index of zero member in sbi_trap_regs */
+#define SBI_TRAP_REGS_zero 0
+/** Index of ra member in sbi_trap_regs */
+#define SBI_TRAP_REGS_ra 1
+/** Index of sp member in sbi_trap_regs */
+#define SBI_TRAP_REGS_sp 2
+/** Index of gp member in sbi_trap_regs */
+#define SBI_TRAP_REGS_gp 3
+/** Index of tp member in sbi_trap_regs */
+#define SBI_TRAP_REGS_tp 4
+/** Index of t0 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_t0 5
+/** Index of t1 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_t1 6
+/** Index of t2 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_t2 7
+/** Index of s0 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s0 8
+/** Index of s1 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s1 9
+/** Index of a0 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_a0 10
+/** Index of a1 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_a1 11
+/** Index of a2 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_a2 12
+/** Index of a3 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_a3 13
+/** Index of a4 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_a4 14
+/** Index of a5 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_a5 15
+/** Index of a6 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_a6 16
+/** Index of a7 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_a7 17
+/** Index of s2 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s2 18
+/** Index of s3 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s3 19
+/** Index of s4 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s4 20
+/** Index of s5 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s5 21
+/** Index of s6 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s6 22
+/** Index of s7 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s7 23
+/** Index of s8 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s8 24
+/** Index of s9 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s9 25
+/** Index of s10 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s10 26
+/** Index of s11 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_s11 27
+/** Index of t3 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_t3 28
+/** Index of t4 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_t4 29
+/** Index of t5 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_t5 30
+/** Index of t6 member in sbi_trap_regs */
+#define SBI_TRAP_REGS_t6 31
+/** Index of mepc member in sbi_trap_regs */
+#define SBI_TRAP_REGS_mepc 32
+/** Index of mstatus member in sbi_trap_regs */
+#define SBI_TRAP_REGS_mstatus 33
+/** Index of mstatusH member in sbi_trap_regs */
+#define SBI_TRAP_REGS_mstatusH 34
+/** Last member index in sbi_trap_regs */
+#define SBI_TRAP_REGS_last 35
+
+/** Index of epc member in sbi_trap_info */
+#define SBI_TRAP_INFO_epc 0
+/** Index of cause member in sbi_trap_info */
+#define SBI_TRAP_INFO_cause 1
+/** Index of tval member in sbi_trap_info */
+#define SBI_TRAP_INFO_tval 2
+/** Index of tval2 member in sbi_trap_info */
+#define SBI_TRAP_INFO_tval2 3
+/** Index of tinst member in sbi_trap_info */
+#define SBI_TRAP_INFO_tinst 4
+/** Last member index in sbi_trap_info */
+#define SBI_TRAP_INFO_last 5
+
+/* clang-format on */
+
+/** Get offset of member with name 'x' in sbi_trap_regs */
+#define SBI_TRAP_REGS_OFFSET(x) ((SBI_TRAP_REGS_##x) * __SIZEOF_POINTER__)
+/** Size (in bytes) of sbi_trap_regs */
+#define SBI_TRAP_REGS_SIZE SBI_TRAP_REGS_OFFSET(last)
+
+/** Get offset of member with name 'x' in sbi_trap_info */
+#define SBI_TRAP_INFO_OFFSET(x) ((SBI_TRAP_INFO_##x) * __SIZEOF_POINTER__)
+/** Size (in bytes) of sbi_trap_info */
+#define SBI_TRAP_INFO_SIZE SBI_TRAP_INFO_OFFSET(last)
+
+#ifndef __ASSEMBLY__
+
+#include <sbi/sbi_types.h>
+
+/** Representation of register state at time of trap/interrupt */
+struct sbi_trap_regs {
+ /** zero register state */
+ unsigned long zero;
+ /** ra register state */
+ unsigned long ra;
+ /** sp register state */
+ unsigned long sp;
+ /** gp register state */
+ unsigned long gp;
+ /** tp register state */
+ unsigned long tp;
+ /** t0 register state */
+ unsigned long t0;
+ /** t1 register state */
+ unsigned long t1;
+ /** t2 register state */
+ unsigned long t2;
+ /** s0 register state */
+ unsigned long s0;
+ /** s1 register state */
+ unsigned long s1;
+ /** a0 register state */
+ unsigned long a0;
+ /** a1 register state */
+ unsigned long a1;
+ /** a2 register state */
+ unsigned long a2;
+ /** a3 register state */
+ unsigned long a3;
+ /** a4 register state */
+ unsigned long a4;
+ /** a5 register state */
+ unsigned long a5;
+ /** a6 register state */
+ unsigned long a6;
+ /** a7 register state */
+ unsigned long a7;
+ /** s2 register state */
+ unsigned long s2;
+ /** s3 register state */
+ unsigned long s3;
+ /** s4 register state */
+ unsigned long s4;
+ /** s5 register state */
+ unsigned long s5;
+ /** s6 register state */
+ unsigned long s6;
+ /** s7 register state */
+ unsigned long s7;
+ /** s8 register state */
+ unsigned long s8;
+ /** s9 register state */
+ unsigned long s9;
+ /** s10 register state */
+ unsigned long s10;
+ /** s11 register state */
+ unsigned long s11;
+ /** t3 register state */
+ unsigned long t3;
+ /** t4 register state */
+ unsigned long t4;
+ /** t5 register state */
+ unsigned long t5;
+ /** t6 register state */
+ unsigned long t6;
+ /** mepc register state */
+ unsigned long mepc;
+ /** mstatus register state */
+ unsigned long mstatus;
+ /** mstatusH register state (only for 32-bit) */
+ unsigned long mstatusH;
+};
+
+/** Representation of trap details */
+struct sbi_trap_info {
+ /** epc Trap program counter */
+ unsigned long epc;
+ /** cause Trap exception cause */
+ unsigned long cause;
+ /** tval Trap value */
+ unsigned long tval;
+ /** tval2 Trap value 2 */
+ unsigned long tval2;
+ /** tinst Trap instruction */
+ unsigned long tinst;
+};
+
+int sbi_trap_redirect(struct sbi_trap_regs *regs,
+ struct sbi_trap_info *trap);
+
+void sbi_trap_handler(struct sbi_trap_regs *regs);
+
+void __noreturn sbi_trap_exit(const struct sbi_trap_regs *regs);
+
+#endif
+
+#endif