[kvm-unit-tests PATCH 2/2] riscv: sbi: Improve spec version test
Andrew Jones
andrew.jones at linux.dev
Wed Sep 11 04:33:41 PDT 2024
SBI spec version states that bit 31 must be zero and doesn't say
anything about bits greater than 31 (for rv64). Check that bit
31 is zero and assume all other bits are UNKNOWN, so mask them
off before testing.
Signed-off-by: Andrew Jones <andrew.jones at linux.dev>
---
lib/riscv/sbi.c | 2 +-
riscv/sbi.c | 15 +++++++++++----
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/lib/riscv/sbi.c b/lib/riscv/sbi.c
index ecc63acdebb7..f8ed873c2eee 100644
--- a/lib/riscv/sbi.c
+++ b/lib/riscv/sbi.c
@@ -97,7 +97,7 @@ long sbi_probe(int ext)
struct sbiret ret;
ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_SPEC_VERSION, 0, 0, 0, 0, 0, 0);
- assert(!ret.error && ret.value >= 2);
+ assert(!ret.error && (ret.value & 0x7ffffffful) >= 2);
ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, ext, 0, 0, 0, 0, 0);
assert(!ret.error);
diff --git a/riscv/sbi.c b/riscv/sbi.c
index 300d5ae63084..f6d62c5644ae 100644
--- a/riscv/sbi.c
+++ b/riscv/sbi.c
@@ -105,18 +105,25 @@ static void check_base(void)
report_prefix_push("base");
ret = sbi_base(SBI_EXT_BASE_GET_SPEC_VERSION, 0);
- if (ret.error || ret.value < 2) {
- report_skip("SBI spec version 0.2 or higher required");
- return;
- }
+ if (!ret.error)
+ ret.value &= 0xfffffffful;
report_prefix_push("spec_version");
if (env_or_skip("SBI_SPEC_VERSION")) {
expected = (long)strtoul(getenv("SBI_SPEC_VERSION"), NULL, 0);
+ assert_msg(!(expected & BIT(31)), "SBI spec version bit 31 must be zero");
+ assert_msg(__riscv_xlen == 32 || !(expected >> 32), "SBI spec version bits greater than 31 are UNKNOWN");
gen_report(&ret, 0, expected);
}
report_prefix_pop();
+ ret.value &= 0x7ffffffful;
+
+ if (ret.error || ret.value < 2) {
+ report_skip("SBI spec version 0.2 or higher required");
+ return;
+ }
+
report_prefix_push("impl_id");
if (env_or_skip("SBI_IMPL_ID")) {
expected = (long)strtoul(getenv("SBI_IMPL_ID"), NULL, 0);
--
2.46.0
More information about the kvm-riscv
mailing list