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