123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- /*
- * 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 __ASSEMBLER__
- #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);
- struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs);
- void __noreturn sbi_trap_exit(const struct sbi_trap_regs *regs);
- #endif
- #endif
|