This patch refactors the current sbi fwft tests (pte_ad_hw_updating, misaligned_exc_deleg) Signed-off-by: Akshay Behl <akshaybehl231@xxxxxxxxx> --- riscv/sbi-fwft.c | 58 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/riscv/sbi-fwft.c b/riscv/sbi-fwft.c index ac2e3486..bf735f62 100644 --- a/riscv/sbi-fwft.c +++ b/riscv/sbi-fwft.c @@ -19,6 +19,15 @@ void check_fwft(void); +static bool env_or_skip(const char *env) +{ + if (!getenv(env)) { + report_skip("missing %s environment variable", env); + return false; + } + + return true; +} static struct sbiret fwft_set_raw(unsigned long feature, unsigned long value, unsigned long flags) { @@ -66,6 +75,13 @@ static void fwft_check_reserved(unsigned long id) sbiret_report_error(&ret, SBI_ERR_DENIED, "set reserved feature 0x%lx", id); } +static void fwft_check_reset(uint32_t feature, unsigned long reset) +{ + struct sbiret ret = fwft_get(feature); + + sbiret_report(&ret, SBI_SUCCESS, reset, "resets to %lu", reset); +} + static void fwft_check_base(void) { report_prefix_push("base"); @@ -99,18 +115,32 @@ static struct sbiret fwft_misaligned_exc_get(void) static void fwft_check_misaligned_exc_deleg(void) { struct sbiret ret; + unsigned long expected; report_prefix_push("misaligned_exc_deleg"); ret = fwft_misaligned_exc_get(); - if (ret.error == SBI_ERR_NOT_SUPPORTED) { - report_skip("SBI_FWFT_MISALIGNED_EXC_DELEG is not supported"); + if (ret.error != SBI_SUCCESS) { + if (env_or_skip("SBI_HAVE_FWFT_MISALIGNED_EXC_DELEG")) { + expected = (unsigned long)strtoul(getenv("SBI_HAVE_FWFT_MISALIGNED_EXC_DELEG"), NULL, 0); + if (expected == 1) + { + report_fail("not supported by platform"); + return; + } + } + report_skip("not supported by platform"); return; } if (!sbiret_report_error(&ret, SBI_SUCCESS, "Get misaligned deleg feature")) return; + if (env_or_skip("MISALIGNED_EXC_DELEG_RESET")) { + expected = (unsigned long)strtoul(getenv("MISALIGNED_EXC_DELEG_RESET"), NULL, 0); + fwft_check_reset(SBI_FWFT_MISALIGNED_EXC_DELEG, expected); + } + ret = fwft_misaligned_exc_set(2, 0); sbiret_report_error(&ret, SBI_ERR_INVALID_PARAM, "Set misaligned deleg feature invalid value 2"); @@ -129,16 +159,10 @@ static void fwft_check_misaligned_exc_deleg(void) #endif /* Set to 0 and check after with get */ - ret = fwft_misaligned_exc_set(0, 0); - sbiret_report_error(&ret, SBI_SUCCESS, "Set misaligned deleg feature value 0"); - ret = fwft_misaligned_exc_get(); - sbiret_report(&ret, SBI_SUCCESS, 0, "Get misaligned deleg feature expected value 0"); + fwft_set_and_check_raw("", SBI_FWFT_MISALIGNED_EXC_DELEG, 0, 0); /* Set to 1 and check after with get */ - ret = fwft_misaligned_exc_set(1, 0); - sbiret_report_error(&ret, SBI_SUCCESS, "Set misaligned deleg feature value 1"); - ret = fwft_misaligned_exc_get(); - sbiret_report(&ret, SBI_SUCCESS, 1, "Get misaligned deleg feature expected value 1"); + fwft_set_and_check_raw("", SBI_FWFT_MISALIGNED_EXC_DELEG, 1, 0); install_exception_handler(EXC_LOAD_MISALIGNED, misaligned_handler); @@ -257,11 +281,20 @@ static void fwft_check_pte_ad_hw_updating(void) { struct sbiret ret; bool enabled; + unsigned long expected; report_prefix_push("pte_ad_hw_updating"); ret = fwft_get(SBI_FWFT_PTE_AD_HW_UPDATING); - if (ret.error == SBI_ERR_NOT_SUPPORTED) { + if (ret.error != SBI_SUCCESS) { + if (env_or_skip("SBI_HAVE_FWFT_PTE_AD_HW_UPDATING")) { + expected = (unsigned long)strtoul(getenv("SBI_HAVE_FWFT_PTE_AD_HW_UPDATING"), NULL, 0); + if (expected == 1) + { + report_fail("not supported by platform"); + return; + } + } report_skip("not supported by platform"); return; } else if (!sbiret_report_error(&ret, SBI_SUCCESS, "get")) { @@ -269,10 +302,9 @@ static void fwft_check_pte_ad_hw_updating(void) return; } - report(ret.value == 0 || ret.value == 1, "first get value is 0/1"); + fwft_check_reset(SBI_FWFT_PTE_AD_HW_UPDATING, 1); enabled = ret.value; - report_kfail(true, !enabled, "resets to 0"); install_exception_handler(EXC_LOAD_PAGE_FAULT, adue_read_handler); install_exception_handler(EXC_STORE_PAGE_FAULT, adue_write_handler); -- 2.34.1