xref: /kvm-unit-tests/lib/s390x/asm/mem.h (revision b81a2cd4c2900db3fd6100c6b6bb09f768a2e4bf)
16c9f99dfSJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */
2f6b354fbSJanosch Frank /*
3f6b354fbSJanosch Frank  * Physical memory management related functions and definitions.
4f6b354fbSJanosch Frank  *
5f6b354fbSJanosch Frank  * Copyright IBM Corp. 2018
6*b81a2cd4SJanosch Frank  * Author(s): Janosch Frank <frankja@linux.ibm.com>
7f6b354fbSJanosch Frank  */
8eb5a1bbaSCornelia Huck #ifndef _ASMS390X_MEM_H_
9eb5a1bbaSCornelia Huck #define _ASMS390X_MEM_H_
10f6b354fbSJanosch Frank 
11d0bfafdfSJanosch Frank #define SKEY_ACC	0xf0
12d0bfafdfSJanosch Frank #define SKEY_FP		0x08
13d0bfafdfSJanosch Frank #define SKEY_RF		0x04
14d0bfafdfSJanosch Frank #define SKEY_CH		0x02
15d0bfafdfSJanosch Frank 
16f6b354fbSJanosch Frank union skey {
17f6b354fbSJanosch Frank 	struct {
18f6b354fbSJanosch Frank 		uint8_t acc : 4;
19f6b354fbSJanosch Frank 		uint8_t fp : 1;
20f6b354fbSJanosch Frank 		uint8_t rf : 1;
21f6b354fbSJanosch Frank 		uint8_t ch : 1;
22f6b354fbSJanosch Frank 		uint8_t pad : 1;
23f6b354fbSJanosch Frank 	} str;
24f6b354fbSJanosch Frank 	uint8_t val;
25f6b354fbSJanosch Frank };
26f6b354fbSJanosch Frank 
277b9ca995SJanosch Frank static inline void set_storage_key(void *addr, unsigned char skey, int nq)
28f6b354fbSJanosch Frank {
29f6b354fbSJanosch Frank 	if (nq)
30f6b354fbSJanosch Frank 		asm volatile(".insn rrf,0xb22b0000,%0,%1,8,0"
31f6b354fbSJanosch Frank 			     : : "d" (skey), "a" (addr));
32f6b354fbSJanosch Frank 	else
33f6b354fbSJanosch Frank 		asm volatile("sske %0,%1" : : "d" (skey), "a" (addr));
34f6b354fbSJanosch Frank }
35f6b354fbSJanosch Frank 
367b9ca995SJanosch Frank static inline void *set_storage_key_mb(void *addr, unsigned char skey)
37f6b354fbSJanosch Frank {
38f6b354fbSJanosch Frank 	assert(test_facility(8));
39f6b354fbSJanosch Frank 
40f6b354fbSJanosch Frank 	asm volatile(".insn rrf,0xb22b0000,%[skey],%[addr],1,0"
41f6b354fbSJanosch Frank 		     : [addr] "+a" (addr) : [skey] "d" (skey));
42f6b354fbSJanosch Frank 	return addr;
43f6b354fbSJanosch Frank }
44f6b354fbSJanosch Frank 
457b9ca995SJanosch Frank static inline unsigned char get_storage_key(void *addr)
46f6b354fbSJanosch Frank {
47f6b354fbSJanosch Frank 	unsigned char skey;
48f6b354fbSJanosch Frank 
49f6b354fbSJanosch Frank 	asm volatile("iske %0,%1" : "=d" (skey) : "a" (addr));
50f6b354fbSJanosch Frank 	return skey;
51f6b354fbSJanosch Frank }
526f9a99feSJanosch Frank 
536f9a99feSJanosch Frank #define PFMF_FSC_4K 0
546f9a99feSJanosch Frank #define PFMF_FSC_1M 1
556f9a99feSJanosch Frank #define PFMF_FSC_2G 2
566f9a99feSJanosch Frank 
576f9a99feSJanosch Frank union pfmf_r1 {
586f9a99feSJanosch Frank 	struct {
596f9a99feSJanosch Frank 		unsigned long pad0 : 32;
606f9a99feSJanosch Frank 		unsigned long pad1 : 12;
616f9a99feSJanosch Frank 		unsigned long pad_fmfi : 2;
626f9a99feSJanosch Frank 		unsigned long sk : 1; /* set key*/
636f9a99feSJanosch Frank 		unsigned long cf : 1; /* clear frame */
646f9a99feSJanosch Frank 		unsigned long ui : 1; /* usage indication */
656f9a99feSJanosch Frank 		unsigned long fsc : 3;
666f9a99feSJanosch Frank 		unsigned long pad2 : 1;
676f9a99feSJanosch Frank 		unsigned long mr : 1;
686f9a99feSJanosch Frank 		unsigned long mc : 1;
696f9a99feSJanosch Frank 		unsigned long pad3 : 1;
706f9a99feSJanosch Frank 		unsigned long key : 8; /* storage keys */
716f9a99feSJanosch Frank 	} reg;
726f9a99feSJanosch Frank 	unsigned long val;
736f9a99feSJanosch Frank };
746f9a99feSJanosch Frank 
756f9a99feSJanosch Frank static inline void *pfmf(unsigned long r1, void *paddr)
766f9a99feSJanosch Frank {
776f9a99feSJanosch Frank 	register void * addr asm("1") = paddr;
786f9a99feSJanosch Frank 
796f9a99feSJanosch Frank 	asm volatile(".insn rre,0xb9af0000,%[r1],%[addr]"
806f9a99feSJanosch Frank 		     : [addr] "+a" (addr) : [r1] "d" (r1) : "memory");
816f9a99feSJanosch Frank 	return addr;
826f9a99feSJanosch Frank }
83f6b354fbSJanosch Frank #endif
84