-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86/pkeys: Move read_pkru() and write_pkru()
write_pkru() was originally used just to write to the PKRU register. It was mercifully short and sweet and was not out of place in pgtable.h with some other pkey-related code. But, later work included a requirement to also modify the task XSAVE buffer when updating the register. This really is more related to the XSAVE architecture than to paging. Move the read/write_pkru() to asm/pkru.h. pgtable.h won't miss them. Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Borislav Petkov <bp@suse.de> Link: https://lkml.kernel.org/r/20210623121455.102647114@linutronix.de
- Loading branch information
Dave Hansen
authored and
Borislav Petkov
committed
Jun 23, 2021
1 parent
a75c528
commit 784a466
Showing
7 changed files
with
67 additions
and
56 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
#ifndef _ASM_X86_PKRU_H | ||
#define _ASM_X86_PKRU_H | ||
|
||
#include <asm/fpu/xstate.h> | ||
|
||
#define PKRU_AD_BIT 0x1 | ||
#define PKRU_WD_BIT 0x2 | ||
#define PKRU_BITS_PER_PKEY 2 | ||
|
||
#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS | ||
extern u32 init_pkru_value; | ||
#else | ||
#define init_pkru_value 0 | ||
#endif | ||
|
||
static inline bool __pkru_allows_read(u32 pkru, u16 pkey) | ||
{ | ||
int pkru_pkey_bits = pkey * PKRU_BITS_PER_PKEY; | ||
return !(pkru & (PKRU_AD_BIT << pkru_pkey_bits)); | ||
} | ||
|
||
static inline bool __pkru_allows_write(u32 pkru, u16 pkey) | ||
{ | ||
int pkru_pkey_bits = pkey * PKRU_BITS_PER_PKEY; | ||
/* | ||
* Access-disable disables writes too so we need to check | ||
* both bits here. | ||
*/ | ||
return !(pkru & ((PKRU_AD_BIT|PKRU_WD_BIT) << pkru_pkey_bits)); | ||
} | ||
|
||
static inline u32 read_pkru(void) | ||
{ | ||
if (boot_cpu_has(X86_FEATURE_OSPKE)) | ||
return rdpkru(); | ||
return 0; | ||
} | ||
|
||
static inline void write_pkru(u32 pkru) | ||
{ | ||
struct pkru_state *pk; | ||
|
||
if (!boot_cpu_has(X86_FEATURE_OSPKE)) | ||
return; | ||
|
||
pk = get_xsave_addr(¤t->thread.fpu.state.xsave, XFEATURE_PKRU); | ||
|
||
/* | ||
* The PKRU value in xstate needs to be in sync with the value that is | ||
* written to the CPU. The FPU restore on return to userland would | ||
* otherwise load the previous value again. | ||
*/ | ||
fpregs_lock(); | ||
if (pk) | ||
pk->pkru = pkru; | ||
__write_pkru(pkru); | ||
fpregs_unlock(); | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters