aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Holland <samuel.holland@sifive.com>2024-10-25 11:45:47 -0700
committerAnup Patel <anup@brainfault.org>2024-10-28 10:51:37 +0530
commit62447cd7aa17097cefdb0d7a2f1312ff55fcda27 (patch)
tree79826ca861a0c6c28471096ea15817f0bb608f9b
parent3e0c170397074c32f733ac2681e8a077f8d7a814 (diff)
downloadopensbi-62447cd7aa17097cefdb0d7a2f1312ff55fcda27.zip
opensbi-62447cd7aa17097cefdb0d7a2f1312ff55fcda27.tar.gz
opensbi-62447cd7aa17097cefdb0d7a2f1312ff55fcda27.tar.bz2
include: sbi: Optimize reads of mhartid and mscratch
csr_read() is marked as volatile and clobbering memory, which is generally the safe thing to do. However, these two CSRs do not have any side effects, and the values returned do not change between calls. The compiler can generate better code if we allow it to reorder calls to these functions and cache the return value. Introduce csr_read_relaxed() for this use case. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org>
-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 2c34635..4605db2 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 9ae4f89..9cd7b0d 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() \