xref: /kvm-unit-tests/lib/s390x/snippet-exit.h (revision 1f08a91a41402b0e032ecce8ed1b5952cbfca0ea)
1*da49e291SNina Schoetterl-Glausch /* SPDX-License-Identifier: GPL-2.0-only */
2*da49e291SNina Schoetterl-Glausch /*
3*da49e291SNina Schoetterl-Glausch  * Functionality handling snippet exits
4*da49e291SNina Schoetterl-Glausch  *
5*da49e291SNina Schoetterl-Glausch  * Copyright IBM Corp. 2024
6*da49e291SNina Schoetterl-Glausch  */
7*da49e291SNina Schoetterl-Glausch 
8*da49e291SNina Schoetterl-Glausch #ifndef _S390X_SNIPPET_EXIT_H_
9*da49e291SNina Schoetterl-Glausch #define _S390X_SNIPPET_EXIT_H_
10*da49e291SNina Schoetterl-Glausch 
11*da49e291SNina Schoetterl-Glausch #include <libcflat.h>
12*da49e291SNina Schoetterl-Glausch #include <sie.h>
13*da49e291SNina Schoetterl-Glausch #include <sie-icpt.h>
14*da49e291SNina Schoetterl-Glausch 
snippet_is_force_exit(struct vm * vm)15*da49e291SNina Schoetterl-Glausch static inline bool snippet_is_force_exit(struct vm *vm)
16*da49e291SNina Schoetterl-Glausch {
17*da49e291SNina Schoetterl-Glausch 	return sie_is_diag_icpt(vm, 0x44);
18*da49e291SNina Schoetterl-Glausch }
19*da49e291SNina Schoetterl-Glausch 
snippet_is_force_exit_value(struct vm * vm)20*da49e291SNina Schoetterl-Glausch static inline bool snippet_is_force_exit_value(struct vm *vm)
21*da49e291SNina Schoetterl-Glausch {
22*da49e291SNina Schoetterl-Glausch 	return sie_is_diag_icpt(vm, 0x500);
23*da49e291SNina Schoetterl-Glausch }
24*da49e291SNina Schoetterl-Glausch 
snippet_get_force_exit_value(struct vm * vm)25*da49e291SNina Schoetterl-Glausch static inline uint64_t snippet_get_force_exit_value(struct vm *vm)
26*da49e291SNina Schoetterl-Glausch {
27*da49e291SNina Schoetterl-Glausch 	assert(snippet_is_force_exit_value(vm));
28*da49e291SNina Schoetterl-Glausch 
29*da49e291SNina Schoetterl-Glausch 	return vm->save_area.guest.grs[2];
30*da49e291SNina Schoetterl-Glausch }
31*da49e291SNina Schoetterl-Glausch 
snippet_check_force_exit_value(struct vm * vm,uint64_t value_exp)32*da49e291SNina Schoetterl-Glausch static inline void snippet_check_force_exit_value(struct vm *vm, uint64_t value_exp)
33*da49e291SNina Schoetterl-Glausch {
34*da49e291SNina Schoetterl-Glausch 	uint64_t value;
35*da49e291SNina Schoetterl-Glausch 
36*da49e291SNina Schoetterl-Glausch 	if (snippet_is_force_exit_value(vm)) {
37*da49e291SNina Schoetterl-Glausch 		value = snippet_get_force_exit_value(vm);
38*da49e291SNina Schoetterl-Glausch 		report(value == value_exp, "guest forced exit with value (0x%lx == 0x%lx)",
39*da49e291SNina Schoetterl-Glausch 		       value, value_exp);
40*da49e291SNina Schoetterl-Glausch 	} else {
41*da49e291SNina Schoetterl-Glausch 		report_fail("guest forced exit with value");
42*da49e291SNina Schoetterl-Glausch 	}
43*da49e291SNina Schoetterl-Glausch }
44*da49e291SNina Schoetterl-Glausch 
45*da49e291SNina Schoetterl-Glausch #endif /* _S390X_SNIPPET_EXIT_H_ */
46