android13/external/ltp/testcases/kernel/syscalls/pkeys/pkey.h

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 */