summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Dunaev <dunaich@mail.ru>2022-04-17 12:13:08 +0300
committerAnup Patel <anup@brainfault.org>2022-04-17 12:13:08 +0300
commit9cd95e13bba9986396fe55b33aacd6b42313d1d9 (patch)
tree8d247c9376c7a6d23e8588c00daabfcf66b19cf3
parentc1e47d0c3f9274553df27e2d69c96c30029912b2 (diff)
downloadopensbi-9cd95e13bba9986396fe55b33aacd6b42313d1d9.tar.xz
lib: sbi/hart: preserve csr validation value
The OpenSBI hart init function hart_detect_features() try to read important CSRs but reasign the last read value to the variable that initially contains write probe value. So for series of CSRs (like PMPADDRx) the second CSR probe value will became the initial value of first probing CSR. To avoid of this issue the CSR read value should be saved in different variable. In this configuration the count of PMP will detect rightly if any PMPADDR is hardwired to zero. Signed-off-by: Dmitry Dunaev <dunaich@mail.ru> Signed-off-by: Anup Patel <anup@brainfault.org>
-rw-r--r--lib/sbi/sbi_hart.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
index 7b602c3..891fa18 100644
--- a/lib/sbi/sbi_hart.c
+++ b/lib/sbi/sbi_hart.c
@@ -478,7 +478,7 @@ static void hart_detect_features(struct sbi_scratch *scratch)
{
struct sbi_trap_info trap = {0};
struct hart_features *hfeatures;
- unsigned long val;
+ unsigned long val, oldval;
/* Reset hart features */
hfeatures = sbi_scratch_offset_ptr(scratch, hart_features_offset);
@@ -487,14 +487,14 @@ static void hart_detect_features(struct sbi_scratch *scratch)
hfeatures->mhpm_count = 0;
#define __check_csr(__csr, __rdonly, __wrval, __field, __skip) \
- val = csr_read_allowed(__csr, (ulong)&trap); \
+ oldval = csr_read_allowed(__csr, (ulong)&trap); \
if (!trap.cause) { \
if (__rdonly) { \
(hfeatures->__field)++; \
} else { \
csr_write_allowed(__csr, (ulong)&trap, __wrval);\
if (!trap.cause) { \
- if (csr_swap(__csr, val) == __wrval) \
+ if (csr_swap(__csr, oldval) == __wrval) \
(hfeatures->__field)++; \
else \
goto __skip; \