x86/pkeys/selftests: Adjust the self-test to fresh distros that export the pkeys ABI

Ubuntu 18.04 started exporting pkeys details in header files, resulting
in build failures and warnings in the pkeys self-tests:

  protection_keys.c:232:0: warning: "SEGV_BNDERR" redefined
  protection_keys.c:387:5: error: conflicting types for ‘pkey_get’
  protection_keys.c:409:5: error: conflicting types for ‘pkey_set’
  ...

Fix these namespace conflicts and double definitions, plus also
clean up the ABI definitions to make it all a bit more readable ...

Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: akpm@linux-foundation.org
Cc: dave.hansen@intel.com
Cc: linux-mm@kvack.org
Cc: linuxram@us.ibm.com
Cc: mpe@ellerman.id.au
Cc: shakeelb@google.com
Cc: shuah@kernel.org
Link: http://lkml.kernel.org/r/20180514085623.GB7094@gmail.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Ingo Molnar 2018-05-14 10:56:23 +02:00
parent 4a09f0210c
commit 0fb96620dc
1 changed files with 41 additions and 26 deletions

View File

@ -191,26 +191,30 @@ void lots_o_noops_around_write(int *write_to_me)
#ifdef __i386__ #ifdef __i386__
#ifndef SYS_mprotect_key #ifndef SYS_mprotect_key
# define SYS_mprotect_key 380 # define SYS_mprotect_key 380
#endif #endif
#ifndef SYS_pkey_alloc #ifndef SYS_pkey_alloc
# define SYS_pkey_alloc 381 # define SYS_pkey_alloc 381
# define SYS_pkey_free 382 # define SYS_pkey_free 382
#endif #endif
#define REG_IP_IDX REG_EIP
#define si_pkey_offset 0x14 #define REG_IP_IDX REG_EIP
#define si_pkey_offset 0x14
#else #else
#ifndef SYS_mprotect_key #ifndef SYS_mprotect_key
# define SYS_mprotect_key 329 # define SYS_mprotect_key 329
#endif #endif
#ifndef SYS_pkey_alloc #ifndef SYS_pkey_alloc
# define SYS_pkey_alloc 330 # define SYS_pkey_alloc 330
# define SYS_pkey_free 331 # define SYS_pkey_free 331
#endif #endif
#define REG_IP_IDX REG_RIP
#define si_pkey_offset 0x20 #define REG_IP_IDX REG_RIP
#define si_pkey_offset 0x20
#endif #endif
@ -225,8 +229,14 @@ void dump_mem(void *dumpme, int len_bytes)
} }
} }
#define SEGV_BNDERR 3 /* failed address bound checks */ /* Failed address bound checks: */
#define SEGV_PKUERR 4 #ifndef SEGV_BNDERR
# define SEGV_BNDERR 3
#endif
#ifndef SEGV_PKUERR
# define SEGV_PKUERR 4
#endif
static char *si_code_str(int si_code) static char *si_code_str(int si_code)
{ {
@ -393,10 +403,15 @@ pid_t fork_lazy_child(void)
return forkret; return forkret;
} }
#define PKEY_DISABLE_ACCESS 0x1 #ifndef PKEY_DISABLE_ACCESS
#define PKEY_DISABLE_WRITE 0x2 # define PKEY_DISABLE_ACCESS 0x1
#endif
u32 pkey_get(int pkey, unsigned long flags) #ifndef PKEY_DISABLE_WRITE
# define PKEY_DISABLE_WRITE 0x2
#endif
static u32 hw_pkey_get(int pkey, unsigned long flags)
{ {
u32 mask = (PKEY_DISABLE_ACCESS|PKEY_DISABLE_WRITE); u32 mask = (PKEY_DISABLE_ACCESS|PKEY_DISABLE_WRITE);
u32 pkru = __rdpkru(); u32 pkru = __rdpkru();
@ -418,7 +433,7 @@ u32 pkey_get(int pkey, unsigned long flags)
return masked_pkru; return masked_pkru;
} }
int pkey_set(int pkey, unsigned long rights, unsigned long flags) static int hw_pkey_set(int pkey, unsigned long rights, unsigned long flags)
{ {
u32 mask = (PKEY_DISABLE_ACCESS|PKEY_DISABLE_WRITE); u32 mask = (PKEY_DISABLE_ACCESS|PKEY_DISABLE_WRITE);
u32 old_pkru = __rdpkru(); u32 old_pkru = __rdpkru();
@ -452,15 +467,15 @@ void pkey_disable_set(int pkey, int flags)
pkey, flags); pkey, flags);
pkey_assert(flags & (PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE)); pkey_assert(flags & (PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE));
pkey_rights = pkey_get(pkey, syscall_flags); pkey_rights = hw_pkey_get(pkey, syscall_flags);
dprintf1("%s(%d) pkey_get(%d): %x\n", __func__, dprintf1("%s(%d) hw_pkey_get(%d): %x\n", __func__,
pkey, pkey, pkey_rights); pkey, pkey, pkey_rights);
pkey_assert(pkey_rights >= 0); pkey_assert(pkey_rights >= 0);
pkey_rights |= flags; pkey_rights |= flags;
ret = pkey_set(pkey, pkey_rights, syscall_flags); ret = hw_pkey_set(pkey, pkey_rights, syscall_flags);
assert(!ret); assert(!ret);
/*pkru and flags have the same format */ /*pkru and flags have the same format */
shadow_pkru |= flags << (pkey * 2); shadow_pkru |= flags << (pkey * 2);
@ -468,8 +483,8 @@ void pkey_disable_set(int pkey, int flags)
pkey_assert(ret >= 0); pkey_assert(ret >= 0);
pkey_rights = pkey_get(pkey, syscall_flags); pkey_rights = hw_pkey_get(pkey, syscall_flags);
dprintf1("%s(%d) pkey_get(%d): %x\n", __func__, dprintf1("%s(%d) hw_pkey_get(%d): %x\n", __func__,
pkey, pkey, pkey_rights); pkey, pkey, pkey_rights);
dprintf1("%s(%d) pkru: 0x%x\n", __func__, pkey, rdpkru()); dprintf1("%s(%d) pkru: 0x%x\n", __func__, pkey, rdpkru());
@ -483,24 +498,24 @@ void pkey_disable_clear(int pkey, int flags)
{ {
unsigned long syscall_flags = 0; unsigned long syscall_flags = 0;
int ret; int ret;
int pkey_rights = pkey_get(pkey, syscall_flags); int pkey_rights = hw_pkey_get(pkey, syscall_flags);
u32 orig_pkru = rdpkru(); u32 orig_pkru = rdpkru();
pkey_assert(flags & (PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE)); pkey_assert(flags & (PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE));
dprintf1("%s(%d) pkey_get(%d): %x\n", __func__, dprintf1("%s(%d) hw_pkey_get(%d): %x\n", __func__,
pkey, pkey, pkey_rights); pkey, pkey, pkey_rights);
pkey_assert(pkey_rights >= 0); pkey_assert(pkey_rights >= 0);
pkey_rights |= flags; pkey_rights |= flags;
ret = pkey_set(pkey, pkey_rights, 0); ret = hw_pkey_set(pkey, pkey_rights, 0);
/* pkru and flags have the same format */ /* pkru and flags have the same format */
shadow_pkru &= ~(flags << (pkey * 2)); shadow_pkru &= ~(flags << (pkey * 2));
pkey_assert(ret >= 0); pkey_assert(ret >= 0);
pkey_rights = pkey_get(pkey, syscall_flags); pkey_rights = hw_pkey_get(pkey, syscall_flags);
dprintf1("%s(%d) pkey_get(%d): %x\n", __func__, dprintf1("%s(%d) hw_pkey_get(%d): %x\n", __func__,
pkey, pkey, pkey_rights); pkey, pkey, pkey_rights);
dprintf1("%s(%d) pkru: 0x%x\n", __func__, pkey, rdpkru()); dprintf1("%s(%d) pkru: 0x%x\n", __func__, pkey, rdpkru());