diff options
author | Anup Patel <anup.patel@wdc.com> | 2019-01-14 12:30:15 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2019-01-16 08:55:25 +0300 |
commit | 3298251f0c56b556a8f53632e46020861a2f4f8a (patch) | |
tree | 16d1e6e0401db57b2d4dac3f9e1fd62e903c7e34 | |
parent | 4485b5cba86a2488c326c0dee9a1fec2d788b6e8 (diff) | |
download | opensbi-3298251f0c56b556a8f53632e46020861a2f4f8a.tar.xz |
include: Add documentation for sbi_trap_regs and friends
This patch adds doxygen style documentation for struct sbi_trap_regs
and related macros/defines/functions.
Signed-off-by: Anup Patel <anup.patel@wdc.com>
-rw-r--r-- | include/sbi/sbi_scratch.h | 2 | ||||
-rw-r--r-- | include/sbi/sbi_trap.h | 74 | ||||
-rw-r--r-- | lib/sbi_init.c | 3 | ||||
-rw-r--r-- | lib/sbi_trap.c | 34 |
4 files changed, 106 insertions, 7 deletions
diff --git a/include/sbi/sbi_scratch.h b/include/sbi/sbi_scratch.h index ace1a0d..562f7bb 100644 --- a/include/sbi/sbi_scratch.h +++ b/include/sbi/sbi_scratch.h @@ -57,7 +57,7 @@ struct sbi_scratch { unsigned long hartid_to_scratch; /** IPI type (or flags) */ unsigned long ipi_type; -} __attribute__((packed)); +} __packed; /** Get pointer to sbi_scratch for current HART */ #define sbi_scratch_thishart_ptr() \ diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h index 67f7f38..ab94d19 100644 --- a/include/sbi/sbi_trap.h +++ b/include/sbi/sbi_trap.h @@ -10,86 +10,158 @@ #ifndef __SBI_TRAP_H__ #define __SBI_TRAP_H__ +/** 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 +/** 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; -} __attribute__((packed)); +} __packed; struct sbi_scratch; diff --git a/lib/sbi_init.c b/lib/sbi_init.c index b0d4494..b92c1fd 100644 --- a/lib/sbi_init.c +++ b/lib/sbi_init.c @@ -146,7 +146,8 @@ static atomic_t coldboot_lottery = ATOMIC_INITIALIZER(0); * The function expects following: * 1. The 'mscratch' CSR is pointing to sbi_scratch of current HART * 2. Stack pointer (SP) is setup for current HART - * 3. All interrupts are disabled in MIE CSR except MSIP + * 3. Interrupts are disabled in MSTATUS CSR + * 4. All interrupts are disabled in MIE CSR except MSIP * * @param scratch pointer to sbi_scratch of current HART */ diff --git a/lib/sbi_trap.c b/lib/sbi_trap.c index 0e731e4..9f212c1 100644 --- a/lib/sbi_trap.c +++ b/lib/sbi_trap.c @@ -19,10 +19,10 @@ #include <sbi/sbi_timer.h> #include <sbi/sbi_trap.h> -static void __attribute__((noreturn)) sbi_trap_error(const char *msg, - int rc, u32 hartid, - ulong mcause, ulong mtval, - struct sbi_trap_regs *regs) +static void __noreturn sbi_trap_error(const char *msg, + int rc, u32 hartid, + ulong mcause, ulong mtval, + struct sbi_trap_regs *regs) { sbi_printf("%s: hart%d: %s (error %d)\n", __func__, hartid, msg, rc); @@ -66,6 +66,17 @@ static void __attribute__((noreturn)) sbi_trap_error(const char *msg, sbi_hart_hang(); } +/** + * Redirect trap to lower privledge mode (S-mode or U-mode) + * + * @param regs pointer to register state + * @param scratch pointer to sbi_scratch of current HART + * @param epc error PC for lower privledge mode + * @param cause exception cause for lower privledge mode + * @param tval trap value for lower privledge mode + * + * Returns 0 on success and error code (< 0) on failure + */ int sbi_trap_redirect(struct sbi_trap_regs *regs, struct sbi_scratch *scratch, ulong epc, ulong cause, ulong tval) @@ -109,6 +120,21 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs, return 0; } +/** + * Handle trap/interrupt + * + * This function is called by firmware linked to OpenSBI + * library for handling trap/interrupt. It expects the + * following: + * 1. The 'mscratch' CSR is pointing to sbi_scratch of current HART + * 2. The 'mcause' CSR is having exception/interrupt cause + * 3. The 'mtval' CSR is having additional trap information + * 4. Stack pointer (SP) is setup for current HART + * 5. Interrupts are disabled in MSTATUS CSR + * + * @param regs pointer to register state + * @param scratch pointer to sbi_scratch of current HART + */ void sbi_trap_handler(struct sbi_trap_regs *regs, struct sbi_scratch *scratch) { |