118 lines
3.0 KiB
C
118 lines
3.0 KiB
C
/*
|
|
* Copyright (c) 2021, Shenzhen Academy of Aerospace Technology
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
* 2021-11-16 Dystopia the first version
|
|
*/
|
|
|
|
#ifndef __TRAP_H__
|
|
#define __TRAP_H__
|
|
|
|
#include "c66xx.h"
|
|
|
|
/*
|
|
* exception operation macro
|
|
*/
|
|
#define disable_exception()
|
|
#define get_except_type() EFR
|
|
#define ack_exception(type) ECR = 1ul << (type)
|
|
#define get_iexcept() IERR
|
|
#define set_iexcept(mask) IERR = (mask)
|
|
|
|
/*
|
|
* exception types
|
|
*/
|
|
#define EXCEPT_TYPE_NXF 31 /* NMI */
|
|
#define EXCEPT_TYPE_EXC 30 /* external exception */
|
|
#define EXCEPT_TYPE_IXF 1 /* internal exception */
|
|
#define EXCEPT_TYPE_SXF 0 /* software exception */
|
|
|
|
#define EXCEPT_CAUSE_LBX (1 << 7) /* loop buffer exception */
|
|
#define EXCEPT_CAUSE_PRX (1 << 6) /* privilege exception */
|
|
#define EXCEPT_CAUSE_RAX (1 << 5) /* resource access exception */
|
|
#define EXCEPT_CAUSE_RCX (1 << 4) /* resource conflict exception */
|
|
#define EXCEPT_CAUSE_OPX (1 << 3) /* opcode exception */
|
|
#define EXCEPT_CAUSE_EPX (1 << 2) /* execute packet exception */
|
|
#define EXCEPT_CAUSE_FPX (1 << 1) /* fetch packet exception */
|
|
#define EXCEPT_CAUSE_IFX (1 << 0) /* instruction fetch exception */
|
|
|
|
enum SYSTEM_TRAP_CODE
|
|
{
|
|
ABORT_BUS_ADDRERR = 0, // bus address error
|
|
ABORT_BUS_ACCERR, // bus access permission error
|
|
ABORT_OPCODE_ILL, // illegal opcode
|
|
ABORT_PRVREG_ILL, // privilege register
|
|
ABORT_PRVOPC_ILL, // privileged opcode
|
|
ABORT_ILLTRP_ILL, // illegal trap
|
|
ABORT_BRKPT_ILL, // handling breakpoints
|
|
};
|
|
|
|
/*
|
|
* abort types
|
|
*/
|
|
#define ABORT_TYPE_BUS 0 // bus access abnormal
|
|
#define ABORT_TYPE_MAP 1 // page table mapping error
|
|
#define ABORT_TYPE_UNDDEF 0xff // undefined exception
|
|
#define ABORT_TYPE_FATAL 0xffffffff // fatal error
|
|
|
|
struct rt_exception_info {
|
|
char *kernel_str;
|
|
int type;
|
|
int code;
|
|
};
|
|
|
|
#define BKPT_OPCODE 0x56454314 /* illegal opcode */
|
|
#define INTC_MEXPMASK __SYSREGA(0x018000e0, unsigned int)
|
|
|
|
extern void rt_trap_init(void);
|
|
extern void rt_hw_enable_exception(void);
|
|
extern int __fls(int val);
|
|
extern int __ffs(int val);
|
|
|
|
/*
|
|
* ffz - find first zero in word.
|
|
* @word: The word to search
|
|
*
|
|
* Undefined if no zero exists, so code should check against ~0UL first.
|
|
*/
|
|
#define ffz(x) __ffs(~(x))
|
|
|
|
/**
|
|
* fls - find last (most-significant) bit set
|
|
* @x: the word to search
|
|
*
|
|
* This is defined the same way as ffs.
|
|
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
|
|
*/
|
|
static inline int fls(int x)
|
|
{
|
|
if (!x)
|
|
{
|
|
return 0;
|
|
}
|
|
return 32 - __fls(x);
|
|
}
|
|
|
|
/**
|
|
* ffs - find first bit set
|
|
* @x: the word to search
|
|
*
|
|
* This is defined the same way as
|
|
* the libc and compiler builtin ffs routines, therefore
|
|
* differs in spirit from the above ffz (man ffs).
|
|
* Note ffs(0) = 0, ffs(1) = 1, ffs(0x80000000) = 32.
|
|
*/
|
|
static inline int ffs(int x)
|
|
{
|
|
if (!x)
|
|
{
|
|
return 0;
|
|
}
|
|
return __ffs(x) + 1;
|
|
}
|
|
|
|
#endif /* __TRAP_H__ */
|