Commit | Line | Data |
---|---|---|
784a4661 DH |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _ASM_X86_PKRU_H | |
3 | #define _ASM_X86_PKRU_H | |
4 | ||
b50854ec | 5 | #include <asm/cpufeature.h> |
784a4661 | 6 | |
57690554 AC |
7 | #define PKRU_AD_BIT 0x1u |
8 | #define PKRU_WD_BIT 0x2u | |
784a4661 DH |
9 | #define PKRU_BITS_PER_PKEY 2 |
10 | ||
11 | #ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS | |
12 | extern u32 init_pkru_value; | |
739e2eec | 13 | #define pkru_get_init_value() READ_ONCE(init_pkru_value) |
784a4661 DH |
14 | #else |
15 | #define init_pkru_value 0 | |
739e2eec | 16 | #define pkru_get_init_value() 0 |
784a4661 DH |
17 | #endif |
18 | ||
19 | static inline bool __pkru_allows_read(u32 pkru, u16 pkey) | |
20 | { | |
21 | int pkru_pkey_bits = pkey * PKRU_BITS_PER_PKEY; | |
22 | return !(pkru & (PKRU_AD_BIT << pkru_pkey_bits)); | |
23 | } | |
24 | ||
25 | static inline bool __pkru_allows_write(u32 pkru, u16 pkey) | |
26 | { | |
27 | int pkru_pkey_bits = pkey * PKRU_BITS_PER_PKEY; | |
28 | /* | |
29 | * Access-disable disables writes too so we need to check | |
30 | * both bits here. | |
31 | */ | |
32 | return !(pkru & ((PKRU_AD_BIT|PKRU_WD_BIT) << pkru_pkey_bits)); | |
33 | } | |
34 | ||
35 | static inline u32 read_pkru(void) | |
36 | { | |
8a1dc55a | 37 | if (cpu_feature_enabled(X86_FEATURE_OSPKE)) |
784a4661 DH |
38 | return rdpkru(); |
39 | return 0; | |
40 | } | |
41 | ||
42 | static inline void write_pkru(u32 pkru) | |
43 | { | |
8a1dc55a | 44 | if (!cpu_feature_enabled(X86_FEATURE_OSPKE)) |
784a4661 | 45 | return; |
784a4661 | 46 | /* |
72a6c08c TG |
47 | * WRPKRU is relatively expensive compared to RDPKRU. |
48 | * Avoid WRPKRU when it would not change the value. | |
784a4661 | 49 | */ |
72a6c08c TG |
50 | if (pkru != rdpkru()) |
51 | wrpkru(pkru); | |
784a4661 DH |
52 | } |
53 | ||
ff7ebff4 TG |
54 | static inline void pkru_write_default(void) |
55 | { | |
56 | if (!cpu_feature_enabled(X86_FEATURE_OSPKE)) | |
57 | return; | |
58 | ||
59 | wrpkru(pkru_get_init_value()); | |
60 | } | |
61 | ||
784a4661 | 62 | #endif |