linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Sandipan Das <sandipan@linux.ibm.com>
To: akpm@linux-foundation.org
Cc: linux-arch@vger.kernel.org, fweimer@redhat.com, shuah@kernel.org,
	Dave Hansen <dave.hansen@intel.com>,
	aneesh.kumar@linux.ibm.com, x86@kernel.org, linuxram@us.ibm.com,
	mhocko@kernel.org, linux-mm@kvack.org, mingo@redhat.com,
	linux-kselftest@vger.kernel.org, msuchanek@suse.de,
	linuxppc-dev@lists.ozlabs.org, bauerman@linux.ibm.com
Subject: [PATCH v19 16/24] selftests/vm/pkeys: Improve checks to determine pkey support
Date: Tue, 31 Mar 2020 15:28:17 +0530	[thread overview]
Message-ID: <8fb76c63ebdadcf068ecd2d23731032e195cd364.1585646528.git.sandipan@linux.ibm.com> (raw)
In-Reply-To: <cover.1585646528.git.sandipan@linux.ibm.com>
In-Reply-To: <cover.1585646528.git.sandipan@linux.ibm.com>

From: Ram Pai <linuxram@us.ibm.com>

For the pkeys subsystem to work, both the CPU and the
kernel need to have support. So, additionally check if
the kernel supports pkeys apart from the CPU feature
checks.

cc: Dave Hansen <dave.hansen@intel.com>
cc: Florian Weimer <fweimer@redhat.com>
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
Signed-off-by: Sandipan Das <sandipan@linux.ibm.com>
Acked-by: Dave Hansen <dave.hansen@intel.com>
---
 tools/testing/selftests/vm/pkey-helpers.h    | 30 ++++++++++++++++++++
 tools/testing/selftests/vm/pkey-powerpc.h    |  3 +-
 tools/testing/selftests/vm/pkey-x86.h        |  2 +-
 tools/testing/selftests/vm/protection_keys.c |  7 +++--
 4 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/vm/pkey-helpers.h b/tools/testing/selftests/vm/pkey-helpers.h
index 2f4b1eb3a680a..59ccdff18214f 100644
--- a/tools/testing/selftests/vm/pkey-helpers.h
+++ b/tools/testing/selftests/vm/pkey-helpers.h
@@ -76,6 +76,8 @@ extern void abort_hooks(void);
 
 __attribute__((noinline)) int read_ptr(int *ptr);
 void expected_pkey_fault(int pkey);
+int sys_pkey_alloc(unsigned long flags, unsigned long init_val);
+int sys_pkey_free(unsigned long pkey);
 
 #if defined(__i386__) || defined(__x86_64__) /* arch */
 #include "pkey-x86.h"
@@ -186,4 +188,32 @@ static inline u32 *siginfo_get_pkey_ptr(siginfo_t *si)
 #endif
 }
 
+static inline int kernel_has_pkeys(void)
+{
+	/* try allocating a key and see if it succeeds */
+	int ret = sys_pkey_alloc(0, 0);
+	if (ret <= 0) {
+		return 0;
+	}
+	sys_pkey_free(ret);
+	return 1;
+}
+
+static inline int is_pkeys_supported(void)
+{
+	/* check if the cpu supports pkeys */
+	if (!cpu_has_pkeys()) {
+		dprintf1("SKIP: %s: no CPU support\n", __func__);
+		return 0;
+	}
+
+	/* check if the kernel supports pkeys */
+	if (!kernel_has_pkeys()) {
+		dprintf1("SKIP: %s: no kernel support\n", __func__);
+		return 0;
+	}
+
+	return 1;
+}
+
 #endif /* _PKEYS_HELPER_H */
diff --git a/tools/testing/selftests/vm/pkey-powerpc.h b/tools/testing/selftests/vm/pkey-powerpc.h
index 319673bbab0b3..7d7c3ffafdd99 100644
--- a/tools/testing/selftests/vm/pkey-powerpc.h
+++ b/tools/testing/selftests/vm/pkey-powerpc.h
@@ -63,8 +63,9 @@ static inline void __write_pkey_reg(u64 pkey_reg)
 			__func__, __read_pkey_reg(), pkey_reg);
 }
 
-static inline int cpu_has_pku(void)
+static inline int cpu_has_pkeys(void)
 {
+	/* No simple way to determine this */
 	return 1;
 }
 
diff --git a/tools/testing/selftests/vm/pkey-x86.h b/tools/testing/selftests/vm/pkey-x86.h
index a0c59d4f7af2e..6421b846aa169 100644
--- a/tools/testing/selftests/vm/pkey-x86.h
+++ b/tools/testing/selftests/vm/pkey-x86.h
@@ -97,7 +97,7 @@ static inline void __cpuid(unsigned int *eax, unsigned int *ebx,
 #define X86_FEATURE_PKU        (1<<3) /* Protection Keys for Userspace */
 #define X86_FEATURE_OSPKE      (1<<4) /* OS Protection Keys Enable */
 
-static inline int cpu_has_pku(void)
+static inline int cpu_has_pkeys(void)
 {
 	unsigned int eax;
 	unsigned int ebx;
diff --git a/tools/testing/selftests/vm/protection_keys.c b/tools/testing/selftests/vm/protection_keys.c
index 5fcbbc525364e..95f173049f43f 100644
--- a/tools/testing/selftests/vm/protection_keys.c
+++ b/tools/testing/selftests/vm/protection_keys.c
@@ -1378,7 +1378,7 @@ void test_mprotect_pkey_on_unsupported_cpu(int *ptr, u16 pkey)
 	int size = PAGE_SIZE;
 	int sret;
 
-	if (cpu_has_pku()) {
+	if (cpu_has_pkeys()) {
 		dprintf1("SKIP: %s: no CPU support\n", __func__);
 		return;
 	}
@@ -1447,12 +1447,13 @@ void pkey_setup_shadow(void)
 int main(void)
 {
 	int nr_iterations = 22;
+	int pkeys_supported = is_pkeys_supported();
 
 	setup_handlers();
 
-	printf("has pku: %d\n", cpu_has_pku());
+	printf("has pkeys: %d\n", pkeys_supported);
 
-	if (!cpu_has_pku()) {
+	if (!pkeys_supported) {
 		int size = PAGE_SIZE;
 		int *ptr;
 
-- 
2.17.1


  parent reply	other threads:[~2020-03-31 10:32 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-31  9:58 [PATCH v19 00/24] selftests, powerpc, x86: Memory Protection Keys Sandipan Das
2020-03-31  9:58 ` [PATCH v19 01/24] selftests/x86/pkeys: Move selftests to arch-neutral directory Sandipan Das
2020-03-31  9:58 ` [PATCH v19 02/24] selftests/vm/pkeys: Rename all references to pkru to a generic name Sandipan Das
2020-03-31  9:58 ` [PATCH v19 03/24] selftests/vm/pkeys: Move generic definitions to header file Sandipan Das
2020-03-31  9:58 ` [PATCH v19 04/24] selftests/vm/pkeys: Move some definitions to arch-specific header Sandipan Das
2020-03-31  9:58 ` [PATCH v19 05/24] selftests/vm/pkeys: Make gcc check arguments of sigsafe_printf() Sandipan Das
2020-03-31  9:58 ` [PATCH v19 06/24] selftests: vm: pkeys: Use sane types for pkey register Sandipan Das
2020-03-31  9:58 ` [PATCH v19 07/24] selftests: vm: pkeys: Add helpers for pkey bits Sandipan Das
2020-03-31  9:58 ` [PATCH v19 08/24] selftests/vm/pkeys: Fix pkey_disable_clear() Sandipan Das
2020-03-31  9:58 ` [PATCH v19 09/24] selftests/vm/pkeys: Fix assertion in pkey_disable_set/clear() Sandipan Das
2020-03-31  9:58 ` [PATCH v19 10/24] selftests/vm/pkeys: Fix alloc_random_pkey() to make it really random Sandipan Das
2020-03-31  9:58 ` [PATCH v19 11/24] selftests: vm: pkeys: Use the correct huge page size Sandipan Das
2020-03-31  9:58 ` [PATCH v19 12/24] selftests/vm/pkeys: Introduce generic pkey abstractions Sandipan Das
2020-03-31  9:58 ` [PATCH v19 13/24] selftests/vm/pkeys: Introduce powerpc support Sandipan Das
2020-03-31  9:58 ` [PATCH v19 14/24] selftests/vm/pkeys: Fix number of reserved powerpc pkeys Sandipan Das
2020-03-31  9:58 ` [PATCH v19 15/24] selftests/vm/pkeys: Fix assertion in test_pkey_alloc_exhaust() Sandipan Das
2020-03-31  9:58 ` Sandipan Das [this message]
2020-03-31  9:58 ` [PATCH v19 17/24] selftests/vm/pkeys: Associate key on a mapped page and detect access violation Sandipan Das
2020-03-31  9:58 ` [PATCH v19 18/24] selftests/vm/pkeys: Associate key on a mapped page and detect write violation Sandipan Das
2020-03-31  9:58 ` [PATCH v19 19/24] selftests/vm/pkeys: Detect write violation on a mapped access-denied-key page Sandipan Das
2020-03-31  9:58 ` [PATCH v19 20/24] selftests/vm/pkeys: Introduce a sub-page allocator Sandipan Das
2020-03-31  9:58 ` [PATCH v19 21/24] selftests/vm/pkeys: Test correct behaviour of pkey-0 Sandipan Das
2020-03-31  9:58 ` [PATCH v19 22/24] selftests/vm/pkeys: Override access right definitions on powerpc Sandipan Das
2020-03-31  9:58 ` [PATCH v19 23/24] selftests: vm: pkeys: Use the correct page size " Sandipan Das
2020-03-31  9:58 ` [PATCH v19 24/24] selftests: vm: pkeys: Fix multilib builds for x86 Sandipan Das

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8fb76c63ebdadcf068ecd2d23731032e195cd364.1585646528.git.sandipan@linux.ibm.com \
    --to=sandipan@linux.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=aneesh.kumar@linux.ibm.com \
    --cc=bauerman@linux.ibm.com \
    --cc=dave.hansen@intel.com \
    --cc=fweimer@redhat.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=linuxram@us.ibm.com \
    --cc=mhocko@kernel.org \
    --cc=mingo@redhat.com \
    --cc=msuchanek@suse.de \
    --cc=shuah@kernel.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).