NMSIS-Core  Version 1.5.0
NMSIS-Core support for Nuclei processor-based devices
Intrinsic Functions for CPU Intructions

Functions that generate RISC-V CPU instructions. More...

Enumerations

enum  WFI_SleepMode_Type {
  WFI_SHALLOW_SLEEP = 0 ,
  WFI_DEEP_SLEEP = 1
}
 WFI Sleep Mode enumeration. More...
 

Functions

__STATIC_FORCEINLINE void __NOP (void)
 NOP Instruction. More...
 
__STATIC_FORCEINLINE void __WFI (void)
 Wait For Interrupt. More...
 
__STATIC_FORCEINLINE void __WFE (void)
 Wait For Event. More...
 
__STATIC_FORCEINLINE void __EBREAK (void)
 Breakpoint Instruction. More...
 
__STATIC_FORCEINLINE void __ECALL (void)
 Environment Call Instruction. More...
 
__STATIC_FORCEINLINE void __set_wfi_sleepmode (WFI_SleepMode_Type mode)
 Set Sleep mode of WFI. More...
 
__STATIC_FORCEINLINE void __TXEVT (void)
 Send TX Event. More...
 
__STATIC_FORCEINLINE void __enable_mcycle_counter (void)
 Enable MCYCLE counter. More...
 
__STATIC_FORCEINLINE void __disable_mcycle_counter (void)
 Disable MCYCLE counter. More...
 
__STATIC_FORCEINLINE void __enable_minstret_counter (void)
 Enable MINSTRET counter. More...
 
__STATIC_FORCEINLINE void __disable_minstret_counter (void)
 Disable MINSTRET counter. More...
 
__STATIC_FORCEINLINE void __enable_mhpm_counter (unsigned long idx)
 Enable selected hardware performance monitor counter. More...
 
__STATIC_FORCEINLINE void __disable_mhpm_counter (unsigned long idx)
 Disable selected hardware performance monitor counter. More...
 
__STATIC_FORCEINLINE void __enable_mhpm_counters (unsigned long mask)
 Enable hardware performance counters with mask. More...
 
__STATIC_FORCEINLINE void __disable_mhpm_counters (unsigned long mask)
 Disable hardware performance counters with mask. More...
 
__STATIC_FORCEINLINE void __enable_all_counter (void)
 Enable all MCYCLE & MINSTRET & MHPMCOUNTER counter. More...
 
__STATIC_FORCEINLINE void __disable_all_counter (void)
 Disable all MCYCLE & MINSTRET & MHPMCOUNTER counter. More...
 
__STATIC_INLINE void __set_hpm_event (unsigned long idx, unsigned long event)
 Set event for selected high performance monitor event. More...
 
__STATIC_INLINE unsigned long __get_hpm_event (unsigned long idx)
 Get event for selected high performance monitor event. More...
 
__STATIC_INLINE void __set_hpm_counter (unsigned long idx, uint64_t value)
 Set value for selected high performance monitor counter. More...
 
__STATIC_INLINE uint64_t __get_hpm_counter (unsigned long idx)
 Get value of selected high performance monitor counter. More...
 
__STATIC_INLINE unsigned long __read_hpm_counter (unsigned long idx)
 Get value of selected high performance monitor counter. More...
 
__STATIC_FORCEINLINE void __set_medeleg (unsigned long mask)
 Set exceptions delegation to S mode. More...
 
__STATIC_FORCEINLINE void __set_mideleg (unsigned long mask)
 Set interrupt delegation to S mode. More...
 
__STATIC_FORCEINLINE uint8_t __LB (volatile void *addr)
 Load 8bit value from address (8 bit) More...
 
__STATIC_FORCEINLINE uint16_t __LH (volatile void *addr)
 Load 16bit value from address (16 bit) More...
 
__STATIC_FORCEINLINE uint32_t __LW (volatile void *addr)
 Load 32bit value from address (32 bit) More...
 
__STATIC_FORCEINLINE void __SB (volatile void *addr, uint8_t val)
 Write 8bit value to address (8 bit) More...
 
__STATIC_FORCEINLINE void __SH (volatile void *addr, uint16_t val)
 Write 16bit value to address (16 bit) More...
 
__STATIC_FORCEINLINE void __SW (volatile void *addr, uint32_t val)
 Write 32bit value to address (32 bit) More...
 
__STATIC_INLINE uint32_t __CAS_W (volatile uint32_t *addr, uint32_t oldval, uint32_t newval)
 Compare and Swap 32bit value using LR and SC. More...
 
__STATIC_FORCEINLINE uint32_t __AMOSWAP_W (volatile uint32_t *addr, uint32_t newval)
 Atomic Swap 32bit value into memory. More...
 
__STATIC_FORCEINLINE int32_t __AMOADD_W (volatile int32_t *addr, int32_t value)
 Atomic Add with 32bit value. More...
 
__STATIC_FORCEINLINE int32_t __AMOAND_W (volatile int32_t *addr, int32_t value)
 Atomic And with 32bit value. More...
 
__STATIC_FORCEINLINE int32_t __AMOOR_W (volatile int32_t *addr, int32_t value)
 Atomic OR with 32bit value. More...
 
__STATIC_FORCEINLINE int32_t __AMOXOR_W (volatile int32_t *addr, int32_t value)
 Atomic XOR with 32bit value. More...
 
__STATIC_FORCEINLINE uint32_t __AMOMAXU_W (volatile uint32_t *addr, uint32_t value)
 Atomic unsigned MAX with 32bit value. More...
 
__STATIC_FORCEINLINE int32_t __AMOMAX_W (volatile int32_t *addr, int32_t value)
 Atomic signed MAX with 32bit value. More...
 
__STATIC_FORCEINLINE uint32_t __AMOMINU_W (volatile uint32_t *addr, uint32_t value)
 Atomic unsigned MIN with 32bit value. More...
 
__STATIC_FORCEINLINE int32_t __AMOMIN_W (volatile int32_t *addr, int32_t value)
 Atomic signed MIN with 32bit value. More...
 
__STATIC_FORCEINLINE void __enable_ic_prefetch (void)
 Enable ICache prefetch. More...
 
__STATIC_FORCEINLINE void __disable_ic_prefetch (void)
 Disable ICache prefetch. More...
 
__STATIC_FORCEINLINE void __enable_ic_cmo_prefetch (void)
 Enable ICache CMO prefetch. More...
 
__STATIC_FORCEINLINE void __disable_ic_cmo_prefetch (void)
 Disable ICache CMO prefetch. More...
 
__STATIC_FORCEINLINE void __enable_dc_cmo_prefetch (void)
 Enable DCache CMO prefetch. More...
 
__STATIC_FORCEINLINE void __disable_dc_cmo_prefetch (void)
 Disable DCache CMO prefetch. More...
 
__STATIC_FORCEINLINE void __cmo_prefetch_i (const void *addr)
 Instruction prefetch operation. More...
 
__STATIC_FORCEINLINE void __cmo_prefetch_r (const void *addr)
 Read prefetch operation. More...
 
__STATIC_FORCEINLINE void __cmo_prefetch_w (const void *addr)
 Write prefetch operation. More...
 

Detailed Description

Functions that generate RISC-V CPU instructions.

The following functions generate specified RISC-V instructions that cannot be directly accessed by compiler.

Enumeration Type Documentation

◆ WFI_SleepMode_Type

WFI Sleep Mode enumeration.

Enumerator
WFI_SHALLOW_SLEEP 

Shallow sleep mode, the core_clk will poweroff.

WFI_DEEP_SLEEP 

Deep sleep mode, the core_clk and core_ano_clk will poweroff.

Definition at line 1568 of file core_feature_base.h.

1568  {
1569  WFI_SHALLOW_SLEEP = 0,
1570  WFI_DEEP_SLEEP = 1
WFI_SleepMode_Type
WFI Sleep Mode enumeration.
@ 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.

Function Documentation

◆ __AMOADD_W()

__STATIC_FORCEINLINE int32_t __AMOADD_W ( volatile int32_t *  addr,
int32_t  value 
)

Atomic Add with 32bit value.

Atomically ADD 32bit value with value in memory using amoadd.d.

Parameters
[in]addrAddress pointer to data, address need to be 4byte aligned
[in]valuevalue to be ADDed
Returns
return memory value + add value

Definition at line 2357 of file core_feature_base.h.

2358 {
2359  int32_t result;
2360 
2361  __ASM volatile ("amoadd.w %0, %2, %1" : \
2362  "=r"(result), "+A"(*addr) : "r"(value) : "memory");
2363  return *addr;
2364 }
#define __ASM
Pass information from the compiler to the assembler.
Definition: nmsis_gcc.h:55

References __ASM.

◆ __AMOAND_W()

__STATIC_FORCEINLINE int32_t __AMOAND_W ( volatile int32_t *  addr,
int32_t  value 
)

Atomic And with 32bit value.

Atomically AND 32bit value with value in memory using amoand.d.

Parameters
[in]addrAddress pointer to data, address need to be 4byte aligned
[in]valuevalue to be ANDed
Returns
return memory value & and value

Definition at line 2373 of file core_feature_base.h.

2374 {
2375  int32_t result;
2376 
2377  __ASM volatile ("amoand.w %0, %2, %1" : \
2378  "=r"(result), "+A"(*addr) : "r"(value) : "memory");
2379  return *addr;
2380 }

References __ASM.

◆ __AMOMAX_W()

__STATIC_FORCEINLINE int32_t __AMOMAX_W ( volatile int32_t *  addr,
int32_t  value 
)

Atomic signed MAX with 32bit value.

Atomically signed max compare 32bit value with value in memory using amomax.d.

Parameters
[in]addrAddress pointer to data, address need to be 4byte aligned
[in]valuevalue to be compared
Returns
the bigger value

Definition at line 2437 of file core_feature_base.h.

2438 {
2439  int32_t result;
2440 
2441  __ASM volatile ("amomax.w %0, %2, %1" : \
2442  "=r"(result), "+A"(*addr) : "r"(value) : "memory");
2443  return *addr;
2444 }

References __ASM.

◆ __AMOMAXU_W()

__STATIC_FORCEINLINE uint32_t __AMOMAXU_W ( volatile uint32_t *  addr,
uint32_t  value 
)

Atomic unsigned MAX with 32bit value.

Atomically unsigned max compare 32bit value with value in memory using amomaxu.d.

Parameters
[in]addrAddress pointer to data, address need to be 4byte aligned
[in]valuevalue to be compared
Returns
return the bigger value

Definition at line 2421 of file core_feature_base.h.

2422 {
2423  uint32_t result;
2424 
2425  __ASM volatile ("amomaxu.w %0, %2, %1" : \
2426  "=r"(result), "+A"(*addr) : "r"(value) : "memory");
2427  return *addr;
2428 }

References __ASM.

◆ __AMOMIN_W()

__STATIC_FORCEINLINE int32_t __AMOMIN_W ( volatile int32_t *  addr,
int32_t  value 
)

Atomic signed MIN with 32bit value.

Atomically signed min compare 32bit value with value in memory using amomin.d.

Parameters
[in]addrAddress pointer to data, address need to be 4byte aligned
[in]valuevalue to be compared
Returns
the smaller value

Definition at line 2469 of file core_feature_base.h.

2470 {
2471  int32_t result;
2472 
2473  __ASM volatile ("amomin.w %0, %2, %1" : \
2474  "=r"(result), "+A"(*addr) : "r"(value) : "memory");
2475  return *addr;
2476 }

References __ASM.

◆ __AMOMINU_W()

__STATIC_FORCEINLINE uint32_t __AMOMINU_W ( volatile uint32_t *  addr,
uint32_t  value 
)

Atomic unsigned MIN with 32bit value.

Atomically unsigned min compare 32bit value with value in memory using amominu.d.

Parameters
[in]addrAddress pointer to data, address need to be 4byte aligned
[in]valuevalue to be compared
Returns
the smaller value

Definition at line 2453 of file core_feature_base.h.

2454 {
2455  uint32_t result;
2456 
2457  __ASM volatile ("amominu.w %0, %2, %1" : \
2458  "=r"(result), "+A"(*addr) : "r"(value) : "memory");
2459  return *addr;
2460 }

References __ASM.

◆ __AMOOR_W()

__STATIC_FORCEINLINE int32_t __AMOOR_W ( volatile int32_t *  addr,
int32_t  value 
)

Atomic OR with 32bit value.

Atomically OR 32bit value with value in memory using amoor.d.

Parameters
[in]addrAddress pointer to data, address need to be 4byte aligned
[in]valuevalue to be ORed
Returns
return memory value | and value

Definition at line 2389 of file core_feature_base.h.

2390 {
2391  int32_t result;
2392 
2393  __ASM volatile ("amoor.w %0, %2, %1" : \
2394  "=r"(result), "+A"(*addr) : "r"(value) : "memory");
2395  return *addr;
2396 }

References __ASM.

◆ __AMOSWAP_W()

__STATIC_FORCEINLINE uint32_t __AMOSWAP_W ( volatile uint32_t *  addr,
uint32_t  newval 
)

Atomic Swap 32bit value into memory.

Atomically swap new 32bit value into memory using amoswap.d.

Parameters
[in]addrAddress pointer to data, address need to be 4byte aligned
[in]newvalNew value to be stored into the address
Returns
return the original value in memory

Definition at line 2341 of file core_feature_base.h.

2342 {
2343  uint32_t result;
2344 
2345  __ASM volatile ("amoswap.w %0, %2, %1" : \
2346  "=r"(result), "+A"(*addr) : "r"(newval) : "memory");
2347  return result;
2348 }

References __ASM.

◆ __AMOXOR_W()

__STATIC_FORCEINLINE int32_t __AMOXOR_W ( volatile int32_t *  addr,
int32_t  value 
)

Atomic XOR with 32bit value.

Atomically XOR 32bit value with value in memory using amoxor.d.

Parameters
[in]addrAddress pointer to data, address need to be 4byte aligned
[in]valuevalue to be XORed
Returns
return memory value ^ and value

Definition at line 2405 of file core_feature_base.h.

2406 {
2407  int32_t result;
2408 
2409  __ASM volatile ("amoxor.w %0, %2, %1" : \
2410  "=r"(result), "+A"(*addr) : "r"(value) : "memory");
2411  return *addr;
2412 }

References __ASM.

◆ __CAS_W()

__STATIC_INLINE uint32_t __CAS_W ( volatile uint32_t *  addr,
uint32_t  oldval,
uint32_t  newval 
)

Compare and Swap 32bit value using LR and SC.

Compare old value with memory, if identical, store new value in memory. Return the initial value in memory. Success is indicated by comparing return value with OLD. memory address, return 0 if successful, otherwise return !0

Parameters
[in]addrAddress pointer to data, address need to be 4byte aligned
[in]oldvalOld value of the data in address
[in]newvalNew value to be stored into the address
Returns
return the initial value in memory

Definition at line 2317 of file core_feature_base.h.

2318 {
2319  uint32_t result;
2320  uint32_t rc;
2321 
2322  __ASM volatile ( \
2323  "0: lr.w %0, %2 \n" \
2324  " bne %0, %z3, 1f \n" \
2325  " sc.w %1, %z4, %2 \n" \
2326  " bnez %1, 0b \n" \
2327  "1:\n" \
2328  : "=&r"(result), "=&r"(rc), "+A"(*addr) \
2329  : "r"(oldval), "r"(newval) \
2330  : "memory");
2331  return result;
2332 }

References __ASM.

◆ __cmo_prefetch_i()

__STATIC_FORCEINLINE void __cmo_prefetch_i ( const void *  addr)

Instruction prefetch operation.

Performs an instruction prefetch operation for the specified address using the RISC-V prefetch.i instruction.

Parameters
[in]addrAddress to prefetch
Remarks
Before calling this function, ensure that the hardware supports CMO prefetch and that the code is compiled with the _zicbop extension enabled. Here is a code example to check if CMO prefetch is supported:
if (IINFO_IsCMOPrefetchSupported()) {
}
__STATIC_FORCEINLINE void __cmo_prefetch_i(const void *addr)
Instruction prefetch operation.
See also
  • IINFO_IsCMOPrefetchSupported

Definition at line 2731 of file core_feature_base.h.

2732 {
2733  __ASM volatile ("prefetch.i 0(%0)" : : "r" (addr) : "memory");
2734 }

References __ASM.

◆ __cmo_prefetch_r()

__STATIC_FORCEINLINE void __cmo_prefetch_r ( const void *  addr)

Read prefetch operation.

Performs a read prefetch operation for the specified address using the RISC-V prefetch.r instruction.

Parameters
[in]addrAddress to prefetch
Remarks
Before calling this function, ensure that the hardware supports CMO prefetch and that the code is compiled with the _zicbop extension enabled. Here is a code example to check if CMO prefetch is supported:
if (IINFO_IsCMOPrefetchSupported()) {
}
__STATIC_FORCEINLINE void __cmo_prefetch_r(const void *addr)
Read prefetch operation.
See also
  • IINFO_IsCMOPrefetchSupported

Definition at line 2755 of file core_feature_base.h.

2756 {
2757  __ASM volatile ("prefetch.r 0(%0)" : : "r" (addr) : "memory");
2758 }

References __ASM.

◆ __cmo_prefetch_w()

__STATIC_FORCEINLINE void __cmo_prefetch_w ( const void *  addr)

Write prefetch operation.

Performs a write prefetch operation for the specified address using the RISC-V prefetch.w instruction.

Parameters
[in]addrAddress to prefetch
Remarks
Before calling this function, ensure that the hardware supports CMO prefetch and that the code is compiled with the _zicbop extension enabled. Here is a code example to check if CMO prefetch is supported:
if (IINFO_IsCMOPrefetchSupported()) {
}
__STATIC_FORCEINLINE void __cmo_prefetch_w(const void *addr)
Write prefetch operation.
See also
  • IINFO_IsCMOPrefetchSupported

Definition at line 2779 of file core_feature_base.h.

2780 {
2781  __ASM volatile ("prefetch.w 0(%0)" : : "r" (addr) : "memory");
2782 }

References __ASM.

◆ __disable_all_counter()

__STATIC_FORCEINLINE void __disable_all_counter ( void  )

Disable all MCYCLE & MINSTRET & MHPMCOUNTER counter.

Set all to one to disable all counters, such as cycle, instret, high performance monitor counters

Definition at line 1699 of file core_feature_base.h.

1700 {
1701  __RV_CSR_SET(CSR_MCOUNTINHIBIT, 0xFFFFFFFF);
1702 }
#define __RV_CSR_SET(csr, val)
CSR operation Macro for csrs instruction.
#define CSR_MCOUNTINHIBIT

References __RV_CSR_SET, and CSR_MCOUNTINHIBIT.

◆ __disable_dc_cmo_prefetch()

__STATIC_FORCEINLINE void __disable_dc_cmo_prefetch ( void  )

Disable DCache CMO prefetch.

Clear the DC_CMO_PF_EN bit in the MCACHE_CTL CSR to disable DCache prefetch.

Definition at line 2707 of file core_feature_base.h.

2708 {
2710 }
#define MCACHE_CTL_DC_CMO_PF_EN
#define __RV_CSR_CLEAR(csr, val)
CSR operation Macro for csrc instruction.
#define CSR_MCACHE_CTL

References __RV_CSR_CLEAR, CSR_MCACHE_CTL, and MCACHE_CTL_DC_CMO_PF_EN.

◆ __disable_ic_cmo_prefetch()

__STATIC_FORCEINLINE void __disable_ic_cmo_prefetch ( void  )

Disable ICache CMO prefetch.

Clear the IC_CMO_PF_EN bit in the MCACHE_CTL CSR to disable ICache prefetch.

Definition at line 2687 of file core_feature_base.h.

2688 {
2690 }
#define MCACHE_CTL_IC_CMO_PF_EN

References __RV_CSR_CLEAR, CSR_MCACHE_CTL, and MCACHE_CTL_IC_CMO_PF_EN.

◆ __disable_ic_prefetch()

__STATIC_FORCEINLINE void __disable_ic_prefetch ( void  )

Disable ICache prefetch.

Clear the IC_PF_EN bit in the MCACHE_CTL CSR to disable ICache prefetch.

Definition at line 2667 of file core_feature_base.h.

2668 {
2670 }
#define MCACHE_CTL_IC_PF_EN

References __RV_CSR_CLEAR, CSR_MCACHE_CTL, and MCACHE_CTL_IC_PF_EN.

◆ __disable_mcycle_counter()

__STATIC_FORCEINLINE void __disable_mcycle_counter ( void  )

Disable MCYCLE counter.

Set the CY bit of MCOUNTINHIBIT to 1 to disable MCYCLE Counter

Definition at line 1611 of file core_feature_base.h.

1612 {
1614 }
#define MCOUNTINHIBIT_CY

References __RV_CSR_SET, CSR_MCOUNTINHIBIT, and MCOUNTINHIBIT_CY.

◆ __disable_mhpm_counter()

__STATIC_FORCEINLINE void __disable_mhpm_counter ( unsigned long  idx)

Disable selected hardware performance monitor counter.

Parameters
[in]idxthe index of the hardware performance monitor counter

Disable selected hardware performance monitor counter mhpmcounterx.

Definition at line 1653 of file core_feature_base.h.

1654 {
1655  __RV_CSR_SET(CSR_MCOUNTINHIBIT, (1UL << idx));
1656 }

References __RV_CSR_SET, and CSR_MCOUNTINHIBIT.

◆ __disable_mhpm_counters()

__STATIC_FORCEINLINE void __disable_mhpm_counters ( unsigned long  mask)

Disable hardware performance counters with mask.

Parameters
[in]maskmask of selected hardware performance monitor counters

Disable mhpmcounterx with mask, only the masked ones will be disabled. mhpmcounter3-mhpmcount31 are for high performance monitor counters.

Definition at line 1677 of file core_feature_base.h.

1678 {
1680 }

References __RV_CSR_SET, and CSR_MCOUNTINHIBIT.

◆ __disable_minstret_counter()

__STATIC_FORCEINLINE void __disable_minstret_counter ( void  )

Disable MINSTRET counter.

Set the IR bit of MCOUNTINHIBIT to 1 to disable MINSTRET Counter

Definition at line 1631 of file core_feature_base.h.

1632 {
1634 }
#define MCOUNTINHIBIT_IR

References __RV_CSR_SET, CSR_MCOUNTINHIBIT, and MCOUNTINHIBIT_IR.

◆ __EBREAK()

__STATIC_FORCEINLINE void __EBREAK ( void  )

Breakpoint Instruction.

Causes the processor to enter Debug state. Debug tools can use this to investigate system state when the instruction at a particular address is reached.

Definition at line 1549 of file core_feature_base.h.

1550 {
1551  __ASM volatile("ebreak");
1552 }

References __ASM.

◆ __ECALL()

__STATIC_FORCEINLINE void __ECALL ( void  )

Environment Call Instruction.

The ECALL instruction is used to make a service request to the execution environment.

Definition at line 1560 of file core_feature_base.h.

1561 {
1562  __ASM volatile("ecall");
1563 }

References __ASM.

◆ __enable_all_counter()

__STATIC_FORCEINLINE void __enable_all_counter ( void  )

Enable all MCYCLE & MINSTRET & MHPMCOUNTER counter.

Clear all to zero to enable all counters, such as cycle, instret, high performance monitor counters

Definition at line 1688 of file core_feature_base.h.

1689 {
1690  __RV_CSR_CLEAR(CSR_MCOUNTINHIBIT, 0xFFFFFFFF);
1691 }

References __RV_CSR_CLEAR, and CSR_MCOUNTINHIBIT.

Referenced by __prepare_bench_env().

◆ __enable_dc_cmo_prefetch()

__STATIC_FORCEINLINE void __enable_dc_cmo_prefetch ( void  )

Enable DCache CMO prefetch.

Set the DC_CMO_PF_EN bit in the MCACHE_CTL CSR to enable DCache prefetch.

Definition at line 2697 of file core_feature_base.h.

References __RV_CSR_SET, CSR_MCACHE_CTL, and MCACHE_CTL_DC_CMO_PF_EN.

◆ __enable_ic_cmo_prefetch()

__STATIC_FORCEINLINE void __enable_ic_cmo_prefetch ( void  )

Enable ICache CMO prefetch.

Set the IC_CMO_PF_EN bit in the MCACHE_CTL CSR to enable ICache prefetch.

Definition at line 2677 of file core_feature_base.h.

References __RV_CSR_SET, CSR_MCACHE_CTL, and MCACHE_CTL_IC_CMO_PF_EN.

◆ __enable_ic_prefetch()

__STATIC_FORCEINLINE void __enable_ic_prefetch ( void  )

Enable ICache prefetch.

Set the IC_PF_EN bit in the MCACHE_CTL CSR to enable ICache prefetch.

Definition at line 2657 of file core_feature_base.h.

2658 {
2660 }

References __RV_CSR_SET, CSR_MCACHE_CTL, and MCACHE_CTL_IC_PF_EN.

◆ __enable_mcycle_counter()

__STATIC_FORCEINLINE void __enable_mcycle_counter ( void  )

Enable MCYCLE counter.

Clear the CY bit of MCOUNTINHIBIT to 0 to enable MCYCLE Counter

Definition at line 1601 of file core_feature_base.h.

References __RV_CSR_CLEAR, CSR_MCOUNTINHIBIT, and MCOUNTINHIBIT_CY.

◆ __enable_mhpm_counter()

__STATIC_FORCEINLINE void __enable_mhpm_counter ( unsigned long  idx)

Enable selected hardware performance monitor counter.

Parameters
[in]idxthe index of the hardware performance monitor counter

enable selected hardware performance monitor counter mhpmcounterx.

Definition at line 1642 of file core_feature_base.h.

1643 {
1644  __RV_CSR_CLEAR(CSR_MCOUNTINHIBIT, (1UL << idx));
1645 }

References __RV_CSR_CLEAR, and CSR_MCOUNTINHIBIT.

◆ __enable_mhpm_counters()

__STATIC_FORCEINLINE void __enable_mhpm_counters ( unsigned long  mask)

Enable hardware performance counters with mask.

Parameters
[in]maskmask of selected hardware performance monitor counters

enable mhpmcounterx with mask, only the masked ones will be enabled. mhpmcounter3-mhpmcount31 are for high performance monitor counters.

Definition at line 1665 of file core_feature_base.h.

1666 {
1668 }

References __RV_CSR_CLEAR, and CSR_MCOUNTINHIBIT.

◆ __enable_minstret_counter()

__STATIC_FORCEINLINE void __enable_minstret_counter ( void  )

Enable MINSTRET counter.

Clear the IR bit of MCOUNTINHIBIT to 0 to enable MINSTRET Counter

Definition at line 1621 of file core_feature_base.h.

References __RV_CSR_CLEAR, CSR_MCOUNTINHIBIT, and MCOUNTINHIBIT_IR.

◆ __get_hpm_counter()

__STATIC_INLINE uint64_t __get_hpm_counter ( unsigned long  idx)

Get value of selected high performance monitor counter.

Parameters
[in]idxHPMCOUNTERx CSR index(3-31)

Get high performance monitor counter register value

Returns
HPMCOUNTERx Register value

Definition at line 1934 of file core_feature_base.h.

1935 {
1936  __RWMB(); // Make sure previous memory and io operation finished
1937 #if __RISCV_XLEN == 32
1938  volatile uint32_t high0, low, high;
1939  uint64_t full;
1940 
1941  switch (idx) {
1942  case 0: return __get_rv_cycle();
1943  case 2: return __get_rv_instret();
1944  case 3: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER3H);
1947  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER3); }
1948  full = (((uint64_t)high) << 32) | low; return full;
1949  case 4: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER4H);
1952  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER4); }
1953  full = (((uint64_t)high) << 32) | low; return full;
1954  case 5: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER5H);
1957  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER5); }
1958  full = (((uint64_t)high) << 32) | low; return full;
1959  case 6: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER6H);
1962  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER6); }
1963  full = (((uint64_t)high) << 32) | low; return full;
1964  case 7: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER7H);
1967  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER7); }
1968  full = (((uint64_t)high) << 32) | low; return full;
1969  case 8: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER8H);
1972  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER8); }
1973  full = (((uint64_t)high) << 32) | low; return full;
1974  case 9: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER9H);
1977  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER9); }
1978  full = (((uint64_t)high) << 32) | low; return full;
1979  case 10: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER10H);
1982  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER10); }
1983  full = (((uint64_t)high) << 32) | low; return full;
1984  case 11: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER11H);
1987  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER11); }
1988  full = (((uint64_t)high) << 32) | low; return full;
1989  case 12: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER12H);
1992  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER12); }
1993  full = (((uint64_t)high) << 32) | low; return full;
1994  case 13: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER13H);
1997  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER13); }
1998  full = (((uint64_t)high) << 32) | low; return full;
1999  case 14: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER14H);
2002  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER14); }
2003  full = (((uint64_t)high) << 32) | low; return full;
2004  case 15: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER15H);
2007  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER15); }
2008  full = (((uint64_t)high) << 32) | low; return full;
2009  case 16: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER16H);
2012  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER16); }
2013  full = (((uint64_t)high) << 32) | low; return full;
2014  case 17: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER17H);
2017  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER17); }
2018  full = (((uint64_t)high) << 32) | low; return full;
2019  case 18: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER18H);
2022  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER18); }
2023  full = (((uint64_t)high) << 32) | low; return full;
2024  case 19: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER19H);
2027  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER19); }
2028  full = (((uint64_t)high) << 32) | low; return full;
2029  case 20: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER20H);
2032  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER20); }
2033  full = (((uint64_t)high) << 32) | low; return full;
2034  case 21: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER21H);
2037  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER21); }
2038  full = (((uint64_t)high) << 32) | low; return full;
2039  case 22: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER22H);
2042  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER22); }
2043  full = (((uint64_t)high) << 32) | low; return full;
2044  case 23: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER23H);
2047  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER23); }
2048  full = (((uint64_t)high) << 32) | low; return full;
2049  case 24: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER24H);
2052  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER24); }
2053  full = (((uint64_t)high) << 32) | low; return full;
2054  case 25: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER25H);
2057  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER25); }
2058  full = (((uint64_t)high) << 32) | low; return full;
2059  case 26: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER26H);
2062  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER26); }
2063  full = (((uint64_t)high) << 32) | low; return full;
2064  case 27: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER27H);
2067  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER27); }
2068  full = (((uint64_t)high) << 32) | low; return full;
2069  case 28: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER28H);
2072  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER28); }
2073  full = (((uint64_t)high) << 32) | low; return full;
2074  case 29: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER29H);
2077  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER29); }
2078  full = (((uint64_t)high) << 32) | low; return full;
2079  case 30: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER30H);
2082  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER30); }
2083  full = (((uint64_t)high) << 32) | low; return full;
2084  case 31: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER31H);
2087  if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER31); }
2088  full = (((uint64_t)high) << 32) | low; return full;
2089 
2090 #elif __RISCV_XLEN == 64
2091  switch (idx) {
2092  case 0: return __get_rv_cycle();
2093  case 2: return __get_rv_instret();
2094  case 3: return __RV_CSR_READ(CSR_MHPMCOUNTER3);
2095  case 4: return __RV_CSR_READ(CSR_MHPMCOUNTER4);
2096  case 5: return __RV_CSR_READ(CSR_MHPMCOUNTER5);
2097  case 6: return __RV_CSR_READ(CSR_MHPMCOUNTER6);
2098  case 7: return __RV_CSR_READ(CSR_MHPMCOUNTER7);
2099  case 8: return __RV_CSR_READ(CSR_MHPMCOUNTER8);
2100  case 9: return __RV_CSR_READ(CSR_MHPMCOUNTER9);
2101  case 10: return __RV_CSR_READ(CSR_MHPMCOUNTER10);
2102  case 11: return __RV_CSR_READ(CSR_MHPMCOUNTER11);
2103  case 12: return __RV_CSR_READ(CSR_MHPMCOUNTER12);
2104  case 13: return __RV_CSR_READ(CSR_MHPMCOUNTER13);
2105  case 14: return __RV_CSR_READ(CSR_MHPMCOUNTER14);
2106  case 15: return __RV_CSR_READ(CSR_MHPMCOUNTER15);
2107  case 16: return __RV_CSR_READ(CSR_MHPMCOUNTER16);
2108  case 17: return __RV_CSR_READ(CSR_MHPMCOUNTER17);
2109  case 18: return __RV_CSR_READ(CSR_MHPMCOUNTER18);
2110  case 19: return __RV_CSR_READ(CSR_MHPMCOUNTER19);
2111  case 20: return __RV_CSR_READ(CSR_MHPMCOUNTER20);
2112  case 21: return __RV_CSR_READ(CSR_MHPMCOUNTER21);
2113  case 22: return __RV_CSR_READ(CSR_MHPMCOUNTER22);
2114  case 23: return __RV_CSR_READ(CSR_MHPMCOUNTER23);
2115  case 24: return __RV_CSR_READ(CSR_MHPMCOUNTER24);
2116  case 25: return __RV_CSR_READ(CSR_MHPMCOUNTER25);
2117  case 26: return __RV_CSR_READ(CSR_MHPMCOUNTER26);
2118  case 27: return __RV_CSR_READ(CSR_MHPMCOUNTER27);
2119  case 28: return __RV_CSR_READ(CSR_MHPMCOUNTER28);
2120  case 29: return __RV_CSR_READ(CSR_MHPMCOUNTER29);
2121  case 30: return __RV_CSR_READ(CSR_MHPMCOUNTER30);
2122  case 31: return __RV_CSR_READ(CSR_MHPMCOUNTER31);
2123 
2124 #else
2125  switch (idx) {
2126 #endif
2127  default: return 0;
2128  }
2129 }
#define __RV_CSR_READ(csr)
CSR operation Macro for csrr instruction.
#define __RWMB()
Read & Write Memory barrier.
__STATIC_INLINE rv_counter_t __get_rv_cycle(void)
Read whole 64 bits value of mcycle counter.
__STATIC_INLINE rv_counter_t __get_rv_instret(void)
Read whole 64 bits value of machine instruction-retired counter.
#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_MHPMCOUNTER7
#define CSR_MHPMCOUNTER29H
#define CSR_MHPMCOUNTER26
#define CSR_MHPMCOUNTER14
#define CSR_MHPMCOUNTER10H
#define CSR_MHPMCOUNTER6
#define CSR_MHPMCOUNTER5
#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_MHPMCOUNTER8
#define CSR_MHPMCOUNTER9
#define CSR_MHPMCOUNTER6H
#define CSR_MHPMCOUNTER23H
#define CSR_MHPMCOUNTER17
#define CSR_MHPMCOUNTER11
#define CSR_MHPMCOUNTER15H
#define CSR_MHPMCOUNTER3
#define CSR_MHPMCOUNTER10
#define CSR_MHPMCOUNTER14H
#define CSR_MHPMCOUNTER29
#define CSR_MHPMCOUNTER4
#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

References __get_rv_cycle(), __get_rv_instret(), __RV_CSR_READ, __RWMB, CSR_MHPMCOUNTER10, CSR_MHPMCOUNTER10H, CSR_MHPMCOUNTER11, CSR_MHPMCOUNTER11H, CSR_MHPMCOUNTER12, CSR_MHPMCOUNTER12H, CSR_MHPMCOUNTER13, CSR_MHPMCOUNTER13H, CSR_MHPMCOUNTER14, CSR_MHPMCOUNTER14H, CSR_MHPMCOUNTER15, CSR_MHPMCOUNTER15H, CSR_MHPMCOUNTER16, CSR_MHPMCOUNTER16H, CSR_MHPMCOUNTER17, CSR_MHPMCOUNTER17H, CSR_MHPMCOUNTER18, CSR_MHPMCOUNTER18H, CSR_MHPMCOUNTER19, CSR_MHPMCOUNTER19H, CSR_MHPMCOUNTER20, CSR_MHPMCOUNTER20H, CSR_MHPMCOUNTER21, CSR_MHPMCOUNTER21H, CSR_MHPMCOUNTER22, CSR_MHPMCOUNTER22H, CSR_MHPMCOUNTER23, CSR_MHPMCOUNTER23H, CSR_MHPMCOUNTER24, CSR_MHPMCOUNTER24H, CSR_MHPMCOUNTER25, CSR_MHPMCOUNTER25H, CSR_MHPMCOUNTER26, CSR_MHPMCOUNTER26H, CSR_MHPMCOUNTER27, CSR_MHPMCOUNTER27H, CSR_MHPMCOUNTER28, CSR_MHPMCOUNTER28H, CSR_MHPMCOUNTER29, CSR_MHPMCOUNTER29H, CSR_MHPMCOUNTER3, CSR_MHPMCOUNTER30, CSR_MHPMCOUNTER30H, CSR_MHPMCOUNTER31, CSR_MHPMCOUNTER31H, CSR_MHPMCOUNTER3H, CSR_MHPMCOUNTER4, CSR_MHPMCOUNTER4H, CSR_MHPMCOUNTER5, CSR_MHPMCOUNTER5H, CSR_MHPMCOUNTER6, CSR_MHPMCOUNTER6H, CSR_MHPMCOUNTER7, CSR_MHPMCOUNTER7H, CSR_MHPMCOUNTER8, CSR_MHPMCOUNTER8H, CSR_MHPMCOUNTER9, and CSR_MHPMCOUNTER9H.

◆ __get_hpm_event()

__STATIC_INLINE unsigned long __get_hpm_event ( unsigned long  idx)

Get event for selected high performance monitor event.

Parameters
[in]idxHPMEVENTx CSR index(3-31)
[in]eventHPMEVENTx Register value to set

Get high performance monitor event register value

Returns
HPMEVENTx Register value

Definition at line 1755 of file core_feature_base.h.

1756 {
1757  switch (idx) {
1758  case 3: return __RV_CSR_READ(CSR_MHPMEVENT3);
1759  case 4: return __RV_CSR_READ(CSR_MHPMEVENT4);
1760  case 5: return __RV_CSR_READ(CSR_MHPMEVENT5);
1761  case 6: return __RV_CSR_READ(CSR_MHPMEVENT6);
1762  case 7: return __RV_CSR_READ(CSR_MHPMEVENT7);
1763  case 8: return __RV_CSR_READ(CSR_MHPMEVENT8);
1764  case 9: return __RV_CSR_READ(CSR_MHPMEVENT9);
1765  case 10: return __RV_CSR_READ(CSR_MHPMEVENT10);
1766  case 11: return __RV_CSR_READ(CSR_MHPMEVENT11);
1767  case 12: return __RV_CSR_READ(CSR_MHPMEVENT12);
1768  case 13: return __RV_CSR_READ(CSR_MHPMEVENT13);
1769  case 14: return __RV_CSR_READ(CSR_MHPMEVENT14);
1770  case 15: return __RV_CSR_READ(CSR_MHPMEVENT15);
1771  case 16: return __RV_CSR_READ(CSR_MHPMEVENT16);
1772  case 17: return __RV_CSR_READ(CSR_MHPMEVENT17);
1773  case 18: return __RV_CSR_READ(CSR_MHPMEVENT18);
1774  case 19: return __RV_CSR_READ(CSR_MHPMEVENT19);
1775  case 20: return __RV_CSR_READ(CSR_MHPMEVENT20);
1776  case 21: return __RV_CSR_READ(CSR_MHPMEVENT21);
1777  case 22: return __RV_CSR_READ(CSR_MHPMEVENT22);
1778  case 23: return __RV_CSR_READ(CSR_MHPMEVENT23);
1779  case 24: return __RV_CSR_READ(CSR_MHPMEVENT24);
1780  case 25: return __RV_CSR_READ(CSR_MHPMEVENT25);
1781  case 26: return __RV_CSR_READ(CSR_MHPMEVENT26);
1782  case 27: return __RV_CSR_READ(CSR_MHPMEVENT27);
1783  case 28: return __RV_CSR_READ(CSR_MHPMEVENT28);
1784  case 29: return __RV_CSR_READ(CSR_MHPMEVENT29);
1785  case 30: return __RV_CSR_READ(CSR_MHPMEVENT30);
1786  case 31: return __RV_CSR_READ(CSR_MHPMEVENT31);
1787  default: return 0;
1788  }
1789 }
#define CSR_MHPMEVENT6
#define CSR_MHPMEVENT29
#define CSR_MHPMEVENT18
#define CSR_MHPMEVENT31
#define CSR_MHPMEVENT17
#define CSR_MHPMEVENT20
#define CSR_MHPMEVENT5
#define CSR_MHPMEVENT9
#define CSR_MHPMEVENT13
#define CSR_MHPMEVENT16
#define CSR_MHPMEVENT24
#define CSR_MHPMEVENT26
#define CSR_MHPMEVENT21
#define CSR_MHPMEVENT3
#define CSR_MHPMEVENT14
#define CSR_MHPMEVENT27
#define CSR_MHPMEVENT19
#define CSR_MHPMEVENT15
#define CSR_MHPMEVENT11
#define CSR_MHPMEVENT4
#define CSR_MHPMEVENT8
#define CSR_MHPMEVENT7
#define CSR_MHPMEVENT12
#define CSR_MHPMEVENT25
#define CSR_MHPMEVENT22
#define CSR_MHPMEVENT30
#define CSR_MHPMEVENT10
#define CSR_MHPMEVENT23
#define CSR_MHPMEVENT28

References __RV_CSR_READ, CSR_MHPMEVENT10, CSR_MHPMEVENT11, CSR_MHPMEVENT12, CSR_MHPMEVENT13, CSR_MHPMEVENT14, CSR_MHPMEVENT15, CSR_MHPMEVENT16, CSR_MHPMEVENT17, CSR_MHPMEVENT18, CSR_MHPMEVENT19, CSR_MHPMEVENT20, CSR_MHPMEVENT21, CSR_MHPMEVENT22, CSR_MHPMEVENT23, CSR_MHPMEVENT24, CSR_MHPMEVENT25, CSR_MHPMEVENT26, CSR_MHPMEVENT27, CSR_MHPMEVENT28, CSR_MHPMEVENT29, CSR_MHPMEVENT3, CSR_MHPMEVENT30, CSR_MHPMEVENT31, CSR_MHPMEVENT4, CSR_MHPMEVENT5, CSR_MHPMEVENT6, CSR_MHPMEVENT7, CSR_MHPMEVENT8, and CSR_MHPMEVENT9.

◆ __LB()

__STATIC_FORCEINLINE uint8_t __LB ( volatile void *  addr)

Load 8bit value from address (8 bit)

Load 8 bit value.

Parameters
[in]addrAddress pointer to data
Returns
value of type uint8_t at (*addr)

Definition at line 2208 of file core_feature_base.h.

2209 {
2210  uint8_t result;
2211 
2212  __ASM volatile ("lb %0, 0(%1)" : "=r" (result) : "r" (addr));
2213  return result;
2214 }

References __ASM.

◆ __LH()

__STATIC_FORCEINLINE uint16_t __LH ( volatile void *  addr)

Load 16bit value from address (16 bit)

Load 16 bit value.

Parameters
[in]addrAddress pointer to data
Returns
value of type uint16_t at (*addr)

Definition at line 2222 of file core_feature_base.h.

2223 {
2224  uint16_t result;
2225 
2226  __ASM volatile ("lh %0, 0(%1)" : "=r" (result) : "r" (addr));
2227  return result;
2228 }

References __ASM.

◆ __LW()

__STATIC_FORCEINLINE uint32_t __LW ( volatile void *  addr)

Load 32bit value from address (32 bit)

Load 32 bit value.

Parameters
[in]addrAddress pointer to data
Returns
value of type uint32_t at (*addr)

Definition at line 2236 of file core_feature_base.h.

2237 {
2238  uint32_t result;
2239 
2240  __ASM volatile ("lw %0, 0(%1)" : "=r" (result) : "r" (addr));
2241  return result;
2242 }

References __ASM.

Referenced by CIDU_GetBroadcastModeStatus(), CIDU_GetClaimStatus(), CIDU_GetCoreNum(), CIDU_GetIntNum(), CIDU_GetSemaphoreStatus(), CIDU_QueryCoreIntSenderMask(), CIDU_SetFirstClaimMode(), ECC_DLMErrInject(), ECC_DLMErrRestore(), ECC_ILMErrInject(), ECC_ILMErrRestore(), SMPCC_CLMErrInject(), SysTimer_GetHartCompareValue(), SysTimer_GetHartMsipValue(), SysTimer_GetHartSsipValue(), and SysTimer_GetLoadValue().

◆ __NOP()

__STATIC_FORCEINLINE void __NOP ( void  )

NOP Instruction.

No Operation does nothing. This instruction can be used for code alignment purposes.

Definition at line 1508 of file core_feature_base.h.

1509 {
1510  __ASM volatile("nop");
1511 }

References __ASM.

◆ __read_hpm_counter()

__STATIC_INLINE unsigned long __read_hpm_counter ( unsigned long  idx)

Get value of selected high performance monitor counter.

Parameters
[in]idxHPMCOUNTERx CSR index(3-31)

Get high performance monitor counter register value without high 32 bits when XLEN=32

Returns
HPMCOUNTERx Register value

Definition at line 2139 of file core_feature_base.h.

2140 {
2141  switch (idx) {
2142  case 0: return __read_cycle_csr();
2143  case 2: return __read_instret_csr();
2144  case 3: return __RV_CSR_READ(CSR_MHPMCOUNTER3);
2145  case 4: return __RV_CSR_READ(CSR_MHPMCOUNTER4);
2146  case 5: return __RV_CSR_READ(CSR_MHPMCOUNTER5);
2147  case 6: return __RV_CSR_READ(CSR_MHPMCOUNTER6);
2148  case 7: return __RV_CSR_READ(CSR_MHPMCOUNTER7);
2149  case 8: return __RV_CSR_READ(CSR_MHPMCOUNTER8);
2150  case 9: return __RV_CSR_READ(CSR_MHPMCOUNTER9);
2151  case 10: return __RV_CSR_READ(CSR_MHPMCOUNTER10);
2152  case 11: return __RV_CSR_READ(CSR_MHPMCOUNTER11);
2153  case 12: return __RV_CSR_READ(CSR_MHPMCOUNTER12);
2154  case 13: return __RV_CSR_READ(CSR_MHPMCOUNTER13);
2155  case 14: return __RV_CSR_READ(CSR_MHPMCOUNTER14);
2156  case 15: return __RV_CSR_READ(CSR_MHPMCOUNTER15);
2157  case 16: return __RV_CSR_READ(CSR_MHPMCOUNTER16);
2158  case 17: return __RV_CSR_READ(CSR_MHPMCOUNTER17);
2159  case 18: return __RV_CSR_READ(CSR_MHPMCOUNTER18);
2160  case 19: return __RV_CSR_READ(CSR_MHPMCOUNTER19);
2161  case 20: return __RV_CSR_READ(CSR_MHPMCOUNTER20);
2162  case 21: return __RV_CSR_READ(CSR_MHPMCOUNTER21);
2163  case 22: return __RV_CSR_READ(CSR_MHPMCOUNTER22);
2164  case 23: return __RV_CSR_READ(CSR_MHPMCOUNTER23);
2165  case 24: return __RV_CSR_READ(CSR_MHPMCOUNTER24);
2166  case 25: return __RV_CSR_READ(CSR_MHPMCOUNTER25);
2167  case 26: return __RV_CSR_READ(CSR_MHPMCOUNTER26);
2168  case 27: return __RV_CSR_READ(CSR_MHPMCOUNTER27);
2169  case 28: return __RV_CSR_READ(CSR_MHPMCOUNTER28);
2170  case 29: return __RV_CSR_READ(CSR_MHPMCOUNTER29);
2171  case 30: return __RV_CSR_READ(CSR_MHPMCOUNTER30);
2172  case 31: return __RV_CSR_READ(CSR_MHPMCOUNTER31);
2173  default: return 0;
2174  }
2175 }
__STATIC_FORCEINLINE unsigned long __read_instret_csr(void)
Read the INSTRET register.
__STATIC_FORCEINLINE unsigned long __read_cycle_csr(void)
Read the CYCLE register.

References __read_cycle_csr(), __read_instret_csr(), __RV_CSR_READ, CSR_MHPMCOUNTER10, CSR_MHPMCOUNTER11, CSR_MHPMCOUNTER12, CSR_MHPMCOUNTER13, CSR_MHPMCOUNTER14, CSR_MHPMCOUNTER15, CSR_MHPMCOUNTER16, CSR_MHPMCOUNTER17, CSR_MHPMCOUNTER18, CSR_MHPMCOUNTER19, CSR_MHPMCOUNTER20, CSR_MHPMCOUNTER21, CSR_MHPMCOUNTER22, CSR_MHPMCOUNTER23, CSR_MHPMCOUNTER24, CSR_MHPMCOUNTER25, CSR_MHPMCOUNTER26, CSR_MHPMCOUNTER27, CSR_MHPMCOUNTER28, CSR_MHPMCOUNTER29, CSR_MHPMCOUNTER3, CSR_MHPMCOUNTER30, CSR_MHPMCOUNTER31, CSR_MHPMCOUNTER4, CSR_MHPMCOUNTER5, CSR_MHPMCOUNTER6, CSR_MHPMCOUNTER7, CSR_MHPMCOUNTER8, and CSR_MHPMCOUNTER9.

◆ __SB()

__STATIC_FORCEINLINE void __SB ( volatile void *  addr,
uint8_t  val 
)

Write 8bit value to address (8 bit)

Write 8 bit value.

Parameters
[in]addrAddress pointer to data
[in]valValue to set

Definition at line 2266 of file core_feature_base.h.

2267 {
2268  __ASM volatile ("sb %0, 0(%1)" : : "r" (val), "r" (addr));
2269 }

References __ASM.

◆ __set_hpm_counter()

__STATIC_INLINE void __set_hpm_counter ( unsigned long  idx,
uint64_t  value 
)

Set value for selected high performance monitor counter.

Parameters
[in]idxHPMCOUNTERx CSR index(3-31)
[in]valueHPMCOUNTERx Register value to set

Set value for high performance monitor couner register

Definition at line 1798 of file core_feature_base.h.

1799 {
1800  switch (idx) {
1801 #if __RISCV_XLEN == 32
1802  case 3: __RV_CSR_WRITE(CSR_MHPMCOUNTER3, 0); // prevent carry
1803  __RV_CSR_WRITE(CSR_MHPMCOUNTER3H, (uint32_t)(value >> 32));
1804  __RV_CSR_WRITE(CSR_MHPMCOUNTER3, (uint32_t)(value)); break;
1805  case 4: __RV_CSR_WRITE(CSR_MHPMCOUNTER4, 0); // prevent carry
1806  __RV_CSR_WRITE(CSR_MHPMCOUNTER4H, (uint32_t)(value >> 32));
1807  __RV_CSR_WRITE(CSR_MHPMCOUNTER4, (uint32_t)(value)); break;
1808  case 5: __RV_CSR_WRITE(CSR_MHPMCOUNTER5, 0); // prevent carry
1809  __RV_CSR_WRITE(CSR_MHPMCOUNTER5H, (uint32_t)(value >> 32));
1810  __RV_CSR_WRITE(CSR_MHPMCOUNTER5, (uint32_t)(value)); break;
1811  case 6: __RV_CSR_WRITE(CSR_MHPMCOUNTER6, 0); // prevent carry
1812  __RV_CSR_WRITE(CSR_MHPMCOUNTER6H, (uint32_t)(value >> 32));
1813  __RV_CSR_WRITE(CSR_MHPMCOUNTER6, (uint32_t)(value)); break;
1814  case 7: __RV_CSR_WRITE(CSR_MHPMCOUNTER7, 0); // prevent carry
1815  __RV_CSR_WRITE(CSR_MHPMCOUNTER7H, (uint32_t)(value >> 32));
1816  __RV_CSR_WRITE(CSR_MHPMCOUNTER7, (uint32_t)(value)); break;
1817  case 8: __RV_CSR_WRITE(CSR_MHPMCOUNTER8, 0); // prevent carry
1818  __RV_CSR_WRITE(CSR_MHPMCOUNTER8H, (uint32_t)(value >> 32));
1819  __RV_CSR_WRITE(CSR_MHPMCOUNTER8, (uint32_t)(value)); break;
1820  case 9: __RV_CSR_WRITE(CSR_MHPMCOUNTER9, 0); // prevent carry
1821  __RV_CSR_WRITE(CSR_MHPMCOUNTER9H, (uint32_t)(value >> 32));
1822  __RV_CSR_WRITE(CSR_MHPMCOUNTER9, (uint32_t)(value)); break;
1823  case 10: __RV_CSR_WRITE(CSR_MHPMCOUNTER10, 0); // prevent carry
1824  __RV_CSR_WRITE(CSR_MHPMCOUNTER10H, (uint32_t)(value >> 32));
1825  __RV_CSR_WRITE(CSR_MHPMCOUNTER10, (uint32_t)(value)); break;
1826  case 11: __RV_CSR_WRITE(CSR_MHPMCOUNTER11, 0); // prevent carry
1827  __RV_CSR_WRITE(CSR_MHPMCOUNTER11H, (uint32_t)(value >> 32));
1828  __RV_CSR_WRITE(CSR_MHPMCOUNTER11, (uint32_t)(value)); break;
1829  case 12: __RV_CSR_WRITE(CSR_MHPMCOUNTER12, 0); // prevent carry
1830  __RV_CSR_WRITE(CSR_MHPMCOUNTER12H, (uint32_t)(value >> 32));
1831  __RV_CSR_WRITE(CSR_MHPMCOUNTER12, (uint32_t)(value)); break;
1832  case 13: __RV_CSR_WRITE(CSR_MHPMCOUNTER13, 0); // prevent carry
1833  __RV_CSR_WRITE(CSR_MHPMCOUNTER13H, (uint32_t)(value >> 32));
1834  __RV_CSR_WRITE(CSR_MHPMCOUNTER13, (uint32_t)(value)); break;
1835  case 14: __RV_CSR_WRITE(CSR_MHPMCOUNTER14, 0); // prevent carry
1836  __RV_CSR_WRITE(CSR_MHPMCOUNTER14H, (uint32_t)(value >> 32));
1837  __RV_CSR_WRITE(CSR_MHPMCOUNTER14, (uint32_t)(value)); break;
1838  case 15: __RV_CSR_WRITE(CSR_MHPMCOUNTER15, 0); // prevent carry
1839  __RV_CSR_WRITE(CSR_MHPMCOUNTER15H, (uint32_t)(value >> 32));
1840  __RV_CSR_WRITE(CSR_MHPMCOUNTER15, (uint32_t)(value)); break;
1841  case 16: __RV_CSR_WRITE(CSR_MHPMCOUNTER16, 0); // prevent carry
1842  __RV_CSR_WRITE(CSR_MHPMCOUNTER16H, (uint32_t)(value >> 32));
1843  __RV_CSR_WRITE(CSR_MHPMCOUNTER16, (uint32_t)(value)); break;
1844  case 17: __RV_CSR_WRITE(CSR_MHPMCOUNTER17, 0); // prevent carry
1845  __RV_CSR_WRITE(CSR_MHPMCOUNTER17H, (uint32_t)(value >> 32));
1846  __RV_CSR_WRITE(CSR_MHPMCOUNTER17, (uint32_t)(value)); break;
1847  case 18: __RV_CSR_WRITE(CSR_MHPMCOUNTER18, 0); // prevent carry
1848  __RV_CSR_WRITE(CSR_MHPMCOUNTER18H, (uint32_t)(value >> 32));
1849  __RV_CSR_WRITE(CSR_MHPMCOUNTER18, (uint32_t)(value)); break;
1850  case 19: __RV_CSR_WRITE(CSR_MHPMCOUNTER19, 0); // prevent carry
1851  __RV_CSR_WRITE(CSR_MHPMCOUNTER19H, (uint32_t)(value >> 32));
1852  __RV_CSR_WRITE(CSR_MHPMCOUNTER19, (uint32_t)(value)); break;
1853  case 20: __RV_CSR_WRITE(CSR_MHPMCOUNTER20, 0); // prevent carry
1854  __RV_CSR_WRITE(CSR_MHPMCOUNTER20H, (uint32_t)(value >> 32));
1855  __RV_CSR_WRITE(CSR_MHPMCOUNTER20, (uint32_t)(value)); break;
1856  case 21: __RV_CSR_WRITE(CSR_MHPMCOUNTER21, 0); // prevent carry
1857  __RV_CSR_WRITE(CSR_MHPMCOUNTER21H, (uint32_t)(value >> 32));
1858  __RV_CSR_WRITE(CSR_MHPMCOUNTER21, (uint32_t)(value)); break;
1859  case 22: __RV_CSR_WRITE(CSR_MHPMCOUNTER22, 0); // prevent carry
1860  __RV_CSR_WRITE(CSR_MHPMCOUNTER22H, (uint32_t)(value >> 32));
1861  __RV_CSR_WRITE(CSR_MHPMCOUNTER22, (uint32_t)(value)); break;
1862  case 23: __RV_CSR_WRITE(CSR_MHPMCOUNTER23, 0); // prevent carry
1863  __RV_CSR_WRITE(CSR_MHPMCOUNTER23H, (uint32_t)(value >> 32));
1864  __RV_CSR_WRITE(CSR_MHPMCOUNTER23, (uint32_t)(value)); break;
1865  case 24: __RV_CSR_WRITE(CSR_MHPMCOUNTER24, 0); // prevent carry
1866  __RV_CSR_WRITE(CSR_MHPMCOUNTER24H, (uint32_t)(value >> 32));
1867  __RV_CSR_WRITE(CSR_MHPMCOUNTER24, (uint32_t)(value)); break;
1868  case 25: __RV_CSR_WRITE(CSR_MHPMCOUNTER25, 0); // prevent carry
1869  __RV_CSR_WRITE(CSR_MHPMCOUNTER25H, (uint32_t)(value >> 32));
1870  __RV_CSR_WRITE(CSR_MHPMCOUNTER25, (uint32_t)(value)); break;
1871  case 26: __RV_CSR_WRITE(CSR_MHPMCOUNTER26, 0); // prevent carry
1872  __RV_CSR_WRITE(CSR_MHPMCOUNTER26H, (uint32_t)(value >> 32));
1873  __RV_CSR_WRITE(CSR_MHPMCOUNTER26, (uint32_t)(value)); break;
1874  case 27: __RV_CSR_WRITE(CSR_MHPMCOUNTER27, 0); // prevent carry
1875  __RV_CSR_WRITE(CSR_MHPMCOUNTER27H, (uint32_t)(value >> 32));
1876  __RV_CSR_WRITE(CSR_MHPMCOUNTER27, (uint32_t)(value)); break;
1877  case 28: __RV_CSR_WRITE(CSR_MHPMCOUNTER28, 0); // prevent carry
1878  __RV_CSR_WRITE(CSR_MHPMCOUNTER28H, (uint32_t)(value >> 32));
1879  __RV_CSR_WRITE(CSR_MHPMCOUNTER28, (uint32_t)(value)); break;
1880  case 29: __RV_CSR_WRITE(CSR_MHPMCOUNTER29, 0); // prevent carry
1881  __RV_CSR_WRITE(CSR_MHPMCOUNTER29H, (uint32_t)(value >> 32));
1882  __RV_CSR_WRITE(CSR_MHPMCOUNTER29, (uint32_t)(value)); break;
1883  case 30: __RV_CSR_WRITE(CSR_MHPMCOUNTER30, 0); // prevent carry
1884  __RV_CSR_WRITE(CSR_MHPMCOUNTER30H, (uint32_t)(value >> 32));
1885  __RV_CSR_WRITE(CSR_MHPMCOUNTER30, (uint32_t)(value)); break;
1886  case 31: __RV_CSR_WRITE(CSR_MHPMCOUNTER31, 0); // prevent carry
1887  __RV_CSR_WRITE(CSR_MHPMCOUNTER31H, (uint32_t)(value >> 32));
1888  __RV_CSR_WRITE(CSR_MHPMCOUNTER31, (uint32_t)(value)); break;
1889 
1890 #elif __RISCV_XLEN == 64
1891  case 3: __RV_CSR_WRITE(CSR_MHPMCOUNTER3, (value)); break;
1892  case 4: __RV_CSR_WRITE(CSR_MHPMCOUNTER4, (value)); break;
1893  case 5: __RV_CSR_WRITE(CSR_MHPMCOUNTER5, (value)); break;
1894  case 6: __RV_CSR_WRITE(CSR_MHPMCOUNTER6, (value)); break;
1895  case 7: __RV_CSR_WRITE(CSR_MHPMCOUNTER7, (value)); break;
1896  case 8: __RV_CSR_WRITE(CSR_MHPMCOUNTER8, (value)); break;
1897  case 9: __RV_CSR_WRITE(CSR_MHPMCOUNTER9, (value)); break;
1898  case 10: __RV_CSR_WRITE(CSR_MHPMCOUNTER10, (value)); break;
1899  case 11: __RV_CSR_WRITE(CSR_MHPMCOUNTER11, (value)); break;
1900  case 12: __RV_CSR_WRITE(CSR_MHPMCOUNTER12, (value)); break;
1901  case 13: __RV_CSR_WRITE(CSR_MHPMCOUNTER13, (value)); break;
1902  case 14: __RV_CSR_WRITE(CSR_MHPMCOUNTER14, (value)); break;
1903  case 15: __RV_CSR_WRITE(CSR_MHPMCOUNTER15, (value)); break;
1904  case 16: __RV_CSR_WRITE(CSR_MHPMCOUNTER16, (value)); break;
1905  case 17: __RV_CSR_WRITE(CSR_MHPMCOUNTER17, (value)); break;
1906  case 18: __RV_CSR_WRITE(CSR_MHPMCOUNTER18, (value)); break;
1907  case 19: __RV_CSR_WRITE(CSR_MHPMCOUNTER19, (value)); break;
1908  case 20: __RV_CSR_WRITE(CSR_MHPMCOUNTER20, (value)); break;
1909  case 21: __RV_CSR_WRITE(CSR_MHPMCOUNTER21, (value)); break;
1910  case 22: __RV_CSR_WRITE(CSR_MHPMCOUNTER22, (value)); break;
1911  case 23: __RV_CSR_WRITE(CSR_MHPMCOUNTER23, (value)); break;
1912  case 24: __RV_CSR_WRITE(CSR_MHPMCOUNTER24, (value)); break;
1913  case 25: __RV_CSR_WRITE(CSR_MHPMCOUNTER25, (value)); break;
1914  case 26: __RV_CSR_WRITE(CSR_MHPMCOUNTER26, (value)); break;
1915  case 27: __RV_CSR_WRITE(CSR_MHPMCOUNTER27, (value)); break;
1916  case 28: __RV_CSR_WRITE(CSR_MHPMCOUNTER28, (value)); break;
1917  case 29: __RV_CSR_WRITE(CSR_MHPMCOUNTER29, (value)); break;
1918  case 30: __RV_CSR_WRITE(CSR_MHPMCOUNTER30, (value)); break;
1919  case 31: __RV_CSR_WRITE(CSR_MHPMCOUNTER31, (value)); break;
1920 
1921 #else
1922 #endif
1923  default: break;
1924  }
1925 }
#define __RV_CSR_WRITE(csr, val)
CSR operation Macro for csrw instruction.

References __RV_CSR_WRITE, CSR_MHPMCOUNTER10, CSR_MHPMCOUNTER10H, CSR_MHPMCOUNTER11, CSR_MHPMCOUNTER11H, CSR_MHPMCOUNTER12, CSR_MHPMCOUNTER12H, CSR_MHPMCOUNTER13, CSR_MHPMCOUNTER13H, CSR_MHPMCOUNTER14, CSR_MHPMCOUNTER14H, CSR_MHPMCOUNTER15, CSR_MHPMCOUNTER15H, CSR_MHPMCOUNTER16, CSR_MHPMCOUNTER16H, CSR_MHPMCOUNTER17, CSR_MHPMCOUNTER17H, CSR_MHPMCOUNTER18, CSR_MHPMCOUNTER18H, CSR_MHPMCOUNTER19, CSR_MHPMCOUNTER19H, CSR_MHPMCOUNTER20, CSR_MHPMCOUNTER20H, CSR_MHPMCOUNTER21, CSR_MHPMCOUNTER21H, CSR_MHPMCOUNTER22, CSR_MHPMCOUNTER22H, CSR_MHPMCOUNTER23, CSR_MHPMCOUNTER23H, CSR_MHPMCOUNTER24, CSR_MHPMCOUNTER24H, CSR_MHPMCOUNTER25, CSR_MHPMCOUNTER25H, CSR_MHPMCOUNTER26, CSR_MHPMCOUNTER26H, CSR_MHPMCOUNTER27, CSR_MHPMCOUNTER27H, CSR_MHPMCOUNTER28, CSR_MHPMCOUNTER28H, CSR_MHPMCOUNTER29, CSR_MHPMCOUNTER29H, CSR_MHPMCOUNTER3, CSR_MHPMCOUNTER30, CSR_MHPMCOUNTER30H, CSR_MHPMCOUNTER31, CSR_MHPMCOUNTER31H, CSR_MHPMCOUNTER3H, CSR_MHPMCOUNTER4, CSR_MHPMCOUNTER4H, CSR_MHPMCOUNTER5, CSR_MHPMCOUNTER5H, CSR_MHPMCOUNTER6, CSR_MHPMCOUNTER6H, CSR_MHPMCOUNTER7, CSR_MHPMCOUNTER7H, CSR_MHPMCOUNTER8, CSR_MHPMCOUNTER8H, CSR_MHPMCOUNTER9, and CSR_MHPMCOUNTER9H.

◆ __set_hpm_event()

__STATIC_INLINE void __set_hpm_event ( unsigned long  idx,
unsigned long  event 
)

Set event for selected high performance monitor event.

Parameters
[in]idxHPMEVENTx CSR index(3-31)
[in]eventHPMEVENTx Register value to set

Set event for high performance monitor event register

Definition at line 1711 of file core_feature_base.h.

1712 {
1713  switch (idx) {
1714  case 3: __RV_CSR_WRITE(CSR_MHPMEVENT3, event); break;
1715  case 4: __RV_CSR_WRITE(CSR_MHPMEVENT4, event); break;
1716  case 5: __RV_CSR_WRITE(CSR_MHPMEVENT5, event); break;
1717  case 6: __RV_CSR_WRITE(CSR_MHPMEVENT6, event); break;
1718  case 7: __RV_CSR_WRITE(CSR_MHPMEVENT7, event); break;
1719  case 8: __RV_CSR_WRITE(CSR_MHPMEVENT8, event); break;
1720  case 9: __RV_CSR_WRITE(CSR_MHPMEVENT9, event); break;
1721  case 10: __RV_CSR_WRITE(CSR_MHPMEVENT10, event); break;
1722  case 11: __RV_CSR_WRITE(CSR_MHPMEVENT11, event); break;
1723  case 12: __RV_CSR_WRITE(CSR_MHPMEVENT12, event); break;
1724  case 13: __RV_CSR_WRITE(CSR_MHPMEVENT13, event); break;
1725  case 14: __RV_CSR_WRITE(CSR_MHPMEVENT14, event); break;
1726  case 15: __RV_CSR_WRITE(CSR_MHPMEVENT15, event); break;
1727  case 16: __RV_CSR_WRITE(CSR_MHPMEVENT16, event); break;
1728  case 17: __RV_CSR_WRITE(CSR_MHPMEVENT17, event); break;
1729  case 18: __RV_CSR_WRITE(CSR_MHPMEVENT18, event); break;
1730  case 19: __RV_CSR_WRITE(CSR_MHPMEVENT19, event); break;
1731  case 20: __RV_CSR_WRITE(CSR_MHPMEVENT20, event); break;
1732  case 21: __RV_CSR_WRITE(CSR_MHPMEVENT21, event); break;
1733  case 22: __RV_CSR_WRITE(CSR_MHPMEVENT22, event); break;
1734  case 23: __RV_CSR_WRITE(CSR_MHPMEVENT23, event); break;
1735  case 24: __RV_CSR_WRITE(CSR_MHPMEVENT24, event); break;
1736  case 25: __RV_CSR_WRITE(CSR_MHPMEVENT25, event); break;
1737  case 26: __RV_CSR_WRITE(CSR_MHPMEVENT26, event); break;
1738  case 27: __RV_CSR_WRITE(CSR_MHPMEVENT27, event); break;
1739  case 28: __RV_CSR_WRITE(CSR_MHPMEVENT28, event); break;
1740  case 29: __RV_CSR_WRITE(CSR_MHPMEVENT29, event); break;
1741  case 30: __RV_CSR_WRITE(CSR_MHPMEVENT30, event); break;
1742  case 31: __RV_CSR_WRITE(CSR_MHPMEVENT31, event); break;
1743  default: break;
1744  }
1745 }

References __RV_CSR_WRITE, CSR_MHPMEVENT10, CSR_MHPMEVENT11, CSR_MHPMEVENT12, CSR_MHPMEVENT13, CSR_MHPMEVENT14, CSR_MHPMEVENT15, CSR_MHPMEVENT16, CSR_MHPMEVENT17, CSR_MHPMEVENT18, CSR_MHPMEVENT19, CSR_MHPMEVENT20, CSR_MHPMEVENT21, CSR_MHPMEVENT22, CSR_MHPMEVENT23, CSR_MHPMEVENT24, CSR_MHPMEVENT25, CSR_MHPMEVENT26, CSR_MHPMEVENT27, CSR_MHPMEVENT28, CSR_MHPMEVENT29, CSR_MHPMEVENT3, CSR_MHPMEVENT30, CSR_MHPMEVENT31, CSR_MHPMEVENT4, CSR_MHPMEVENT5, CSR_MHPMEVENT6, CSR_MHPMEVENT7, CSR_MHPMEVENT8, and CSR_MHPMEVENT9.

◆ __set_medeleg()

__STATIC_FORCEINLINE void __set_medeleg ( unsigned long  mask)

Set exceptions delegation to S mode.

Set certain exceptions of supervisor mode or user mode delegated from machined mode to supervisor mode.

Remarks
Exception should trigger in supervisor mode or user mode.

Definition at line 2184 of file core_feature_base.h.

2185 {
2186  __RV_CSR_WRITE(CSR_MEDELEG, mask);
2187 }
#define CSR_MEDELEG

References __RV_CSR_WRITE, and CSR_MEDELEG.

◆ __set_mideleg()

__STATIC_FORCEINLINE void __set_mideleg ( unsigned long  mask)

Set interrupt delegation to S mode.

Set certain interrupt of supervisor mode or user mode delegated from machined mode to supervisor mode.

Remarks
interrupt should trigger in supervisor mode or user mode.

Definition at line 2196 of file core_feature_base.h.

2197 {
2198  __RV_CSR_WRITE(CSR_MIDELEG, mask);
2199 }
#define CSR_MIDELEG

References __RV_CSR_WRITE, and CSR_MIDELEG.

◆ __set_wfi_sleepmode()

__STATIC_FORCEINLINE void __set_wfi_sleepmode ( WFI_SleepMode_Type  mode)

Set Sleep mode of WFI.

Set the SLEEPVALUE CSR register to control the WFI Sleep mode.

Parameters
[in]modeThe sleep mode to be set

Definition at line 1580 of file core_feature_base.h.

1581 {
1583 }
#define CSR_SLEEPVALUE

References __RV_CSR_WRITE, and CSR_SLEEPVALUE.

◆ __SH()

__STATIC_FORCEINLINE void __SH ( volatile void *  addr,
uint16_t  val 
)

Write 16bit value to address (16 bit)

Write 16 bit value.

Parameters
[in]addrAddress pointer to data
[in]valValue to set

Definition at line 2277 of file core_feature_base.h.

2278 {
2279  __ASM volatile ("sh %0, 0(%1)" : : "r" (val), "r" (addr));
2280 }

References __ASM.

◆ __SW()

◆ __TXEVT()

__STATIC_FORCEINLINE void __TXEVT ( void  )

Send TX Event.

Set the CSR TXEVT to control send a TX Event. The Core will output signal tx_evt as output event signal.

Definition at line 1591 of file core_feature_base.h.

1592 {
1593  __RV_CSR_SET(CSR_TXEVT, 0x1);
1594 }
#define CSR_TXEVT

References __RV_CSR_SET, and CSR_TXEVT.

◆ __WFE()

__STATIC_FORCEINLINE void __WFE ( void  )

Wait For Event.

Wait For Event is executed using CSR_WFE.WFE=1 and WFI instruction. It will suspends execution until event, NMI or Debug happened. When Core is waked up, Core will resume previous execution

Definition at line 1535 of file core_feature_base.h.

1536 {
1538  __ASM volatile("wfi");
1540 }
#define WFE_WFE
#define CSR_WFE

References __ASM, __RV_CSR_CLEAR, __RV_CSR_SET, CSR_WFE, and WFE_WFE.

◆ __WFI()

__STATIC_FORCEINLINE void __WFI ( void  )

Wait For Interrupt.

Wait For Interrupt is is executed using CSR_WFE.WFE=0 and WFI instruction. It will suspends execution until interrupt, NMI or Debug happened. When Core is waked up by interrupt, if

  1. mstatus.MIE == 1(interrupt enabled), Core will enter ISR code
  2. mstatus.MIE == 0(interrupt disabled), Core will resume previous execution

Definition at line 1522 of file core_feature_base.h.

1523 {
1525  __ASM volatile("wfi");
1526 }

References __ASM, __RV_CSR_CLEAR, CSR_WFE, and WFE_WFE.