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)15static 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)20static 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)25static 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)32static 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