123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- /*
- * 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
- /** Last member index in sbi_trap_regs */
- #define SBI_TRAP_REGS_last 34
- /* 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)
- #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;
- } __packed;
- struct sbi_scratch;
- int sbi_trap_redirect(struct sbi_trap_regs *regs, struct sbi_scratch *scratch,
- ulong epc, ulong cause, ulong tval);
- void sbi_trap_handler(struct sbi_trap_regs *regs, struct sbi_scratch *scratch);
- #endif
- #endif
|