xref: /kvm-unit-tests/s390x/snippets/c/stfle.c (revision 1f08a91a41402b0e032ecce8ed1b5952cbfca0ea)
1*708ec6dbSNina Schoetterl-Glausch /* SPDX-License-Identifier: GPL-2.0-only */
2*708ec6dbSNina Schoetterl-Glausch /*
3*708ec6dbSNina Schoetterl-Glausch  * Copyright IBM Corp. 2023
4*708ec6dbSNina Schoetterl-Glausch  *
5*708ec6dbSNina Schoetterl-Glausch  * Snippet used by the STLFE interpretive execution facilities test.
6*708ec6dbSNina Schoetterl-Glausch  */
7*708ec6dbSNina Schoetterl-Glausch #include <libcflat.h>
8*708ec6dbSNina Schoetterl-Glausch #include <snippet-exit.h>
9*708ec6dbSNina Schoetterl-Glausch 
main(void)10*708ec6dbSNina Schoetterl-Glausch int main(void)
11*708ec6dbSNina Schoetterl-Glausch {
12*708ec6dbSNina Schoetterl-Glausch 	const unsigned int max_fac_len = 8;
13*708ec6dbSNina Schoetterl-Glausch 	uint64_t len_arg = max_fac_len - 1;
14*708ec6dbSNina Schoetterl-Glausch 	uint64_t res[max_fac_len + 1];
15*708ec6dbSNina Schoetterl-Glausch 	uint64_t fac[max_fac_len];
16*708ec6dbSNina Schoetterl-Glausch 
17*708ec6dbSNina Schoetterl-Glausch 	asm volatile (" lgr	0,%[len]\n"
18*708ec6dbSNina Schoetterl-Glausch 		"	stfle	%[fac]\n"
19*708ec6dbSNina Schoetterl-Glausch 		"	lgr	%[len],0\n"
20*708ec6dbSNina Schoetterl-Glausch 		: [fac] "=Q"(fac),
21*708ec6dbSNina Schoetterl-Glausch 		  [len] "+d"(len_arg)
22*708ec6dbSNina Schoetterl-Glausch 		:
23*708ec6dbSNina Schoetterl-Glausch 		: "%r0", "cc"
24*708ec6dbSNina Schoetterl-Glausch 	);
25*708ec6dbSNina Schoetterl-Glausch 	res[0] = len_arg;
26*708ec6dbSNina Schoetterl-Glausch 	memcpy(&res[1], fac, sizeof(fac));
27*708ec6dbSNina Schoetterl-Glausch 	force_exit_value((uint64_t)&res);
28*708ec6dbSNina Schoetterl-Glausch 	return 0;
29*708ec6dbSNina Schoetterl-Glausch }
30