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