xref: /kvm-unit-tests/lib/s390x/asm/mem.h (revision 6f9a99fe00efddc40dc6efecf45c3c02439a9b07)
1f6b354fbSJanosch Frank /*
2f6b354fbSJanosch Frank  * Physical memory management related functions and definitions.
3f6b354fbSJanosch Frank  *
4f6b354fbSJanosch Frank  * Copyright IBM Corp. 2018
5f6b354fbSJanosch Frank  * Author(s): Janosch Frank <frankja@de.ibm.com>
6f6b354fbSJanosch Frank  *
7f6b354fbSJanosch Frank  * This code is free software; you can redistribute it and/or modify it
8f6b354fbSJanosch Frank  * under the terms of the GNU Library General Public License version 2.
9f6b354fbSJanosch Frank  */
10f6b354fbSJanosch Frank #ifndef _ASM_S390_MEM_H
11f6b354fbSJanosch Frank #define _ASM_S390_MEM_H
12f6b354fbSJanosch Frank 
13d0bfafdfSJanosch Frank #define SKEY_ACC	0xf0
14d0bfafdfSJanosch Frank #define SKEY_FP		0x08
15d0bfafdfSJanosch Frank #define SKEY_RF		0x04
16d0bfafdfSJanosch Frank #define SKEY_CH		0x02
17d0bfafdfSJanosch Frank 
18f6b354fbSJanosch Frank union skey {
19f6b354fbSJanosch Frank 	struct {
20f6b354fbSJanosch Frank 		uint8_t acc : 4;
21f6b354fbSJanosch Frank 		uint8_t fp : 1;
22f6b354fbSJanosch Frank 		uint8_t rf : 1;
23f6b354fbSJanosch Frank 		uint8_t ch : 1;
24f6b354fbSJanosch Frank 		uint8_t pad : 1;
25f6b354fbSJanosch Frank 	} str;
26f6b354fbSJanosch Frank 	uint8_t val;
27f6b354fbSJanosch Frank };
28f6b354fbSJanosch Frank 
29f6b354fbSJanosch Frank static inline void set_storage_key(unsigned long addr,
30f6b354fbSJanosch Frank 				   unsigned char skey,
31f6b354fbSJanosch Frank 				   int nq)
32f6b354fbSJanosch Frank {
33f6b354fbSJanosch Frank 	if (nq)
34f6b354fbSJanosch Frank 		asm volatile(".insn rrf,0xb22b0000,%0,%1,8,0"
35f6b354fbSJanosch Frank 			     : : "d" (skey), "a" (addr));
36f6b354fbSJanosch Frank 	else
37f6b354fbSJanosch Frank 		asm volatile("sske %0,%1" : : "d" (skey), "a" (addr));
38f6b354fbSJanosch Frank }
39f6b354fbSJanosch Frank 
40f6b354fbSJanosch Frank static inline unsigned long set_storage_key_mb(unsigned long addr,
41f6b354fbSJanosch Frank 					       unsigned char skey)
42f6b354fbSJanosch Frank {
43f6b354fbSJanosch Frank 	assert(test_facility(8));
44f6b354fbSJanosch Frank 
45f6b354fbSJanosch Frank 	asm volatile(".insn rrf,0xb22b0000,%[skey],%[addr],1,0"
46f6b354fbSJanosch Frank 		     : [addr] "+a" (addr) : [skey] "d" (skey));
47f6b354fbSJanosch Frank 	return addr;
48f6b354fbSJanosch Frank }
49f6b354fbSJanosch Frank 
50f6b354fbSJanosch Frank static inline unsigned char get_storage_key(unsigned long addr)
51f6b354fbSJanosch Frank {
52f6b354fbSJanosch Frank 	unsigned char skey;
53f6b354fbSJanosch Frank 
54f6b354fbSJanosch Frank 	asm volatile("iske %0,%1" : "=d" (skey) : "a" (addr));
55f6b354fbSJanosch Frank 	return skey;
56f6b354fbSJanosch Frank }
57*6f9a99feSJanosch Frank 
58*6f9a99feSJanosch Frank #define PFMF_FSC_4K 0
59*6f9a99feSJanosch Frank #define PFMF_FSC_1M 1
60*6f9a99feSJanosch Frank #define PFMF_FSC_2G 2
61*6f9a99feSJanosch Frank 
62*6f9a99feSJanosch Frank union pfmf_r1 {
63*6f9a99feSJanosch Frank 	struct {
64*6f9a99feSJanosch Frank 		unsigned long pad0 : 32;
65*6f9a99feSJanosch Frank 		unsigned long pad1 : 12;
66*6f9a99feSJanosch Frank 		unsigned long pad_fmfi : 2;
67*6f9a99feSJanosch Frank 		unsigned long sk : 1; /* set key*/
68*6f9a99feSJanosch Frank 		unsigned long cf : 1; /* clear frame */
69*6f9a99feSJanosch Frank 		unsigned long ui : 1; /* usage indication */
70*6f9a99feSJanosch Frank 		unsigned long fsc : 3;
71*6f9a99feSJanosch Frank 		unsigned long pad2 : 1;
72*6f9a99feSJanosch Frank 		unsigned long mr : 1;
73*6f9a99feSJanosch Frank 		unsigned long mc : 1;
74*6f9a99feSJanosch Frank 		unsigned long pad3 : 1;
75*6f9a99feSJanosch Frank 		unsigned long key : 8; /* storage keys */
76*6f9a99feSJanosch Frank 	} reg;
77*6f9a99feSJanosch Frank 	unsigned long val;
78*6f9a99feSJanosch Frank };
79*6f9a99feSJanosch Frank 
80*6f9a99feSJanosch Frank static inline void *pfmf(unsigned long r1, void *paddr)
81*6f9a99feSJanosch Frank {
82*6f9a99feSJanosch Frank 	register void * addr asm("1") = paddr;
83*6f9a99feSJanosch Frank 
84*6f9a99feSJanosch Frank 	asm volatile(".insn rre,0xb9af0000,%[r1],%[addr]"
85*6f9a99feSJanosch Frank 		     : [addr] "+a" (addr) : [r1] "d" (r1) : "memory");
86*6f9a99feSJanosch Frank 	return addr;
87*6f9a99feSJanosch Frank }
88f6b354fbSJanosch Frank #endif
89