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-Glauschstatic 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-Glauschstatic 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-Glauschstatic 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-Glauschstatic 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