xref: /kvm-unit-tests/s390x/cmm.c (revision 9cab58249f98adc451933530fd7e618e1856eb94)
1fa624cc2SJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */
242df4291SJanosch Frank /*
342df4291SJanosch Frank  * CMM tests (ESSA)
442df4291SJanosch Frank  *
542df4291SJanosch Frank  * Copyright (c) 2018 IBM Corp
642df4291SJanosch Frank  *
742df4291SJanosch Frank  * Authors:
842df4291SJanosch Frank  *  Janosch Frank <frankja@linux.vnet.ibm.com>
942df4291SJanosch Frank  */
1042df4291SJanosch Frank 
1142df4291SJanosch Frank #include <libcflat.h>
12*7315fc8aSNico Boehr #include <bitops.h>
1342df4291SJanosch Frank #include <asm/asm-offsets.h>
1442df4291SJanosch Frank #include <asm/interrupt.h>
1542df4291SJanosch Frank #include <asm/page.h>
16e13ab1eaSNico Boehr #include <asm/cmm.h>
17*7315fc8aSNico Boehr #include <asm/facility.h>
1842df4291SJanosch Frank 
1942df4291SJanosch Frank static uint8_t pagebuf[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
2042df4291SJanosch Frank 
21*7315fc8aSNico Boehr extern int diag308_load_reset(u64);
22*7315fc8aSNico Boehr 
test_params(void)2342df4291SJanosch Frank static void test_params(void)
2442df4291SJanosch Frank {
25e4654a1bSJanosch Frank 	report_prefix_push("invalid ORC 8");
2642df4291SJanosch Frank 	expect_pgm_int();
2742df4291SJanosch Frank 	essa(8, (unsigned long)pagebuf);
2842df4291SJanosch Frank 	check_pgm_int_code(PGM_INT_CODE_SPECIFICATION);
29e4654a1bSJanosch Frank 	report_prefix_pop();
3042df4291SJanosch Frank }
3142df4291SJanosch Frank 
test_priv(void)3242df4291SJanosch Frank static void test_priv(void)
3342df4291SJanosch Frank {
34e4654a1bSJanosch Frank 	report_prefix_push("privileged");
3542df4291SJanosch Frank 	expect_pgm_int();
3642df4291SJanosch Frank 	enter_pstate();
37e13ab1eaSNico Boehr 	essa(ESSA_GET_STATE, (unsigned long)pagebuf);
3842df4291SJanosch Frank 	check_pgm_int_code(PGM_INT_CODE_PRIVILEGED_OPERATION);
39e4654a1bSJanosch Frank 	report_prefix_pop();
4042df4291SJanosch Frank }
4142df4291SJanosch Frank 
test_reset_no_translate(void)42*7315fc8aSNico Boehr static void test_reset_no_translate(void)
43*7315fc8aSNico Boehr {
44*7315fc8aSNico Boehr 	const uint64_t mask_no_translate = BIT(63 - 58);
45*7315fc8aSNico Boehr 	unsigned long state;
46*7315fc8aSNico Boehr 
47*7315fc8aSNico Boehr 	if (!test_facility(147)) {
48*7315fc8aSNico Boehr 		report_prefix_push("no-translate unavailable");
49*7315fc8aSNico Boehr 		expect_pgm_int();
50*7315fc8aSNico Boehr 		essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf);
51*7315fc8aSNico Boehr 		check_pgm_int_code(PGM_INT_CODE_SPECIFICATION);
52*7315fc8aSNico Boehr 		report_prefix_pop();
53*7315fc8aSNico Boehr 		return;
54*7315fc8aSNico Boehr 	}
55*7315fc8aSNico Boehr 
56*7315fc8aSNico Boehr 	report_prefix_push("reset no-translate");
57*7315fc8aSNico Boehr 	essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf);
58*7315fc8aSNico Boehr 
59*7315fc8aSNico Boehr 	state = essa(ESSA_GET_STATE, (unsigned long)pagebuf);
60*7315fc8aSNico Boehr 	report(state & mask_no_translate, "no-translate bit set before reset");
61*7315fc8aSNico Boehr 
62*7315fc8aSNico Boehr 	/* Load normal reset - includes subsystem reset */
63*7315fc8aSNico Boehr 	diag308_load_reset(1);
64*7315fc8aSNico Boehr 
65*7315fc8aSNico Boehr 	state = essa(ESSA_GET_STATE, (unsigned long)pagebuf);
66*7315fc8aSNico Boehr 	report(!(state & mask_no_translate), "no-translate bit unset after reset");
67*7315fc8aSNico Boehr 
68*7315fc8aSNico Boehr 	report_prefix_pop();
69*7315fc8aSNico Boehr }
70*7315fc8aSNico Boehr 
main(void)7142df4291SJanosch Frank int main(void)
7242df4291SJanosch Frank {
73e13ab1eaSNico Boehr 	bool has_essa = check_essa_available();
7442df4291SJanosch Frank 
7542df4291SJanosch Frank 	report_prefix_push("cmm");
7690016cc5SThomas Huth 	if (!has_essa) {
7790016cc5SThomas Huth 		report_skip("ESSA is not available");
7842df4291SJanosch Frank 		goto done;
7990016cc5SThomas Huth 	}
8042df4291SJanosch Frank 
8142df4291SJanosch Frank 	test_priv();
8242df4291SJanosch Frank 	test_params();
83*7315fc8aSNico Boehr 	test_reset_no_translate();
8442df4291SJanosch Frank done:
8542df4291SJanosch Frank 	report_prefix_pop();
8642df4291SJanosch Frank 	return report_summary();
8742df4291SJanosch Frank }
88