xref: /kvm-unit-tests/s390x/panic-loop-pgm.c (revision 8a078df4dde8f4a0113b9d45bb02140ea9c24ba5)
1*fa594892SNico Boehr /* SPDX-License-Identifier: GPL-2.0-only */
2*fa594892SNico Boehr /*
3*fa594892SNico Boehr  * Program interrupt loop test
4*fa594892SNico Boehr  *
5*fa594892SNico Boehr  * Copyright IBM Corp. 2022
6*fa594892SNico Boehr  *
7*fa594892SNico Boehr  * Authors:
8*fa594892SNico Boehr  *  Nico Boehr <nrb@linux.ibm.com>
9*fa594892SNico Boehr  */
10*fa594892SNico Boehr #include <libcflat.h>
11*fa594892SNico Boehr #include <bitops.h>
12*fa594892SNico Boehr #include <asm/interrupt.h>
13*fa594892SNico Boehr #include <asm/barrier.h>
14*fa594892SNico Boehr #include <hardware.h>
15*fa594892SNico Boehr 
main(void)16*fa594892SNico Boehr int main(void)
17*fa594892SNico Boehr {
18*fa594892SNico Boehr 	report_prefix_push("panic-loop-pgm");
19*fa594892SNico Boehr 
20*fa594892SNico Boehr 	if (!host_is_qemu() || host_is_tcg()) {
21*fa594892SNico Boehr 		report_skip("QEMU-KVM-only test");
22*fa594892SNico Boehr 		goto out;
23*fa594892SNico Boehr 	}
24*fa594892SNico Boehr 
25*fa594892SNico Boehr 	expect_pgm_int();
26*fa594892SNico Boehr 	/* bit 12 set is invalid */
27*fa594892SNico Boehr 	lowcore.pgm_new_psw.mask = extract_psw_mask() | BIT(63 - 12);
28*fa594892SNico Boehr 	mb();
29*fa594892SNico Boehr 
30*fa594892SNico Boehr 	/* cause a pgm int */
31*fa594892SNico Boehr 	psw_mask_set_bits(BIT(63 - 12));
32*fa594892SNico Boehr 
33*fa594892SNico Boehr 	report_fail("survived pgm int loop");
34*fa594892SNico Boehr 
35*fa594892SNico Boehr out:
36*fa594892SNico Boehr 	report_prefix_pop();
37*fa594892SNico Boehr 	return report_summary();
38*fa594892SNico Boehr }
39