57 lines
1.2 KiB
C
57 lines
1.2 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright (c) 2019 Red Hat, Inc.
|
|
* Copyright (c) Linux Test Project, 2019
|
|
*/
|
|
|
|
#ifndef PKEYS_H
|
|
#define PKEYS_H
|
|
|
|
#include "tst_test.h"
|
|
#include "lapi/syscalls.h"
|
|
#include "lapi/mmap.h"
|
|
|
|
#ifndef PKEY_DISABLE_ACCESS
|
|
# define PKEY_DISABLE_ACCESS 0x1
|
|
# define PKEY_DISABLE_WRITE 0x2
|
|
#endif
|
|
|
|
#ifndef HAVE_PKEY_MPROTECT
|
|
inline int ltp_pkey_mprotect(void *addr, size_t len, int prot, int pkey)
|
|
{
|
|
return tst_syscall(__NR_pkey_mprotect, addr, len, prot, pkey);
|
|
}
|
|
|
|
inline int ltp_pkey_alloc(unsigned int flags, unsigned int access_rights)
|
|
{
|
|
return tst_syscall(__NR_pkey_alloc, flags, access_rights);
|
|
}
|
|
|
|
inline int ltp_pkey_free(int pkey)
|
|
{
|
|
return tst_syscall(__NR_pkey_free, pkey);
|
|
}
|
|
#else
|
|
#define ltp_pkey_alloc pkey_alloc
|
|
#define ltp_pkey_free pkey_free
|
|
#define ltp_pkey_mprotect pkey_mprotect
|
|
#endif /* HAVE_PKEY_MPROTECT */
|
|
|
|
static inline void check_pkey_support(void)
|
|
{
|
|
int pkey = ltp_pkey_alloc(0, 0);
|
|
|
|
if (pkey == -1) {
|
|
if (errno == ENOSYS)
|
|
tst_brk(TCONF, "pkey_alloc is not implemented");
|
|
if (errno == EINVAL)
|
|
tst_brk(TCONF, "pku is not supported on this CPU");
|
|
if (errno == ENOSPC)
|
|
tst_brk(TCONF, "pkeys are not available for test");
|
|
}
|
|
|
|
ltp_pkey_free(pkey);
|
|
}
|
|
|
|
#endif /* PKEYS_H */
|