diff --git a/include/sbi/riscv_asm.h b/include/sbi/riscv_asm.h index 2c34635a..4605db20 100644 --- a/include/sbi/riscv_asm.h +++ b/include/sbi/riscv_asm.h @@ -101,6 +101,14 @@ __v; \ }) +/* Variant of csr_read() that allows the compiler to cache the value. */ +#define csr_read_relaxed(csr) \ + ({ \ + register unsigned long __v; \ + __asm__ ("csrr %0, " __ASM_STR(csr) : "=r"(__v)); \ + __v; \ + }) + #define csr_write(csr, val) \ ({ \ unsigned long __v = (unsigned long)(val); \ @@ -163,7 +171,7 @@ void csr_write_num(int csr_num, unsigned long val); } while (0) /* Get current HART id */ -#define current_hartid() ((unsigned int)csr_read(CSR_MHARTID)) +#define current_hartid() ((unsigned int)csr_read_relaxed(CSR_MHARTID)) /* determine CPU extension, return non-zero support */ int misa_extension_imp(char ext); diff --git a/include/sbi/sbi_scratch.h b/include/sbi/sbi_scratch.h index 9ae4f891..9cd7b0d6 100644 --- a/include/sbi/sbi_scratch.h +++ b/include/sbi/sbi_scratch.h @@ -159,7 +159,7 @@ enum sbi_scratch_options { /** Get pointer to sbi_scratch for current HART */ #define sbi_scratch_thishart_ptr() \ - ((struct sbi_scratch *)csr_read(CSR_MSCRATCH)) + ((struct sbi_scratch *)csr_read_relaxed(CSR_MSCRATCH)) /** Get Arg1 of next booting stage for current HART */ #define sbi_scratch_thishart_arg1_ptr() \