166d37570SDave Hansen #ifndef _ASM_X86_PKEYS_H 266d37570SDave Hansen #define _ASM_X86_PKEYS_H 366d37570SDave Hansen 47d06d9c9SDave Hansen #define PKEY_DEDICATED_EXECUTE_ONLY 15 57d06d9c9SDave Hansen /* 67d06d9c9SDave Hansen * Consider the PKEY_DEDICATED_EXECUTE_ONLY key unavailable. 77d06d9c9SDave Hansen */ 87d06d9c9SDave Hansen #define arch_max_pkey() (boot_cpu_has(X86_FEATURE_OSPKE) ? \ 97d06d9c9SDave Hansen PKEY_DEDICATED_EXECUTE_ONLY : 1) 1066d37570SDave Hansen 1184594296SDave Hansen extern int arch_set_user_pkey_access(struct task_struct *tsk, int pkey, 1284594296SDave Hansen unsigned long init_val); 1384594296SDave Hansen 1462b5f7d0SDave Hansen /* 1562b5f7d0SDave Hansen * Try to dedicate one of the protection keys to be used as an 1662b5f7d0SDave Hansen * execute-only protection key. 1762b5f7d0SDave Hansen */ 1862b5f7d0SDave Hansen extern int __execute_only_pkey(struct mm_struct *mm); 1962b5f7d0SDave Hansen static inline int execute_only_pkey(struct mm_struct *mm) 2062b5f7d0SDave Hansen { 2162b5f7d0SDave Hansen if (!boot_cpu_has(X86_FEATURE_OSPKE)) 2262b5f7d0SDave Hansen return 0; 2362b5f7d0SDave Hansen 2462b5f7d0SDave Hansen return __execute_only_pkey(mm); 2562b5f7d0SDave Hansen } 2662b5f7d0SDave Hansen 2762b5f7d0SDave Hansen extern int __arch_override_mprotect_pkey(struct vm_area_struct *vma, 2862b5f7d0SDave Hansen int prot, int pkey); 2962b5f7d0SDave Hansen static inline int arch_override_mprotect_pkey(struct vm_area_struct *vma, 3062b5f7d0SDave Hansen int prot, int pkey) 3162b5f7d0SDave Hansen { 3262b5f7d0SDave Hansen if (!boot_cpu_has(X86_FEATURE_OSPKE)) 3362b5f7d0SDave Hansen return 0; 3462b5f7d0SDave Hansen 3562b5f7d0SDave Hansen return __arch_override_mprotect_pkey(vma, prot, pkey); 3662b5f7d0SDave Hansen } 3762b5f7d0SDave Hansen 387d06d9c9SDave Hansen extern int __arch_set_user_pkey_access(struct task_struct *tsk, int pkey, 397d06d9c9SDave Hansen unsigned long init_val); 407d06d9c9SDave Hansen 4166d37570SDave Hansen #endif /*_ASM_X86_PKEYS_H */ 42