xref: /kvm-unit-tests/lib/s390x/asm/cmm.h (revision 610c15284a537484682adfb4b6d6313991ab954f)
1*e13ab1eaSNico Boehr /* SPDX-License-Identifier: GPL-2.0 */
2*e13ab1eaSNico Boehr /*
3*e13ab1eaSNico Boehr  *    Copyright IBM Corp. 2017, 2022
4*e13ab1eaSNico Boehr  *    Author(s): Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
5*e13ab1eaSNico Boehr  *               Nico Boehr <nrb@linux.ibm.com>
6*e13ab1eaSNico Boehr  */
7*e13ab1eaSNico Boehr #include <asm/interrupt.h>
8*e13ab1eaSNico Boehr 
9*e13ab1eaSNico Boehr #ifndef PAGE_STATES_H
10*e13ab1eaSNico Boehr #define PAGE_STATES_H
11*e13ab1eaSNico Boehr 
12*e13ab1eaSNico Boehr #define ESSA_GET_STATE			0
13*e13ab1eaSNico Boehr #define ESSA_SET_STABLE			1
14*e13ab1eaSNico Boehr #define ESSA_SET_UNUSED			2
15*e13ab1eaSNico Boehr #define ESSA_SET_VOLATILE		3
16*e13ab1eaSNico Boehr #define ESSA_SET_POT_VOLATILE		4
17*e13ab1eaSNico Boehr #define ESSA_SET_STABLE_RESIDENT	5
18*e13ab1eaSNico Boehr #define ESSA_SET_STABLE_IF_RESIDENT	6
19*e13ab1eaSNico Boehr #define ESSA_SET_STABLE_NODAT		7
20*e13ab1eaSNico Boehr 
21*e13ab1eaSNico Boehr #define ESSA_MAX	ESSA_SET_STABLE_NODAT
22*e13ab1eaSNico Boehr 
23*e13ab1eaSNico Boehr #define ESSA_USAGE_STABLE		0
24*e13ab1eaSNico Boehr #define ESSA_USAGE_UNUSED		1
25*e13ab1eaSNico Boehr #define ESSA_USAGE_POT_VOLATILE		2
26*e13ab1eaSNico Boehr #define ESSA_USAGE_VOLATILE		3
27*e13ab1eaSNico Boehr 
essa(uint8_t state,unsigned long paddr)28*e13ab1eaSNico Boehr static unsigned long essa(uint8_t state, unsigned long paddr)
29*e13ab1eaSNico Boehr {
30*e13ab1eaSNico Boehr 	uint64_t extr_state;
31*e13ab1eaSNico Boehr 
32*e13ab1eaSNico Boehr 	asm volatile(".insn rrf,0xb9ab0000,%[extr_state],%[addr],%[new_state],0" \
33*e13ab1eaSNico Boehr 			: [extr_state] "=d" (extr_state) \
34*e13ab1eaSNico Boehr 			: [addr] "a" (paddr), [new_state] "i" (state));
35*e13ab1eaSNico Boehr 
36*e13ab1eaSNico Boehr 	return (unsigned long)extr_state;
37*e13ab1eaSNico Boehr }
38*e13ab1eaSNico Boehr 
39*e13ab1eaSNico Boehr /*
40*e13ab1eaSNico Boehr  * Unfortunately the availability is not indicated by stfl bits, but
41*e13ab1eaSNico Boehr  * we have to try to execute it and test for an operation exception.
42*e13ab1eaSNico Boehr  */
check_essa_available(void)43*e13ab1eaSNico Boehr static inline bool check_essa_available(void)
44*e13ab1eaSNico Boehr {
45*e13ab1eaSNico Boehr 	expect_pgm_int();
46*e13ab1eaSNico Boehr 	essa(ESSA_GET_STATE, 0);
47*e13ab1eaSNico Boehr 	return clear_pgm_int() == 0;
48*e13ab1eaSNico Boehr }
49*e13ab1eaSNico Boehr 
50*e13ab1eaSNico Boehr #endif
51