forked from Mirrors/opensbi
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>
This commit is contained in:
@@ -57,7 +57,7 @@ struct sbi_scratch {
|
|||||||
unsigned long hartid_to_scratch;
|
unsigned long hartid_to_scratch;
|
||||||
/** IPI type (or flags) */
|
/** IPI type (or flags) */
|
||||||
unsigned long ipi_type;
|
unsigned long ipi_type;
|
||||||
} __attribute__((packed));
|
} __packed;
|
||||||
|
|
||||||
/** Get pointer to sbi_scratch for current HART */
|
/** Get pointer to sbi_scratch for current HART */
|
||||||
#define sbi_scratch_thishart_ptr() \
|
#define sbi_scratch_thishart_ptr() \
|
||||||
|
@@ -10,86 +10,158 @@
|
|||||||
#ifndef __SBI_TRAP_H__
|
#ifndef __SBI_TRAP_H__
|
||||||
#define __SBI_TRAP_H__
|
#define __SBI_TRAP_H__
|
||||||
|
|
||||||
|
/** Index of zero member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_zero 0
|
#define SBI_TRAP_REGS_zero 0
|
||||||
|
/** Index of ra member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_ra 1
|
#define SBI_TRAP_REGS_ra 1
|
||||||
|
/** Index of sp member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_sp 2
|
#define SBI_TRAP_REGS_sp 2
|
||||||
|
/** Index of gp member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_gp 3
|
#define SBI_TRAP_REGS_gp 3
|
||||||
|
/** Index of tp member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_tp 4
|
#define SBI_TRAP_REGS_tp 4
|
||||||
|
/** Index of t0 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_t0 5
|
#define SBI_TRAP_REGS_t0 5
|
||||||
|
/** Index of t1 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_t1 6
|
#define SBI_TRAP_REGS_t1 6
|
||||||
|
/** Index of t2 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_t2 7
|
#define SBI_TRAP_REGS_t2 7
|
||||||
|
/** Index of s0 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s0 8
|
#define SBI_TRAP_REGS_s0 8
|
||||||
|
/** Index of s1 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s1 9
|
#define SBI_TRAP_REGS_s1 9
|
||||||
|
/** Index of a0 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_a0 10
|
#define SBI_TRAP_REGS_a0 10
|
||||||
|
/** Index of a1 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_a1 11
|
#define SBI_TRAP_REGS_a1 11
|
||||||
|
/** Index of a2 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_a2 12
|
#define SBI_TRAP_REGS_a2 12
|
||||||
|
/** Index of a3 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_a3 13
|
#define SBI_TRAP_REGS_a3 13
|
||||||
|
/** Index of a4 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_a4 14
|
#define SBI_TRAP_REGS_a4 14
|
||||||
|
/** Index of a5 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_a5 15
|
#define SBI_TRAP_REGS_a5 15
|
||||||
|
/** Index of a6 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_a6 16
|
#define SBI_TRAP_REGS_a6 16
|
||||||
|
/** Index of a7 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_a7 17
|
#define SBI_TRAP_REGS_a7 17
|
||||||
|
/** Index of s2 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s2 18
|
#define SBI_TRAP_REGS_s2 18
|
||||||
|
/** Index of s3 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s3 19
|
#define SBI_TRAP_REGS_s3 19
|
||||||
|
/** Index of s4 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s4 20
|
#define SBI_TRAP_REGS_s4 20
|
||||||
|
/** Index of s5 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s5 21
|
#define SBI_TRAP_REGS_s5 21
|
||||||
|
/** Index of s6 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s6 22
|
#define SBI_TRAP_REGS_s6 22
|
||||||
|
/** Index of s7 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s7 23
|
#define SBI_TRAP_REGS_s7 23
|
||||||
|
/** Index of s8 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s8 24
|
#define SBI_TRAP_REGS_s8 24
|
||||||
|
/** Index of s9 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s9 25
|
#define SBI_TRAP_REGS_s9 25
|
||||||
|
/** Index of s10 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s10 26
|
#define SBI_TRAP_REGS_s10 26
|
||||||
|
/** Index of s11 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_s11 27
|
#define SBI_TRAP_REGS_s11 27
|
||||||
|
/** Index of t3 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_t3 28
|
#define SBI_TRAP_REGS_t3 28
|
||||||
|
/** Index of t4 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_t4 29
|
#define SBI_TRAP_REGS_t4 29
|
||||||
|
/** Index of t5 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_t5 30
|
#define SBI_TRAP_REGS_t5 30
|
||||||
|
/** Index of t6 member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_t6 31
|
#define SBI_TRAP_REGS_t6 31
|
||||||
|
/** Index of mepc member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_mepc 32
|
#define SBI_TRAP_REGS_mepc 32
|
||||||
|
/** Index of mstatus member in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_mstatus 33
|
#define SBI_TRAP_REGS_mstatus 33
|
||||||
|
/** Last member index in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_last 34
|
#define SBI_TRAP_REGS_last 34
|
||||||
|
|
||||||
|
/** Get offset of member with name 'x' in sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_OFFSET(x) \
|
#define SBI_TRAP_REGS_OFFSET(x) \
|
||||||
((SBI_TRAP_REGS_##x) * __SIZEOF_POINTER__)
|
((SBI_TRAP_REGS_##x) * __SIZEOF_POINTER__)
|
||||||
|
/** Size (in bytes) of sbi_trap_regs */
|
||||||
#define SBI_TRAP_REGS_SIZE SBI_TRAP_REGS_OFFSET(last)
|
#define SBI_TRAP_REGS_SIZE SBI_TRAP_REGS_OFFSET(last)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <sbi/sbi_types.h>
|
#include <sbi/sbi_types.h>
|
||||||
|
|
||||||
|
/** Representation of register state at time of trap/interrupt */
|
||||||
struct sbi_trap_regs {
|
struct sbi_trap_regs {
|
||||||
|
/** zero register state */
|
||||||
unsigned long zero;
|
unsigned long zero;
|
||||||
|
/** ra register state */
|
||||||
unsigned long ra;
|
unsigned long ra;
|
||||||
|
/** sp register state */
|
||||||
unsigned long sp;
|
unsigned long sp;
|
||||||
|
/** gp register state */
|
||||||
unsigned long gp;
|
unsigned long gp;
|
||||||
|
/** tp register state */
|
||||||
unsigned long tp;
|
unsigned long tp;
|
||||||
|
/** t0 register state */
|
||||||
unsigned long t0;
|
unsigned long t0;
|
||||||
|
/** t1 register state */
|
||||||
unsigned long t1;
|
unsigned long t1;
|
||||||
|
/** t2 register state */
|
||||||
unsigned long t2;
|
unsigned long t2;
|
||||||
|
/** s0 register state */
|
||||||
unsigned long s0;
|
unsigned long s0;
|
||||||
|
/** s1 register state */
|
||||||
unsigned long s1;
|
unsigned long s1;
|
||||||
|
/** a0 register state */
|
||||||
unsigned long a0;
|
unsigned long a0;
|
||||||
|
/** a1 register state */
|
||||||
unsigned long a1;
|
unsigned long a1;
|
||||||
|
/** a2 register state */
|
||||||
unsigned long a2;
|
unsigned long a2;
|
||||||
|
/** a3 register state */
|
||||||
unsigned long a3;
|
unsigned long a3;
|
||||||
|
/** a4 register state */
|
||||||
unsigned long a4;
|
unsigned long a4;
|
||||||
|
/** a5 register state */
|
||||||
unsigned long a5;
|
unsigned long a5;
|
||||||
|
/** a6 register state */
|
||||||
unsigned long a6;
|
unsigned long a6;
|
||||||
|
/** a7 register state */
|
||||||
unsigned long a7;
|
unsigned long a7;
|
||||||
|
/** s2 register state */
|
||||||
unsigned long s2;
|
unsigned long s2;
|
||||||
|
/** s3 register state */
|
||||||
unsigned long s3;
|
unsigned long s3;
|
||||||
|
/** s4 register state */
|
||||||
unsigned long s4;
|
unsigned long s4;
|
||||||
|
/** s5 register state */
|
||||||
unsigned long s5;
|
unsigned long s5;
|
||||||
|
/** s6 register state */
|
||||||
unsigned long s6;
|
unsigned long s6;
|
||||||
|
/** s7 register state */
|
||||||
unsigned long s7;
|
unsigned long s7;
|
||||||
|
/** s8 register state */
|
||||||
unsigned long s8;
|
unsigned long s8;
|
||||||
|
/** s9 register state */
|
||||||
unsigned long s9;
|
unsigned long s9;
|
||||||
|
/** s10 register state */
|
||||||
unsigned long s10;
|
unsigned long s10;
|
||||||
|
/** s11 register state */
|
||||||
unsigned long s11;
|
unsigned long s11;
|
||||||
|
/** t3 register state */
|
||||||
unsigned long t3;
|
unsigned long t3;
|
||||||
|
/** t4 register state */
|
||||||
unsigned long t4;
|
unsigned long t4;
|
||||||
|
/** t5 register state */
|
||||||
unsigned long t5;
|
unsigned long t5;
|
||||||
|
/** t6 register state */
|
||||||
unsigned long t6;
|
unsigned long t6;
|
||||||
|
/** mepc register state */
|
||||||
unsigned long mepc;
|
unsigned long mepc;
|
||||||
|
/** mstatus register state */
|
||||||
unsigned long mstatus;
|
unsigned long mstatus;
|
||||||
} __attribute__((packed));
|
} __packed;
|
||||||
|
|
||||||
struct sbi_scratch;
|
struct sbi_scratch;
|
||||||
|
|
||||||
|
@@ -146,7 +146,8 @@ static atomic_t coldboot_lottery = ATOMIC_INITIALIZER(0);
|
|||||||
* The function expects following:
|
* The function expects following:
|
||||||
* 1. The 'mscratch' CSR is pointing to sbi_scratch of current HART
|
* 1. The 'mscratch' CSR is pointing to sbi_scratch of current HART
|
||||||
* 2. Stack pointer (SP) is setup for 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
|
* @param scratch pointer to sbi_scratch of current HART
|
||||||
*/
|
*/
|
||||||
|
@@ -19,10 +19,10 @@
|
|||||||
#include <sbi/sbi_timer.h>
|
#include <sbi/sbi_timer.h>
|
||||||
#include <sbi/sbi_trap.h>
|
#include <sbi/sbi_trap.h>
|
||||||
|
|
||||||
static void __attribute__((noreturn)) sbi_trap_error(const char *msg,
|
static void __noreturn sbi_trap_error(const char *msg,
|
||||||
int rc, u32 hartid,
|
int rc, u32 hartid,
|
||||||
ulong mcause, ulong mtval,
|
ulong mcause, ulong mtval,
|
||||||
struct sbi_trap_regs *regs)
|
struct sbi_trap_regs *regs)
|
||||||
{
|
{
|
||||||
sbi_printf("%s: hart%d: %s (error %d)\n",
|
sbi_printf("%s: hart%d: %s (error %d)\n",
|
||||||
__func__, hartid, msg, rc);
|
__func__, hartid, msg, rc);
|
||||||
@@ -66,6 +66,17 @@ static void __attribute__((noreturn)) sbi_trap_error(const char *msg,
|
|||||||
sbi_hart_hang();
|
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,
|
int sbi_trap_redirect(struct sbi_trap_regs *regs,
|
||||||
struct sbi_scratch *scratch,
|
struct sbi_scratch *scratch,
|
||||||
ulong epc, ulong cause, ulong tval)
|
ulong epc, ulong cause, ulong tval)
|
||||||
@@ -109,6 +120,21 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs,
|
|||||||
return 0;
|
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,
|
void sbi_trap_handler(struct sbi_trap_regs *regs,
|
||||||
struct sbi_scratch *scratch)
|
struct sbi_scratch *scratch)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user