riscv: Use zicsr architecture extension

This is required for ISA 2.0 support, see chapter

"Zicsr", Control and Status Register (CSR) Instructions, Version 2.0

in

RISC-V Instruction Set Manual, Volume I: RISC-V User-Level ISA
This commit is contained in:
Sebastian Huber
2022-02-25 17:45:06 +01:00
parent 4b09a4c7b8
commit faaffbd913
7 changed files with 54 additions and 12 deletions

View File

@@ -187,7 +187,13 @@ CPU_Counter_ticks _CPU_Counter_read( void )
{
unsigned long timec;
__asm__ volatile ( "csrr %0, time" : "=&r" ( timec ) );
__asm__ volatile (
".option push\n"
".option arch, +zicsr\n"
"csrr %0, time\n"
".option pop" :
"=&r" ( timec )
);
return timec;
}

View File

@@ -39,6 +39,7 @@ PUBLIC(_start)
.section .bsp_start_text, "wax", @progbits
.align 2
.option arch, +zicsr
TYPE_FUNC(_start)
SYM(_start):

View File

@@ -152,7 +152,10 @@ static inline uint32_t riscv_interrupt_disable( void )
unsigned long mstatus;
__asm__ volatile (
"csrrc %0, mstatus, " RTEMS_XSTRING( RISCV_MSTATUS_MIE ) :
".option push\n"
".option arch, +zicsr\n"
"csrrc %0, mstatus, " RTEMS_XSTRING( RISCV_MSTATUS_MIE ) "\n"
".option pop" :
"=&r" ( mstatus )
);
@@ -161,7 +164,14 @@ static inline uint32_t riscv_interrupt_disable( void )
static inline void riscv_interrupt_enable( uint32_t level )
{
__asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) );
__asm__ volatile (
".option push\n"
".option arch, +zicsr\n"
"csrrs zero, mstatus, %0\n"
".option pop" :
:
"r" ( level )
);
}
#define _CPU_ISR_Disable( _level ) \
@@ -185,11 +195,17 @@ RTEMS_INLINE_ROUTINE void _CPU_ISR_Set_level( uint32_t level )
{
if ( ( level & CPU_MODES_INTERRUPT_MASK) == 0 ) {
__asm__ volatile (
"csrrs zero, mstatus, " RTEMS_XSTRING( RISCV_MSTATUS_MIE )
".option push\n"
".option arch, +zicsr\n"
"csrrs zero, mstatus, " RTEMS_XSTRING( RISCV_MSTATUS_MIE ) "\n"
".option pop"
);
} else {
__asm__ volatile (
"csrrc zero, mstatus, " RTEMS_XSTRING( RISCV_MSTATUS_MIE )
".option push\n"
".option arch, +zicsr\n"
"csrrc zero, mstatus, " RTEMS_XSTRING( RISCV_MSTATUS_MIE ) "\n"
".option pop"
);
}
}
@@ -465,7 +481,13 @@ static inline uint32_t _CPU_SMP_Get_current_processor( void )
{
unsigned long mhartid;
__asm__ volatile ( "csrr %0, mhartid" : "=&r" ( mhartid ) );
__asm__ volatile (
".option push\n"
".option arch, +zicsr\n"
"csrr %0, mhartid\n"
".option pop" :
"=&r" ( mhartid )
);
return (uint32_t) mhartid;
}

View File

@@ -399,7 +399,13 @@ static inline struct Per_CPU_Control *_RISCV_Get_current_per_CPU_control( void )
{
struct Per_CPU_Control *cpu_self;
__asm__ volatile ( "csrr %0, mscratch" : "=r" ( cpu_self ) );
__asm__ volatile (
".option push\n"
".option arch, +zicsr\n"
"csrr %0, mscratch\n"
".option pop" :
"=r" ( cpu_self )
);
return cpu_self;
}

View File

@@ -247,22 +247,27 @@ typedef enum {
#ifdef __GNUC__
#define read_csr(reg) ({ unsigned long __tmp; \
asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \
asm volatile (".option push\n.option arch, +zicsr\n" \
"csrr %0, " #reg "\n.option pop ": "=r"(__tmp)); \
__tmp; })
#define write_csr(reg, val) ({ \
asm volatile ("csrw " #reg ", %0" :: "rK"(val)); })
asm volatile (".option push\n.option arch, +zicsr\n" \
"csrw " #reg ", %0\n.option pop" :: "rK"(val)); })
#define swap_csr(reg, val) ({ unsigned long __tmp; \
asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "rK"(val)); \
asm volatile (".option push\n.option arch, +zicsr\n" \
"csrrw %0, " #reg ", %1\n.option pop" : "=r"(__tmp) : "rK"(val)); \
__tmp; })
#define set_csr(reg, bit) ({ unsigned long __tmp; \
asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \
asm volatile (".option push\n.option arch, +zicsr\nc" \
"srrs %0, " #reg ", %1\n.option pop" : "=r"(__tmp) : "rK"(bit)); \
__tmp; })
#define clear_csr(reg, bit) ({ unsigned long __tmp; \
asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \
asm volatile (".option push\n.option arch, +zicsr\n" \
"csrrc %0, " #reg ", %1\n.option pop" : "=r"(__tmp) : "rK"(bit)); \
__tmp; })
#define rdtime() read_csr(time)

View File

@@ -35,6 +35,7 @@
.section .text, "ax", @progbits
.align 2
.option arch, +zicsr
PUBLIC(_CPU_Context_switch)
PUBLIC(_CPU_Context_switch_no_return)

View File

@@ -45,6 +45,7 @@ PUBLIC(_RISCV_Exception_handler)
.section .text, "ax", @progbits
.align 2
.option arch, +zicsr
TYPE_FUNC(_RISCV_Exception_handler)
SYM(_RISCV_Exception_handler):