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