19 #ifndef __CORE_FEATURE_BASE__
20 #define __CORE_FEATURE_BASE__
37 #include "nmsis_compiler.h"
48 #define __RISCV_XLEN 32
50 #define __RISCV_XLEN __riscv_xlen
128 #if defined(__RISCV_XLEN) && __RISCV_XLEN == 64
149 #if defined(__RISCV_XLEN) && __RISCV_XLEN == 32
192 #if defined(__RISCV_XLEN) && __RISCV_XLEN == 64
624 #define __RV_CSR_SWAP(csr, val) \
626 rv_csr_t __v = (unsigned long)(val); \
627 __ASM volatile("csrrw %0, " STRINGIFY(csr) ", %1" \
642 #define __RV_CSR_READ(csr) \
645 __ASM volatile("csrr %0, " STRINGIFY(csr) \
660 #define __RV_CSR_WRITE(csr, val) \
662 rv_csr_t __v = (rv_csr_t)(val); \
663 __ASM volatile("csrw " STRINGIFY(csr) ", %0" \
679 #define __RV_CSR_READ_SET(csr, val) \
681 rv_csr_t __v = (rv_csr_t)(val); \
682 __ASM volatile("csrrs %0, " STRINGIFY(csr) ", %1" \
697 #define __RV_CSR_SET(csr, val) \
699 rv_csr_t __v = (rv_csr_t)(val); \
700 __ASM volatile("csrs " STRINGIFY(csr) ", %0" \
716 #define __RV_CSR_READ_CLEAR(csr, val) \
718 rv_csr_t __v = (rv_csr_t)(val); \
719 __ASM volatile("csrrc %0, " STRINGIFY(csr) ", %1" \
734 #define __RV_CSR_CLEAR(csr, val) \
736 rv_csr_t __v = (rv_csr_t)(val); \
737 __ASM volatile("csrc " STRINGIFY(csr) ", %0" \
744 #include <intrinsics.h>
746 #define __RV_CSR_SWAP __write_csr
747 #define __RV_CSR_READ __read_csr
748 #define __RV_CSR_WRITE __write_csr
749 #define __RV_CSR_READ_SET __set_bits_csr
750 #define __RV_CSR_SET __set_bits_csr
751 #define __RV_CSR_READ_CLEAR __clear_bits_csr
752 #define __RV_CSR_CLEAR __clear_bits_csr
768 unsigned long val = 0;
783 __ASM volatile(
"mv sp, %0" ::
"r"(stack));
785 __ASM volatile(
"mret");
1060 #if __RISCV_XLEN == 32
1061 volatile uint32_t high0, low, high;
1067 if (high0 != high) {
1070 full = (((uint64_t)high) << 32) | low;
1072 #elif __RISCV_XLEN == 64
1086 #if __RISCV_XLEN == 32
1090 #elif __RISCV_XLEN == 64
1104 #if __RISCV_XLEN == 32
1105 volatile uint32_t high0, low, high;
1111 if (high0 != high) {
1114 full = (((uint64_t)high) << 32) | low;
1116 #elif __RISCV_XLEN == 64
1130 #if __RISCV_XLEN == 32
1134 #elif __RISCV_XLEN == 64
1149 #if __RISCV_XLEN == 32
1150 volatile uint32_t high0, low, high;
1156 if (high0 != high) {
1159 full = (((uint64_t)high) << 32) | low;
1161 #elif __RISCV_XLEN == 64
1233 #ifdef __HARTID_OFFSET
1286 #ifdef __HARTID_OFFSET
1332 __ASM volatile(
"nop");
1347 __ASM volatile(
"wfi");
1360 __ASM volatile(
"wfi");
1373 __ASM volatile(
"ebreak");
1384 __ASM volatile(
"ecall");
1390 typedef enum WFI_SleepMode {
1623 #if __RISCV_XLEN == 32
1712 #elif __RISCV_XLEN == 64
1758 #if __RISCV_XLEN == 32
1759 volatile uint32_t high0, low, high;
1769 full = (((uint64_t)high) << 32) | low;
return full;
1774 full = (((uint64_t)high) << 32) | low;
return full;
1779 full = (((uint64_t)high) << 32) | low;
return full;
1784 full = (((uint64_t)high) << 32) | low;
return full;
1789 full = (((uint64_t)high) << 32) | low;
return full;
1794 full = (((uint64_t)high) << 32) | low;
return full;
1799 full = (((uint64_t)high) << 32) | low;
return full;
1804 full = (((uint64_t)high) << 32) | low;
return full;
1809 full = (((uint64_t)high) << 32) | low;
return full;
1814 full = (((uint64_t)high) << 32) | low;
return full;
1819 full = (((uint64_t)high) << 32) | low;
return full;
1824 full = (((uint64_t)high) << 32) | low;
return full;
1829 full = (((uint64_t)high) << 32) | low;
return full;
1834 full = (((uint64_t)high) << 32) | low;
return full;
1839 full = (((uint64_t)high) << 32) | low;
return full;
1844 full = (((uint64_t)high) << 32) | low;
return full;
1849 full = (((uint64_t)high) << 32) | low;
return full;
1854 full = (((uint64_t)high) << 32) | low;
return full;
1859 full = (((uint64_t)high) << 32) | low;
return full;
1864 full = (((uint64_t)high) << 32) | low;
return full;
1869 full = (((uint64_t)high) << 32) | low;
return full;
1874 full = (((uint64_t)high) << 32) | low;
return full;
1879 full = (((uint64_t)high) << 32) | low;
return full;
1884 full = (((uint64_t)high) << 32) | low;
return full;
1889 full = (((uint64_t)high) << 32) | low;
return full;
1894 full = (((uint64_t)high) << 32) | low;
return full;
1899 full = (((uint64_t)high) << 32) | low;
return full;
1904 full = (((uint64_t)high) << 32) | low;
return full;
1909 full = (((uint64_t)high) << 32) | low;
return full;
1911 #elif __RISCV_XLEN == 64
2032 #define __FENCE(p, s) __ASM volatile ("fence " #p "," #s : : : "memory")
2042 __ASM volatile(
"fence.i");
2046 #define __RWMB() __FENCE(iorw,iorw)
2049 #define __RMB() __FENCE(ir,ir)
2052 #define __WMB() __FENCE(ow,ow)
2055 #define __SMP_RWMB() __FENCE(rw,rw)
2058 #define __SMP_RMB() __FENCE(r,r)
2061 #define __SMP_WMB() __FENCE(w,w)
2064 #define __CPU_RELAX() __ASM volatile ("" : : : "memory")
2078 __ASM volatile (
"lb %0, 0(%1)" :
"=r" (result) :
"r" (addr));
2092 __ASM volatile (
"lh %0, 0(%1)" :
"=r" (result) :
"r" (addr));
2106 __ASM volatile (
"lw %0, 0(%1)" :
"=r" (result) :
"r" (addr));
2110 #if __RISCV_XLEN != 32
2121 __ASM volatile (
"ld %0, 0(%1)" :
"=r" (result) :
"r" (addr));
2134 __ASM volatile (
"sb %0, 0(%1)" : :
"r" (val),
"r" (addr));
2145 __ASM volatile (
"sh %0, 0(%1)" : :
"r" (val),
"r" (addr));
2156 __ASM volatile (
"sw %0, 0(%1)" : :
"r" (val),
"r" (addr));
2159 #if __RISCV_XLEN != 32
2168 __ASM volatile (
"sd %0, 0(%1)" : :
"r" (val),
"r" (addr));
2189 "0: lr.w %0, %2 \n" \
2190 " bne %0, %z3, 1f \n" \
2191 " sc.w %1, %z4, %2 \n" \
2194 :
"=&r"(result),
"=&r"(rc),
"+A"(*addr) \
2195 :
"r"(oldval),
"r"(newval) \
2211 __ASM volatile (
"amoswap.w %0, %2, %1" : \
2212 "=r"(result),
"+A"(*addr) :
"r"(newval) :
"memory");
2227 __ASM volatile (
"amoadd.w %0, %2, %1" : \
2228 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2243 __ASM volatile (
"amoand.w %0, %2, %1" : \
2244 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2259 __ASM volatile (
"amoor.w %0, %2, %1" : \
2260 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2275 __ASM volatile (
"amoxor.w %0, %2, %1" : \
2276 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2291 __ASM volatile (
"amomaxu.w %0, %2, %1" : \
2292 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2307 __ASM volatile (
"amomax.w %0, %2, %1" : \
2308 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2323 __ASM volatile (
"amominu.w %0, %2, %1" : \
2324 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2339 __ASM volatile (
"amomin.w %0, %2, %1" : \
2340 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2344 #if __RISCV_XLEN == 64
2356 __STATIC_FORCEINLINE uint64_t __CAS_D(
volatile uint64_t *addr, uint64_t oldval, uint64_t newval)
2362 "0: lr.d %0, %2 \n" \
2363 " bne %0, %z3, 1f \n" \
2364 " sc.d %1, %z4, %2 \n" \
2367 :
"=&r"(result),
"=&r"(rc),
"+A"(*addr) \
2368 :
"r"(oldval),
"r"(newval) \
2384 __ASM volatile (
"amoswap.d %0, %2, %1" : \
2385 "=r"(result),
"+A"(*addr) :
"r"(newval) :
"memory");
2400 __ASM volatile (
"amoadd.d %0, %2, %1" : \
2401 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2416 __ASM volatile (
"amoand.d %0, %2, %1" : \
2417 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2432 __ASM volatile (
"amoor.d %0, %2, %1" : \
2433 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2448 __ASM volatile (
"amoxor.d %0, %2, %1" : \
2449 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2464 __ASM volatile (
"amomaxu.d %0, %2, %1" : \
2465 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2480 __ASM volatile (
"amomax.d %0, %2, %1" : \
2481 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2496 __ASM volatile (
"amominu.d %0, %2, %1" : \
2497 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
2512 __ASM volatile (
"amomin.d %0, %2, %1" : \
2513 "=r"(result),
"+A"(*addr) :
"r"(value) :
"memory");
CSR_MCACHECTL_Type CSR_MCACHE_CTL_Type
CSR_MPPICFGINFO_Type CSR_MPPICFG_INFO_Type
CSR_MECCCODE_Type CSR_MECC_CODE_Type
CSR_MDLMCTL_Type CSR_DILM_CTL_Type
CSR_MTLBCFGINFO_Type CSR_MTLBCFG_INFO_Type
CSR_MMISCCTRL_Type CSR_MMISCCTL_Type
CSR_MECCLOCK_Type CSR_MECC_LOCK_Type
CSR_MCFGINFO_Type CSR_MCFG_INFO_Type
CSR_MICFGINFO_Type CSR_MICFG_INFO_Type
CSR_MDCFGINFO_Type CSR_MDCFG_INFO_Type
CSR_MILMCTL_Type CSR_MILM_CTL_Type
CSR_MMISCCTRL_Type CSR_MMISC_CTL_Type
CSR_MFIOCFGINFO_Type CSR_MFIOCFG_INFO_Type
__STATIC_FORCEINLINE uint16_t __LH(volatile void *addr)
Load 16bit value from address (16 bit)
__STATIC_FORCEINLINE void __SH(volatile void *addr, uint16_t val)
Write 16bit value to address (16 bit)
__STATIC_FORCEINLINE int32_t __AMOMAX_W(volatile int32_t *addr, int32_t value)
Atomic signed MAX with 32bit value.
__STATIC_FORCEINLINE void __disable_all_counter(void)
Disable all MCYCLE & MINSTRET & MHPMCOUNTER counter.
__STATIC_FORCEINLINE unsigned long __get_hpm_event(unsigned long idx)
Get event for selected high performance monitor event.
__STATIC_FORCEINLINE void __set_wfi_sleepmode(WFI_SleepMode_Type mode)
Set Sleep mode of WFI.
__STATIC_FORCEINLINE void __enable_all_counter(void)
Enable all MCYCLE & MINSTRET & MHPMCOUNTER counter.
__STATIC_FORCEINLINE uint64_t __get_hpm_counter(unsigned long idx)
Get value of selected high performance monitor counter.
__STATIC_FORCEINLINE void __EBREAK(void)
Breakpoint Instruction.
__STATIC_FORCEINLINE void __NOP(void)
NOP Instruction.
__STATIC_FORCEINLINE void __disable_mhpm_counters(unsigned long mask)
Disable hardware performance counters with mask.
__STATIC_FORCEINLINE void __enable_mhpm_counters(unsigned long mask)
Enable hardware performance counters with mask.
__STATIC_FORCEINLINE void __set_mideleg(unsigned long mask)
Set interrupt delegation to S mode.
__STATIC_FORCEINLINE void __disable_mhpm_counter(unsigned long idx)
Disable selected hardware performance monitor counter.
__STATIC_FORCEINLINE void __enable_mhpm_counter(unsigned long idx)
Enable selected hardware performance monitor counter.
__STATIC_FORCEINLINE void __FENCE_I(void)
Fence.i Instruction.
WFI_SleepMode_Type
WFI Sleep Mode enumeration.
__STATIC_FORCEINLINE void __ECALL(void)
Environment Call Instruction.
__STATIC_FORCEINLINE uint32_t __AMOSWAP_W(volatile uint32_t *addr, uint32_t newval)
Atomic Swap 32bit value into memory.
__STATIC_FORCEINLINE int32_t __AMOXOR_W(volatile int32_t *addr, int32_t value)
Atomic XOR with 32bit value.
__STATIC_FORCEINLINE uint32_t __AMOMINU_W(volatile uint32_t *addr, uint32_t value)
Atomic unsigned MIN with 32bit value.
__STATIC_FORCEINLINE uint32_t __AMOMAXU_W(volatile uint32_t *addr, uint32_t value)
Atomic unsigned MAX with 32bit value.
__STATIC_FORCEINLINE uint8_t __LB(volatile void *addr)
Load 8bit value from address (8 bit)
__STATIC_FORCEINLINE void __SB(volatile void *addr, uint8_t val)
Write 8bit value to address (8 bit)
__STATIC_FORCEINLINE void __set_hpm_event(unsigned long idx, unsigned long event)
Set event for selected high performance monitor event.
__STATIC_FORCEINLINE void __WFI(void)
Wait For Interrupt.
__STATIC_FORCEINLINE void __set_medeleg(unsigned long mask)
Set exceptions delegation to S mode.
__STATIC_FORCEINLINE uint32_t __CAS_W(volatile uint32_t *addr, uint32_t oldval, uint32_t newval)
Compare and Swap 32bit value using LR and SC.
__STATIC_FORCEINLINE int32_t __AMOAND_W(volatile int32_t *addr, int32_t value)
Atomic And with 32bit value.
__STATIC_FORCEINLINE void __SW(volatile void *addr, uint32_t val)
Write 32bit value to address (32 bit)
__STATIC_FORCEINLINE void __TXEVT(void)
Send TX Event.
__STATIC_FORCEINLINE int32_t __AMOOR_W(volatile int32_t *addr, int32_t value)
Atomic OR with 32bit value.
__STATIC_FORCEINLINE unsigned long __read_hpm_counter(unsigned long idx)
Get value of selected high performance monitor counter.
__STATIC_FORCEINLINE int32_t __AMOADD_W(volatile int32_t *addr, int32_t value)
Atomic Add with 32bit value.
__STATIC_FORCEINLINE void __WFE(void)
Wait For Event.
__STATIC_FORCEINLINE void __set_hpm_counter(unsigned long idx, uint64_t value)
Set value for selected high performance monitor counter.
__STATIC_FORCEINLINE void __enable_mcycle_counter(void)
Enable MCYCLE counter.
__STATIC_FORCEINLINE int32_t __AMOMIN_W(volatile int32_t *addr, int32_t value)
Atomic signed MIN with 32bit value.
__STATIC_FORCEINLINE void __disable_minstret_counter(void)
Disable MINSTRET counter.
__STATIC_FORCEINLINE void __enable_minstret_counter(void)
Enable MINSTRET counter.
__STATIC_FORCEINLINE uint32_t __LW(volatile void *addr)
Load 32bit value from address (32 bit)
__STATIC_FORCEINLINE void __disable_mcycle_counter(void)
Disable MCYCLE counter.
@ WFI_DEEP_SLEEP
Deep sleep mode, the core_clk and core_ano_clk will poweroff.
@ WFI_SHALLOW_SLEEP
Shallow sleep mode, the core_clk will poweroff.
__STATIC_FORCEINLINE unsigned long __read_time_csr()
Read the TIME register.
__STATIC_FORCEINLINE void __disable_core_irq(uint32_t irq)
Disable Core IRQ Interrupt.
__STATIC_FORCEINLINE void __disable_irq_s(void)
Disable IRQ Interrupts in supervisor mode.
__STATIC_FORCEINLINE uint64_t __get_rv_instret(void)
Read whole 64 bits value of machine instruction-retired counter.
__STATIC_FORCEINLINE uint64_t __get_rv_cycle(void)
Read whole 64 bits value of mcycle counter.
__STATIC_FORCEINLINE void __enable_ext_irq_s(void)
Enable External IRQ Interrupts in supervisor mode.
__STATIC_FORCEINLINE void __disable_timer_irq(void)
Disable Timer IRQ Interrupts.
#define __RV_CSR_CLEAR(csr, val)
CSR operation Macro for csrc instruction.
__STATIC_FORCEINLINE unsigned long __get_cluster_id(void)
Get cluster id of current cluster.
__STATIC_FORCEINLINE void __clear_core_irq_pending(uint32_t irq)
Clear Core IRQ Interrupt Pending status.
__STATIC_FORCEINLINE void __disable_irq(void)
Disable IRQ Interrupts.
__STATIC_FORCEINLINE void __enable_ext_irq(void)
Enable External IRQ Interrupts.
__STATIC_FORCEINLINE uint32_t __get_core_irq_pending_s(uint32_t irq)
Get Core IRQ Interrupt Pending status in supervisor mode.
__STATIC_FORCEINLINE void __clear_core_irq_pending_s(uint32_t irq)
Clear Core IRQ Interrupt Pending status in supervisor mode.
#define __RV_CSR_READ(csr)
CSR operation Macro for csrr instruction.
__STATIC_FORCEINLINE void __disable_sw_irq(void)
Disable software IRQ Interrupts.
__STATIC_FORCEINLINE void __disable_ext_irq(void)
Disable External IRQ Interrupts.
__STATIC_FORCEINLINE unsigned long __get_cluster_id_s(void)
Get cluster id of current cluster in supervisor mode.
__STATIC_FORCEINLINE unsigned long __get_hart_index_s(void)
Get hart index of current cluster in supervisor mode.
__STATIC_FORCEINLINE void __disable_timer_irq_s(void)
Disable Timer IRQ Interrupts in supervisor mode.
__STATIC_FORCEINLINE void __enable_timer_irq_s(void)
Enable Timer IRQ Interrupts in supervisor mode.
__STATIC_FORCEINLINE unsigned long __get_hart_id(void)
Get hart id of current cluster.
__STATIC_FORCEINLINE unsigned long __get_hart_id_s(void)
Get hart id of current cluster in supervisor mode.
__STATIC_FORCEINLINE uint64_t __get_rv_time(void)
Read whole 64 bits value of real-time clock.
__STATIC_FORCEINLINE void __disable_ext_irq_s(void)
Disable External IRQ Interrupts in supervisor mode.
__STATIC_FORCEINLINE unsigned long __read_instret_csr()
Read the INSTRET register.
__STATIC_FORCEINLINE void __disable_sw_irq_s(void)
Disable software IRQ Interrupts in supervisor mode.
__STATIC_FORCEINLINE unsigned long __get_hart_index(void)
Get hart index of current cluster.
#define __RV_CSR_WRITE(csr, val)
CSR operation Macro for csrw instruction.
__STATIC_FORCEINLINE void __enable_sw_irq(void)
Enable software IRQ Interrupts.
__STATIC_FORCEINLINE void __disable_core_irq_s(uint32_t irq)
Disable Core IRQ Interrupt in supervisor mode.
__STATIC_FORCEINLINE void __switch_mode(uint8_t mode, uintptr_t stack, void(*entry_point)(void))
switch privilege from machine mode to others.
__STATIC_FORCEINLINE void __enable_timer_irq(void)
Enable Timer IRQ Interrupts.
__STATIC_FORCEINLINE void __enable_irq_s(void)
Enable IRQ Interrupts in supervisor mode.
__STATIC_FORCEINLINE uint32_t __get_core_irq_pending(uint32_t irq)
Get Core IRQ Interrupt Pending status.
__STATIC_FORCEINLINE unsigned long __read_cycle_csr()
Read the CYCLE register.
__STATIC_FORCEINLINE void __enable_core_irq_s(uint32_t irq)
Enable Core IRQ Interrupt in supervisor mode.
__STATIC_FORCEINLINE void __enable_core_irq(uint32_t irq)
Enable Core IRQ Interrupt.
__STATIC_FORCEINLINE void __set_rv_cycle(uint64_t cycle)
Set whole 64 bits value of mcycle counter.
__STATIC_FORCEINLINE void __enable_irq(void)
Enable IRQ Interrupts.
__STATIC_FORCEINLINE void __enable_sw_irq_s(void)
Enable software IRQ Interrupts in supervisor mode.
__STATIC_FORCEINLINE void __set_rv_instret(uint64_t instret)
Set whole 64 bits value of machine instruction-retired counter.
#define __RV_CSR_SET(csr, val)
CSR operation Macro for csrs instruction.
#define CSR_MHPMCOUNTER17H
#define CSR_MHPMCOUNTER16
#define CSR_MHPMCOUNTER7H
#define CSR_MHPMCOUNTER27H
#define CSR_MHPMCOUNTER25
#define CSR_MHPMCOUNTER20
#define CSR_MHPMCOUNTER28
#define CSR_MHPMCOUNTER31
#define CSR_MHPMCOUNTER18H
#define CSR_MHPMCOUNTER21H
#define CSR_MHPMCOUNTER28H
#define CSR_MHPMCOUNTER21
#define CSR_MHPMCOUNTER9H
#define CSR_MHPMCOUNTER29H
#define CSR_MHPMCOUNTER26
#define CSR_MHPMCOUNTER14
#define CSR_MHPMCOUNTER10H
#define CSR_MHPMCOUNTER11H
#define CSR_MHPMCOUNTER12H
#define CSR_MHPMCOUNTER25H
#define CSR_MHPMCOUNTER26H
#define CSR_MHPMCOUNTER5H
#define CSR_MHPMCOUNTER24H
#define CSR_MHPMCOUNTER8H
#define CSR_MHPMCOUNTER3H
#define CSR_MHPMCOUNTER12
#define CSR_MHPMCOUNTER20H
#define CSR_MHPMCOUNTER31H
#define CSR_MCOUNTINHIBIT
#define CSR_MHPMCOUNTER6H
#define CSR_MHPMCOUNTER23H
#define CSR_MHPMCOUNTER17
#define CSR_MHPMCOUNTER11
#define CSR_MHPMCOUNTER15H
#define CSR_MHPMCOUNTER10
#define CSR_MHPMCOUNTER14H
#define CSR_MHPMCOUNTER29
#define CSR_MHPMCOUNTER27
#define CSR_MHPMCOUNTER18
#define CSR_MHPMCOUNTER13H
#define CSR_MHPMCOUNTER4H
#define CSR_MHPMCOUNTER23
#define CSR_MHPMCOUNTER24
#define CSR_MHPMCOUNTER15
#define CSR_MHPMCOUNTER22
#define CSR_MHPMCOUNTER13
#define CSR_MHPMCOUNTER30
#define CSR_MHPMCOUNTER22H
#define CSR_MHPMCOUNTER19H
#define CSR_MHPMCOUNTER16H
#define CSR_MHPMCOUNTER30H
#define CSR_MHPMCOUNTER19
#define __ASM
Pass information from the compiler to the assembler.
#define __STATIC_FORCEINLINE
Define a static function that should be always inlined by the compiler.
unsigned long rv_csr_t
Type of Control and Status Register(CSR), depends on the XLEN defined in RISC-V.
#define __RISCV_XLEN
Refer to the width of an integer register in bits(either 32 or 64)
Union type to access MCACHE_CTL CSR register.
rv_csr_t dc_burst_type
bit: 23 D-Cache Burst type control
rv_csr_t dc_rwdecc
bit: 20 Control D-Cache Data Ram ECC code injection
rv_csr_t ic_burst_type
bit: 10 I-Cache Burst type control
rv_csr_t ic_scpd_mod
bit: 1 Scratchpad mode, 0: Scratchpad as ICache Data RAM, 1: Scratchpad as ILM SRAM
rv_csr_t ic_pf_en
bit: 6 I-Cache prefetch enable
rv_csr_t dc_rwtecc
bit: 19 Control D-Cache Tag Ram ECC code injection
rv_csr_t ic_rwtecc
bit: 4 Control I-Cache Tag Ram ECC code injection
rv_csr_t dc_prefetch_en
bit: 22 D-Cache CMO prefetch enable control
rv_csr_t ic_rwdecc
bit: 5 Control I-Cache Data Ram ECC code injection
rv_csr_t d
Type used for csr data access.
rv_csr_t _reserved0
bit: 11..15 Reserved
rv_csr_t ic_ecc_chk_en
bit: 8 I-Cache check ECC codes enable
rv_csr_t ic_en
bit: 0 I-Cache enable
rv_csr_t _reserved1
bit: 24..XLEN-1 Reserved
rv_csr_t dc_ecc_excp_en
bit: 18 D-Cache 2bit ECC error exception enable
rv_csr_t ic_cancel_en
bit: 7 I-Cache change flow canceling enable control
rv_csr_t ic_ecc_en
bit: 2 I-Cache ECC enable
rv_csr_t ic_prefetch_en
bit: 9 I-Cache CMO prefetch enable control
rv_csr_t dc_ecc_en
bit: 17 D-Cache ECC enable
rv_csr_t ic_ecc_excp_en
bit: 3 I-Cache 2bit ECC error exception enable
rv_csr_t dc_en
bit: 16 DCache enable
rv_csr_t dc_ecc_chk_en
bit: 21 D-Cache check ECC codes enable
Union type to access MCAUSE CSR register.
rv_csr_t mpp
bit: 28..29 Privilede mode flag before enter interrupt
rv_csr_t mpil
bit: 16..23 Previous interrupt level
rv_csr_t exccode
bit: 0..11 exception or interrupt code
rv_csr_t _reserved0
bit: 12..15 Reserved
rv_csr_t mpie
bit: 27 Interrupt enable flag before enter interrupt
rv_csr_t _reserved1
bit: 24..26 Reserved
rv_csr_t minhv
bit: 30 Machine interrupt vector table
rv_csr_t d
Type used for csr data access.
rv_csr_t interrupt
bit: XLEN-1 trap type.
Union type to access MCFG_INFO CSR register.
rv_csr_t sec_mode
bit: 19 Smwg extension present
rv_csr_t tee
bit: 0 TEE present
rv_csr_t icache
bit: 9 ICache present
rv_csr_t etrace
bit: 20 Etrace present
rv_csr_t dsp_n1
bit: 12 DSP N1 present
rv_csr_t d
Type used for csr data access.
rv_csr_t ecc
bit: 1 ECC present
rv_csr_t plic
bit: 3 PLIC present
rv_csr_t dsp_n2
bit: 13 DSP N2 present
rv_csr_t ppi
bit: 5 PPI present
rv_csr_t clic
bit: 2 CLIC present
rv_csr_t nice
bit: 6 NICE present
rv_csr_t dsp_n3
bit: 14 DSP N3 present
rv_csr_t _reserved1
bit: 27..XLEN-1 Reserved
rv_csr_t sstc
bit: 26 SSTC extension present
rv_csr_t ilm
bit: 7 ILM present
rv_csr_t vnice
bit: 23 VNICE present
rv_csr_t xlcz
bit: 24 XLCZ extension present
rv_csr_t dcache
bit: 10 DCache present
rv_csr_t zc_xlcz
bit: 15 Zc and xlcz extension present
rv_csr_t safety_mecha
bit: 21..22 Indicate Core's safety mechanism
rv_csr_t dlm
bit: 8 DLM present
rv_csr_t smp
bit: 11 SMP present
rv_csr_t vpu_degree
bit: 17..18 Indicate the VPU degree of parallel
rv_csr_t iregion
bit: 16 IREGION present
rv_csr_t zilsd
bit: 25 Zilsd/Zclsd extension present
rv_csr_t fio
bit: 4 FIO present
Union type to access MCOUNTINHIBIT CSR register.
rv_csr_t cy
bit: 0 1 means disable mcycle counter
rv_csr_t ir
bit: 2 1 means disable minstret counter
rv_csr_t d
Type used for csr data access.
rv_csr_t _reserved1
bit: 3..XLEN-1 Reserved
rv_csr_t _reserved0
bit: 1 Reserved
Union type to access MDCAUSE CSR register.
rv_csr_t d
Type used for csr data access.
rv_csr_t mdcause
bit: 0..2 More detailed exception information as MCAUSE supplement
rv_csr_t _reserved0
bit: 3..XLEN-1 Reserved
Union type to access MDCFG_INFO CSR register.
rv_csr_t set
bit: 0..3 D-Cache sets per way
rv_csr_t lm_ecc
bit: 21 DLM ECC present
rv_csr_t _reserved0
bit: 11..15 Reserved
rv_csr_t d
Type used for csr data access.
rv_csr_t _reserved1
bit: 22..XLEN-1 Reserved
rv_csr_t lsize
bit: 7..9 D-Cache line size
rv_csr_t lm_size
bit: 16..20 DLM size, need to be 2^n size
rv_csr_t way
bit: 4..6 D-Cache way
rv_csr_t ecc
bit: 10 D-Cache ECC support
Union type to access MDLM_CTL CSR register.
rv_csr_t _reserved0
bit: 5..9 Reserved
rv_csr_t dlm_en
bit: 0 DLM enable
rv_csr_t dlm_bpa
bit: 10..XLEN-1 DLM base address
rv_csr_t dlm_rwecc
bit: 3 Control mecc_code write to dlm, simulate error injection
rv_csr_t dlm_ecc_en
bit: 1 DLM ECC eanble
rv_csr_t dlm_ecc_chk_en
bit: 4 DLM check ECC codes enable
rv_csr_t d
Type used for csr data access.
rv_csr_t dlm_ecc_excp_en
bit: 2 DLM ECC exception enable
Union type to access MECC_CODE CSR register.
rv_csr_t _reserved1
bit: 21..23 Reserved 0
rv_csr_t ramid
bit: 16..20 The ID of RAM that has 2bit ECC error, software can clear these bits
rv_csr_t d
Type used for csr data access.
rv_csr_t _reserved2
bit: 29..XLEN-1 Reserved 0
rv_csr_t code
bit: 0..8 Used to inject ECC check code
rv_csr_t _reserved0
bit: 9..15 Reserved 0
rv_csr_t sramid
bit: 24..28 The ID of RAM that has 1bit ECC error, software can clear these bits
Union type to access MECC_LOCK CSR register.
rv_csr_t ecc_lock
bit: 0 RW permission, ECC Lock configure
rv_csr_t _reserved0
bit: 1..XLEN-1 Reserved
rv_csr_t d
Type used for csr data access.
Union type to access MECC_CTL CSR register.
rv_csr_t dlm_ext_msk
bit: 6 Write 1 to disable aggregate DLM external access ECC fatal error to safety_error output
rv_csr_t ilm_acc_msk
bit: 1 Write 1 to disable aggregate ILM load/store access ECC fatal error to safety_error output
rv_csr_t dc_ccm_msk
bit: 8 Write 1 to disable aggregate DCache CCM ECC fatal error to safety_error output
rv_csr_t _reserved0
bit: 10..XLEN-1 Reserved 0
rv_csr_t ic_fch_msk
bit: 3 Write 1 to disable aggregate ICache fetch ECC fatal error to safety_error output
rv_csr_t dc_acc_msk
bit: 4 Write 1 to disable aggregate DCache access ECC fatal error to safety_error output
rv_csr_t d
Type used for csr data access.
rv_csr_t dlm_acc_msk
bit: 2 Write 1 to disable aggregate DLM access ECC fatal error to safety_error output
rv_csr_t dc_cpbk_msk
bit: 9 Write 1 to disable aggregate DCache CPBK ECC fatal error to safety_error output
rv_csr_t ic_ccm_msk
bit: 7 Write 1 to disable aggregate ICache CCM ECC fatal error to safety_error output
rv_csr_t ilm_fch_msk
bit: 0 Write 1 to disable aggregate ILM fetch ECC fatal error to safety_error output
rv_csr_t ilm_ext_msk
bit: 5 Write 1 to disable aggregate ILM external access ECC fatal error to safety_error output
Union type to access MECC_STATUS CSR register.
rv_csr_t ic_ccm_err
bit: 7 ICache CCM ECC fatal error has occurred
rv_csr_t dc_cpbk_err
bit: 9 DCache CPBK ECC fatal error has occurred
rv_csr_t dlm_acc_err
bit: 2 DLM access ECC fatal error has occurred
rv_csr_t ilm_acc_err
bit: 1 ILM load/store access ECC fatal error has occurred
rv_csr_t dlm_ext_err
bit: 6 DLM external access ECC fatal error has occurred
rv_csr_t _reserved0
bit: 10..XLEN-1 Reserved 0
rv_csr_t ilm_fch_err
bit: 0 ILM fetch ECC fatal error has occurred
rv_csr_t dc_ccm_err
bit: 8 DCache CCM ECC fatal error has occurred
rv_csr_t dc_acc_err
bit: 4 DCache access ECC fatal error has occurred
rv_csr_t ilm_ext_err
bit: 5 ILM external access ECC fatal error has occurred
rv_csr_t d
Type used for csr data access.
rv_csr_t ic_fch_err
bit: 3 ICache fetch ECC fatal error has occurred
Union type to access MFIOCFG_INFO CSR register.
rv_csr_t _reserved0
bit: 0 Reserved
rv_csr_t fio_size
bit: 1..5 FIO size, need to be 2^n size
rv_csr_t d
Type used for csr data access.
rv_csr_t _reserved1
bit: 6..9 Reserved
rv_csr_t fio_bpa
bit: 10..XLEN-1 FIO base address
Union type to access MICFG_INFO CSR register.
rv_csr_t d
Type used for csr data access.
rv_csr_t lm_size
bit: 16..20 ILM size, need to be 2^n size
rv_csr_t set
bit: 0..3 I-Cache sets per way
rv_csr_t lm_ecc
bit: 22 ILM ECC support
rv_csr_t ecc
bit: 10 I-Cache ECC support
rv_csr_t _reserved0
bit: 11..15 Reserved
rv_csr_t _reserved1
bit: 23..XLEN-1 Reserved
rv_csr_t lsize
bit: 7..9 I-Cache line size
rv_csr_t lm_xonly
bit: 21 ILM Execute only permission or Reserved
rv_csr_t way
bit: 4..6 I-Cache way
Union type to access MILM_CTL CSR register.
rv_csr_t d
Type used for csr data access.
rv_csr_t _reserved0
bit: 6..9 Reserved
rv_csr_t ilm_ecc_chk_en
bit: 4 ILM check ECC codes enable
rv_csr_t ilm_ecc_excp_en
bit: 2 ILM ECC exception enable
rv_csr_t ilm_rwecc
bit: 3 Control mecc_code write to ilm, simulate error injection
rv_csr_t ilm_ecc_en
bit: 1 ILM ECC eanble
rv_csr_t ilm_va_en
bit: 5 Using virtual address to judge ILM access
rv_csr_t ilm_en
bit: 0 ILM enable
rv_csr_t ilm_bpa
bit: 10..XLEN-1 ILM base address
Union type to access MIRGB_INFO CSR register.
rv_csr_t d
Type used for csr data access.
rv_csr_t iregion_base
bit: 10..PA_SIZE IREGION Base Address
rv_csr_t _reserved0
bit: 0 Reserved
rv_csr_t iregion_size
bit: 1..5 Indicates the size of IREGION and it should be power of 2
rv_csr_t _reserved1
bit: 6..9 Reserved
Union type to access MISA CSR register.
rv_csr_t n
bit: 13 Tentatively reserved for User-Level Interrupts extension
rv_csr_t y
bit: 24 Reserved
rv_csr_t p
bit: 15 Tentatively reserved for Packed-SIMD extension
rv_csr_t v
bit: 21 Vector extension
rv_csr_t d
bit: 3 Double-precision floating-point extension
rv_csr_t q
bit: 16 Quad-precision floating-point extension
rv_csr_t i
bit: 8 RV32I/64I/128I base ISA
rv_csr_t w
bit: 22 Reserved
rv_csr_t f
bit: 5 Single-precision floating-point extension
rv_csr_t j
bit: 9 Reserved
rv_csr_t r
bit: 17 Reserved
rv_csr_t g
bit: 6 Reserved
rv_csr_t z
bit: 25 Reserved
rv_csr_t mxl
bit: XLEN-2..XLEN-1 Machine XLEN
rv_csr_t _reserved0
bit: 26..XLEN-3 Reserved
rv_csr_t e
bit: 4 RV32E/64E base ISA
rv_csr_t u
bit: 20 User mode implemented
rv_csr_t s
bit: 18 Supervisor mode implemented
rv_csr_t a
bit: 0 Atomic extension
rv_csr_t t
bit: 19 Reserved
rv_csr_t b
bit: 1 B extension
rv_csr_t o
bit: 14 Reserved
rv_csr_t k
bit: 10 Reserved
rv_csr_t x
bit: 23 Non-standard extensions present
rv_csr_t l
bit: 11 Reserved
rv_csr_t h
bit: 7 Hypervisor extension
rv_csr_t m
bit: 12 Integer Multiply/Divide extension
rv_csr_t c
bit: 2 Compressed extension
Union type to access MMISC_CTRL CSR register.
rv_csr_t d
Type used for csr data access.
rv_csr_t _reserved3
bit: 13 Reserved
rv_csr_t _reserved1
bit: 2 Reserved
rv_csr_t sijump_en
bit: 11 SIJUMP mode of trace
rv_csr_t core_buserr
bit: 8 core bus error exception or interrupt
rv_csr_t _reserved5
bit: 18..XLEN-1 Reserved
rv_csr_t _reserved4
bit: 15..16 Reserved
rv_csr_t _reserved2
bit: 4..5 Reserved
rv_csr_t csr_excl_enable
bit: 17 Exclusive instruction(lr,sc) on Non-cacheable/Device memory can send exclusive flag in memory...
rv_csr_t imreturn_en
bit: 10 IMRETURN mode of trace
rv_csr_t zclsd_en
bit: 1 Control the Zclsd will uses the Zcf extension encoding or not
rv_csr_t _reserved0
bit: 0 Reserved
rv_csr_t dbg_sec
bit: 14 debug access mode, removed in latest releases
rv_csr_t bpu
bit: 3 dynamic prediction enable flag
rv_csr_t nmi_cause
bit: 9 mnvec control and nmi mcase exccode
rv_csr_t misalign
bit: 6 misaligned access support flag
rv_csr_t ldspec_en
bit: 12 enable load speculative goes to mem interface
rv_csr_t zcmt_zcmp
bit: 7 Zc Ext uses the cfdsp of D Ext’s encoding or not
Union type to access MPPICFG_INFO CSR register.
rv_csr_t ppi_bpa
bit: 10..XLEN-1 PPI base address
rv_csr_t _reserved0
bit: 0 Reserved 1
rv_csr_t _reserved1
bit: 6..8 Reserved 0
rv_csr_t ppi_size
bit: 1..5 PPI size, need to be 2^n size
rv_csr_t d
Type used for csr data access.
rv_csr_t ppi_en
bit: 9 PPI Enable.
Union type to access MSAVESTATUS CSR register.
rv_csr_t w
Type used for csr data access.
rv_csr_t mpie2
bit: 8 interrupt enable flag of second level NMI/exception nestting
rv_csr_t mpp2
bit: 9..10 privilede mode of second level NMI/exception nestting
rv_csr_t mpp1
bit: 1..2 privilede mode of fisrt level NMI/exception nestting
rv_csr_t _reserved1
bit: 11..13 Reserved
rv_csr_t ptyp1
bit: 6..7 NMI/exception type of before first nestting
rv_csr_t _reserved2
bit: 16..XLEN-1 Reserved
rv_csr_t ptyp2
bit: 14..15 NMI/exception type of before second nestting
rv_csr_t _reserved0
bit: 3..5 Reserved
rv_csr_t mpie1
bit: 0 interrupt enable flag of fisrt level NMI/exception nestting
Union type to access MSTACK_CTL CSR register.
rv_csr_t _reserved0
bit: 3..XLEN-1 Reserved
rv_csr_t ovf_track_en
bit: 0 Stack overflow check or track enable
rv_csr_t mode
bit: 2 Mode of stack checking
rv_csr_t d
Type used for csr data access.
rv_csr_t udf_en
bit: 1 Stack underflow check enable
Union type to access MSTATUSH CSR register.
rv_csr_t mpelp
bit: 9 Machine mode Previous Expected Landing Pad (ELP) State
rv_csr_t _reserved0
bit: 0..3 Reserved
rv_csr_t mbe
bit: 5 M-mode non-instruction-fetch memory accesse big-endian enable flag
rv_csr_t sbe
bit: 4 S-mode non-instruction-fetch memory accesse big-endian enable flag
rv_csr_t gva
bit: 6 Guest Virtual Address
rv_csr_t mpv
bit: 7 Machine Previous Virtualization Mode
rv_csr_t _reserved5
bit: 11..31 Reserved
rv_csr_t mdt
bit: 10 M-mode-disable-trap
rv_csr_t _reserved1
bit: 8 Reserved
rv_csr_t d
Type used for csr data access.
Union type to access MSTATUS CSR register.
rv_csr_t sd
bit: 31 Dirty status for XS or FS
rv_csr_t tvm
bit: 20 Trap Virtual Memory
rv_csr_t fs
bit: 13..14 FS status flag
rv_csr_t mpie
bit: 7 machine mode previous interrupt enable flag
rv_csr_t spie
bit: 5 supervisor mode interrupt enable flag
rv_csr_t sie
bit: 1 supervisor interrupt enable flag
rv_csr_t _reserved3
bit: 25..30 Reserved
rv_csr_t _reserved1
bit: 2 Reserved
rv_csr_t mxr
bit: 19 Make eXecutable Readable
rv_csr_t mprv
bit: 17 Modify PRiVilege
rv_csr_t mpp
bit: 11..12 machine previous privilede mode
rv_csr_t tw
bit: 21 Timeout Wait
rv_csr_t _reserved2
bit: 4 Reserved
rv_csr_t spp
bit: 8 supervisor previous privilede mode
rv_csr_t ube
bit: 6 U-mode non-instruction-fetch memory accesse big-endian enable flag
rv_csr_t mie
bit: 3 machine mode interrupt enable flag
rv_csr_t vs
bit: 9..10 vector status flag
rv_csr_t sum
bit: 18 Supervisor Mode load and store protection
rv_csr_t xs
bit: 15..16 XS status flag
rv_csr_t d
Type used for csr data access.
rv_csr_t tsr
bit: 22 Trap SRET
rv_csr_t _reserved0
bit: 0 Reserved
rv_csr_t sdt
bit: 24 S-mode-disable-trap
rv_csr_t spelp
bit: 23 Supervisor mode Previous Expected Landing Pad (ELP) State
Union type to access MSUBM CSR register.
rv_csr_t typ
bit: 6..7 current trap type
rv_csr_t _reserved1
bit: 10..XLEN-1 Reserved
rv_csr_t _reserved0
bit: 0..5 Reserved
rv_csr_t ptyp
bit: 8..9 previous trap type
rv_csr_t d
Type used for csr data access.
Union type to access MTLBCFG_INFO CSR register.
rv_csr_t i_size
bit: 16..18 ITLB size
rv_csr_t d
Type used for csr data access.
rv_csr_t _reserved2
bit: 22..XLEN-1 Reserved 0
rv_csr_t lsize
bit: 7..9 Main TLB line size or Reserved
rv_csr_t _reserved1
bit: 12..15 Reserved 0
rv_csr_t set
bit: 0..3 Main TLB entry per way
rv_csr_t d_size
bit: 19..21 DTLB size
rv_csr_t napot
bit: 11 TLB supports Svnapot or not
rv_csr_t way
bit: 4..6 Main TLB ways
rv_csr_t ecc
bit: 10 Main TLB supports ECC or not
Union type to access MTLB_CTL CSR register.
rv_csr_t tlb_ecc_chk_en
bit: 6 Controls to check the ECC when core access to MTLB
rv_csr_t d
Type used for csr data access.
rv_csr_t tlb_ecc_en
bit: 0 MTLB ECC eanble
rv_csr_t tlb_dram_ecc_inj_en
bit: 3 Controls to inject the ECC Code in CSR mecc_code to MTLB data rams
rv_csr_t tlb_ecc_excp_en
bit: 1 MTLB double bit ECC exception enable control
rv_csr_t tlb_tram_ecc_inj_en
bit: 2 Controls to inject the ECC Code in CSR mecc_code to MTLB tag rams
rv_csr_t _reserved0
bit: 4..5 Reserved
rv_csr_t napot_en
bit: 7 NAPOT page enable
rv_csr_t _reserved1
bit: 8..XLEN-1 Reserved
Union type to access MTVEC CSR register.
rv_csr_t addr
bit: 6..XLEN-1 mtvec address
rv_csr_t d
Type used for csr data access.
rv_csr_t mode
bit: 0..5 interrupt mode control