summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sbi/riscv_asm.h10
-rw-r--r--include/sbi/sbi_scratch.h2
2 files changed, 10 insertions, 2 deletions
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() \