lib: sbi: Detect Zicntr extension only based on traps
authorAnup Patel <apatel@ventanamicro.com>
Wed, 27 Dec 2023 06:55:09 +0000 (12:25 +0530)
committerAnup Patel <anup@brainfault.org>
Wed, 27 Dec 2023 06:55:09 +0000 (12:25 +0530)
OpenSBI uses time CSR if Zicntr extension present which causes
it to crash on an older QEMU because QEMU generates Zicntr in
the ISA string for unleashed machine which only has CYCLE and
INSTRET counters.

Fixes: 776770d2adbf ("lib: sbi: Using one array to define the
name of extensions")
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Signed-off-by: Anup Patel <anup@brainfault.org>
lib/sbi/sbi_hart.c

index e2b93e6b134921c4a0db8c8d447adb644f73a5b8..770fee0768d4025ebe7114324aa8038e30398446 100644 (file)
@@ -748,6 +748,7 @@ static int hart_detect_features(struct sbi_scratch *scratch)
        struct sbi_hart_features *hfeatures =
                sbi_scratch_offset_ptr(scratch, hart_features_offset);
        unsigned long val, oldval;
+       bool has_zicntr = false;
        int rc;
 
        /* If hart features already detected then do nothing */
@@ -900,12 +901,19 @@ __pmp_skip:
 
 #undef __check_ext_csr
 
+       /* Save trap based detection of Zicntr */
+       has_zicntr = sbi_hart_has_extension(scratch, SBI_HART_EXT_ZICNTR);
+
        /* Let platform populate extensions */
        rc = sbi_platform_extensions_init(sbi_platform_thishart_ptr(),
                                          hfeatures);
        if (rc)
                return rc;
 
+       /* Zicntr should only be detected using traps */
+       __sbi_hart_update_extension(hfeatures, SBI_HART_EXT_ZICNTR,
+                                   has_zicntr);
+
        /* Extensions implied by other extensions and features */
        if (hfeatures->mhpm_mask)
                __sbi_hart_update_extension(hfeatures,