summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRajnesh Kanwal <[email protected]>2025-03-07 12:44:41 +0000
committerAnup Patel <[email protected]>2025-04-13 06:11:43 +0530
commitaa40c53ce498d1774f7779ea25ab1326640d8c63 (patch)
treec33e66dfa8bfdc510d5e37f43926b211e9484d9b /lib
parentafa0e3091bebf2aaba167f37119a9a4f608a55a8 (diff)
lib: sbi: Enable Control Transfer Records (CTR) Ext using xstateen.
The Control Transfer Records (CTR) extension provides a method to record a limited branch history in register-accessible internal chip storage. This extension is similar to Arch LBR in x86 and BRBE in ARM. The Extension has been stable and the latest release can be found here https://github.com/riscv/riscv-control-transfer-records/release Signed-off-by: Rajnesh Kanwal <[email protected]> Reviewed-by: Atish Patra <[email protected]> Reviewed-by: Anup Patel <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Anup Patel <[email protected]>
Diffstat (limited to 'lib')
-rw-r--r--lib/sbi/sbi_hart.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
index 8e2979b5..c343805c 100644
--- a/lib/sbi/sbi_hart.c
+++ b/lib/sbi/sbi_hart.c
@@ -105,6 +105,11 @@ static void mstatus_init(struct sbi_scratch *scratch)
else
mstateen_val &= ~(SMSTATEEN0_SVSLCT);
+ if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SSCTR))
+ mstateen_val |= SMSTATEEN0_CTR;
+ else
+ mstateen_val &= ~SMSTATEEN0_CTR;
+
csr_write(CSR_MSTATEEN0, mstateen_val);
#if __riscv_xlen == 32
csr_write(CSR_MSTATEEN0H, mstateen_val >> 32);
@@ -688,6 +693,8 @@ const struct sbi_hart_ext_data sbi_hart_ext[] = {
__SBI_HART_EXT_DATA(zicfilp, SBI_HART_EXT_ZICFILP),
__SBI_HART_EXT_DATA(zicfiss, SBI_HART_EXT_ZICFISS),
__SBI_HART_EXT_DATA(ssdbltrp, SBI_HART_EXT_SSDBLTRP),
+ __SBI_HART_EXT_DATA(smctr, SBI_HART_EXT_SMCTR),
+ __SBI_HART_EXT_DATA(ssctr, SBI_HART_EXT_SSCTR),
};
_Static_assert(SBI_HART_EXT_MAX == array_size(sbi_hart_ext),