xref: /kvm-unit-tests/s390x/snippets/lib/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 for exiting the snippet.
4*da49e291SNina Schoetterl-Glausch  *
5*da49e291SNina Schoetterl-Glausch  * Copyright IBM Corp. 2023
6*da49e291SNina Schoetterl-Glausch  */
7*da49e291SNina Schoetterl-Glausch 
8*da49e291SNina Schoetterl-Glausch #ifndef _S390X_SNIPPET_LIB_EXIT_H_
9*da49e291SNina Schoetterl-Glausch #define _S390X_SNIPPET_LIB_EXIT_H_
10*da49e291SNina Schoetterl-Glausch 
11*da49e291SNina Schoetterl-Glausch #include <asm/arch_def.h>
12*da49e291SNina Schoetterl-Glausch #include <asm/barrier.h>
13*da49e291SNina Schoetterl-Glausch 
force_exit(void)14*da49e291SNina Schoetterl-Glausch static inline void force_exit(void)
15*da49e291SNina Schoetterl-Glausch {
16*da49e291SNina Schoetterl-Glausch 	mb(); /* host may read any memory written by the guest before */
17*da49e291SNina Schoetterl-Glausch 	diag44();
18*da49e291SNina Schoetterl-Glausch 	mb(); /* allow host to modify guest memory */
19*da49e291SNina Schoetterl-Glausch }
20*da49e291SNina Schoetterl-Glausch 
force_exit_value(uint64_t val)21*da49e291SNina Schoetterl-Glausch static inline void force_exit_value(uint64_t val)
22*da49e291SNina Schoetterl-Glausch {
23*da49e291SNina Schoetterl-Glausch 	mb(); /* host may read any memory written by the guest before */
24*da49e291SNina Schoetterl-Glausch 	diag500(val);
25*da49e291SNina Schoetterl-Glausch 	mb(); /* allow host to modify guest memory */
26*da49e291SNina Schoetterl-Glausch }
27*da49e291SNina Schoetterl-Glausch 
28*da49e291SNina Schoetterl-Glausch #endif /* _S390X_SNIPPET_LIB_EXIT_H_ */
29