xref: /kvm-unit-tests/s390x/snippets/c/mvpg-snippet.c (revision 3df301615cead4142fe28629d86142de32fc6768)
1*dcb58231SJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */
2*dcb58231SJanosch Frank /*
3*dcb58231SJanosch Frank  * Snippet used by the mvpg-sie.c test to check SIE PEI intercepts.
4*dcb58231SJanosch Frank  *
5*dcb58231SJanosch Frank  * Copyright (c) 2021 IBM Corp
6*dcb58231SJanosch Frank  *
7*dcb58231SJanosch Frank  * Authors:
8*dcb58231SJanosch Frank  *  Janosch Frank <frankja@linux.ibm.com>
9*dcb58231SJanosch Frank  */
1068200001SJanosch Frank 
force_exit(void)1168200001SJanosch Frank static inline void force_exit(void)
1268200001SJanosch Frank {
1368200001SJanosch Frank 	asm volatile("	diag	0,0,0x44\n");
1468200001SJanosch Frank }
1568200001SJanosch Frank 
mvpg(unsigned long r0,void * dest,void * src)1668200001SJanosch Frank static inline int mvpg(unsigned long r0, void *dest, void *src)
1768200001SJanosch Frank {
1868200001SJanosch Frank 	register unsigned long reg0 asm ("0") = r0;
1968200001SJanosch Frank 	int cc;
2068200001SJanosch Frank 
2168200001SJanosch Frank 	asm volatile("	mvpg    %1,%2\n"
2268200001SJanosch Frank 		     "	ipm     %0\n"
2368200001SJanosch Frank 		     "	srl     %0,28"
2468200001SJanosch Frank 		     : "=d" (cc) : "a" (dest), "a" (src), "d" (reg0)
2568200001SJanosch Frank 		     : "memory", "cc");
2668200001SJanosch Frank 	return cc;
2768200001SJanosch Frank }
2868200001SJanosch Frank 
test_mvpg_real(void)2968200001SJanosch Frank static void test_mvpg_real(void)
3068200001SJanosch Frank {
3168200001SJanosch Frank 	mvpg(0, (void *)0x5000, (void *)0x6000);
3268200001SJanosch Frank 	force_exit();
3368200001SJanosch Frank }
3468200001SJanosch Frank 
main(void)3568200001SJanosch Frank __attribute__((section(".text"))) int main(void)
3668200001SJanosch Frank {
3768200001SJanosch Frank 	test_mvpg_real();
3868200001SJanosch Frank 	test_mvpg_real();
3968200001SJanosch Frank 	test_mvpg_real();
4068200001SJanosch Frank 	return 0;
4168200001SJanosch Frank }
42