KVM did not properly reset the no-translate bit after reset, see https://lore.kernel.org/kvm/20231109123624.37314-1-imbrenda@xxxxxxxxxxxxx/ Add a test which performs a load normal reset (includes a subsystem reset) and verify that this clears the no-translate bit. Signed-off-by: Nico Boehr <nrb@xxxxxxxxxxxxx> --- s390x/cmm.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/s390x/cmm.c b/s390x/cmm.c index af852838851e..8f10c107d81b 100644 --- a/s390x/cmm.c +++ b/s390x/cmm.c @@ -9,6 +9,7 @@ */ #include <libcflat.h> +#include <bitops.h> #include <asm/asm-offsets.h> #include <asm/interrupt.h> #include <asm/page.h> @@ -16,6 +17,8 @@ static uint8_t pagebuf[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); +extern int diag308_load_reset(u64); + static void test_params(void) { report_prefix_push("invalid ORC 8"); @@ -35,6 +38,26 @@ static void test_priv(void) report_prefix_pop(); } +static void test_reset_no_translate(void) +{ + unsigned long state; + const uint64_t mask_no_translate = BIT(63 - 58); + + report_prefix_push("reset no-translate"); + essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf); + + state = essa(ESSA_GET_STATE, (unsigned long)pagebuf); + report(state & mask_no_translate, "no-translate bit set before reset"); + + /* Load normal reset - includes subsystem reset */ + diag308_load_reset(1); + + state = essa(ESSA_GET_STATE, (unsigned long)pagebuf); + report(!(state & mask_no_translate), "no-translate bit unset after reset"); + + report_prefix_pop(); +} + int main(void) { bool has_essa = check_essa_available(); @@ -47,6 +70,7 @@ int main(void) test_priv(); test_params(); + test_reset_no_translate(); done: report_prefix_pop(); return report_summary(); -- 2.41.0