[PATCH v2 2/2] lib: sbi: fwft: Add FWFT support for Control transfer records ext

Rajnesh Kanwal rkanwal at rivosinc.com
Wed Feb 5 09:03:52 PST 2025


Allow supervisor software to request that Ssctr be enabled for
S-mode. We keep Ssctr always enabled and return SBI_ERR_DENIED
on sbi_fwft_set() call to notify calling software that Ssctr
is always enabled by default.

Signed-off-by: Rajnesh Kanwal <rkanwal at rivosinc.com>
---
 include/sbi/sbi_ecall_interface.h |  4 +++-
 lib/sbi/sbi_fwft.c                | 30 ++++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/include/sbi/sbi_ecall_interface.h b/include/sbi/sbi_ecall_interface.h
index e9a8167760a9d1e7a06d7142b4e02047b5201319..4db5284ff3d6500666e7c87653b8e4943663815a 100644
--- a/include/sbi/sbi_ecall_interface.h
+++ b/include/sbi/sbi_ecall_interface.h
@@ -128,7 +128,9 @@ enum sbi_fwft_feature_t {
 	SBI_FWFT_SHADOW_STACK			= 0x2,
 	SBI_FWFT_DOUBLE_TRAP			= 0x3,
 	SBI_FWFT_PTE_AD_HW_UPDATING		= 0x4,
-	SBI_FWFT_LOCAL_RESERVED_START		= 0x5,
+	SBI_FWFT_POINTER_MASKING_PMLEN          = 0x5,
+	SBI_FWFT_CONTROL_TRANSFER_RECORD        = 0x6,
+	SBI_FWFT_LOCAL_RESERVED_START		= 0x7,
 	SBI_FWFT_LOCAL_RESERVED_END		= 0x3fffffff,
 	SBI_FWFT_LOCAL_PLATFORM_START		= 0x40000000,
 	SBI_FWFT_LOCAL_PLATFORM_END		= 0x7fffffff,
diff --git a/lib/sbi/sbi_fwft.c b/lib/sbi/sbi_fwft.c
index f1ae91592fbc880f2e59586bed79cad12b23e994..c12566d891f17f653f3a7524bedfc289519628b6 100644
--- a/lib/sbi/sbi_fwft.c
+++ b/lib/sbi/sbi_fwft.c
@@ -59,6 +59,8 @@ static const unsigned long fwft_defined_features[] = {
 	SBI_FWFT_SHADOW_STACK,
 	SBI_FWFT_DOUBLE_TRAP,
 	SBI_FWFT_PTE_AD_HW_UPDATING,
+	SBI_FWFT_POINTER_MASKING_PMLEN,
+	SBI_FWFT_CONTROL_TRANSFER_RECORD,
 };
 
 static bool fwft_is_defined_feature(enum sbi_fwft_feature_t feature)
@@ -145,6 +147,28 @@ static int fwft_get_adue(struct fwft_config *conf, unsigned long *value)
 	return SBI_OK;
 }
 
+static int fwft_ctr_supported(struct fwft_config *conf)
+{
+	if (!sbi_hart_has_extension(sbi_scratch_thishart_ptr(),
+				    SBI_HART_EXT_SSCTR))
+		return SBI_ENOTSUPP;
+
+	return SBI_OK;
+}
+
+static int fwft_set_ctr(struct fwft_config *conf, unsigned long value)
+{
+	/* CTR is enabled by default and can not be disabled. */
+	return SBI_EDENIED;
+}
+
+static int fwft_get_ctr(struct fwft_config *conf, unsigned long *value)
+{
+	*value = (csr_read(CSR_MSTATEEN0) & SMSTATEEN0_CTR) != 0;
+
+	return SBI_OK;
+}
+
 static struct fwft_config* get_feature_config(enum sbi_fwft_feature_t feature)
 {
 	int i;
@@ -236,6 +260,12 @@ static const struct fwft_feature features[] =
 		.set = fwft_set_adue,
 		.get = fwft_get_adue,
 	},
+	{
+		.id = SBI_FWFT_CONTROL_TRANSFER_RECORD,
+		.supported = fwft_ctr_supported,
+		.set = fwft_set_ctr,
+		.get = fwft_get_ctr,
+	},
 };
 
 int sbi_fwft_init(struct sbi_scratch *scratch, bool cold_boot)

-- 
2.34.1




More information about the opensbi mailing list