123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /*
- * 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__ */
|