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