From: "Desnes A. Nunes do Rosario" <desn...@linux.vnet.ibm.com>

The number of reserved pkeys in a PowerNV environment is
different from that on PowerVM or KVM.

Tested on PowerVM and PowerNV environments.

Signed-off-by: "Desnes A. Nunes do Rosario" <desn...@linux.vnet.ibm.com>
Signed-off-by: Ram Pai <linux...@us.ibm.com>
Signed-off-by: Sandipan Das <sandi...@linux.ibm.com>
---
 tools/testing/selftests/vm/pkey-powerpc.h | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/vm/pkey-powerpc.h 
b/tools/testing/selftests/vm/pkey-powerpc.h
index f7a20bd07870..a70577045074 100644
--- a/tools/testing/selftests/vm/pkey-powerpc.h
+++ b/tools/testing/selftests/vm/pkey-powerpc.h
@@ -28,7 +28,10 @@
 #define NR_RESERVED_PKEYS_4K   27 /* pkey-0, pkey-1, exec-only-pkey
                                      and 24 other keys that cannot be
                                      represented in the PTE */
-#define NR_RESERVED_PKEYS_64K  3  /* pkey-0, pkey-1 and exec-only-pkey */
+#define NR_RESERVED_PKEYS_64K_3KEYS    3 /* PowerNV and KVM: pkey-0,
+                                            pkey-1 and exec-only key */
+#define NR_RESERVED_PKEYS_64K_4KEYS    4 /* PowerVM: pkey-0, pkey-1,
+                                            pkey-31 and exec-only key */
 #define PKEY_BITS_PER_PKEY     2
 #define HPAGE_SIZE             (1UL << 24)
 #define PAGE_SIZE              (1UL << 16)
@@ -69,12 +72,27 @@ static inline int cpu_has_pkeys(void)
        return 1;
 }
 
+static inline bool arch_is_powervm()
+{
+       struct stat buf;
+
+       if ((stat("/sys/firmware/devicetree/base/ibm,partition-name", &buf) == 
0) &&
+           (stat("/sys/firmware/devicetree/base/hmc-managed?", &buf) == 0) &&
+           (stat("/sys/firmware/devicetree/base/chosen/qemu,graphic-width", 
&buf) == -1) )
+               return true;
+
+       return false;
+}
+
 static inline int get_arch_reserved_keys(void)
 {
        if (sysconf(_SC_PAGESIZE) == 4096)
                return NR_RESERVED_PKEYS_4K;
        else
-               return NR_RESERVED_PKEYS_64K;
+               if (arch_is_powervm())
+                       return NR_RESERVED_PKEYS_64K_4KEYS;
+               else
+                       return NR_RESERVED_PKEYS_64K_3KEYS;
 }
 
 void expect_fault_on_read_execonly_key(void *p1, int pkey)
-- 
2.17.1

Reply via email to