Message ID | 20230914044805.301390-14-xin3.li@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | x86: enable FRED for x86-64 | expand |
On 14.09.23 г. 7:47 ч., Xin Li wrote: > From: "H. Peter Anvin (Intel)" <hpa@zytor.com> > > Add X86_CR4_FRED macro for the FRED bit in %cr4. This bit must not be > changed after initialization, so add it to the pinned CR4 bits. > > Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com> > Tested-by: Shan Kang <shan.kang@intel.com> > Signed-off-by: Xin Li <xin3.li@intel.com> > --- > > Changes since v9: > * Avoid a type cast by defining X86_CR4_FRED as 0 on 32-bit (Thomas > Gleixner). > --- > arch/x86/include/uapi/asm/processor-flags.h | 7 +++++++ > arch/x86/kernel/cpu/common.c | 5 ++--- > 2 files changed, 9 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/include/uapi/asm/processor-flags.h b/arch/x86/include/uapi/asm/processor-flags.h > index d898432947ff..f1a4adc78272 100644 > --- a/arch/x86/include/uapi/asm/processor-flags.h > +++ b/arch/x86/include/uapi/asm/processor-flags.h > @@ -139,6 +139,13 @@ > #define X86_CR4_LAM_SUP_BIT 28 /* LAM for supervisor pointers */ > #define X86_CR4_LAM_SUP _BITUL(X86_CR4_LAM_SUP_BIT) > > +#ifdef __x86_64__ > +#define X86_CR4_FRED_BIT 32 /* enable FRED kernel entry */ > +#define X86_CR4_FRED _BITUL(X86_CR4_FRED_BIT) nit: s/BITUL/BITULL I guess if __x86_64__ is defined then we are guaranteed that unsigned long will be a 64 bit, but for the sake of clarity I'd rather have this spelled out explicitly by using BITULL > +#else > +#define X86_CR4_FRED (0) > +#endif > + > /* > * x86-64 Task Priority Register, CR8 > */ > diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c > index 317b4877e9c7..42511209469b 100644 > --- a/arch/x86/kernel/cpu/common.c > +++ b/arch/x86/kernel/cpu/common.c > @@ -400,9 +400,8 @@ static __always_inline void setup_umip(struct cpuinfo_x86 *c) > } > > /* These bits should not change their value after CPU init is finished. */ > -static const unsigned long cr4_pinned_mask = > - X86_CR4_SMEP | X86_CR4_SMAP | X86_CR4_UMIP | > - X86_CR4_FSGSBASE | X86_CR4_CET; > +static const unsigned long cr4_pinned_mask = X86_CR4_SMEP | X86_CR4_SMAP | X86_CR4_UMIP | > + X86_CR4_FSGSBASE | X86_CR4_CET | X86_CR4_FRED; > static DEFINE_STATIC_KEY_FALSE_RO(cr_pinning); > static unsigned long cr4_pinned_bits __ro_after_init; >
> > +#ifdef __x86_64__ > > +#define X86_CR4_FRED_BIT 32 /* enable FRED kernel entry */ > > +#define X86_CR4_FRED _BITUL(X86_CR4_FRED_BIT) > > nit: s/BITUL/BITULL I guess if __x86_64__ is defined then we are > guaranteed that unsigned long will be a 64 bit, but for the sake of > clarity I'd rather have this spelled out explicitly by using BITULL > UL is better because CR4 is a machine word. > > > > +#else > > +#define X86_CR4_FRED (0) > > +#endif
diff --git a/arch/x86/include/uapi/asm/processor-flags.h b/arch/x86/include/uapi/asm/processor-flags.h index d898432947ff..f1a4adc78272 100644 --- a/arch/x86/include/uapi/asm/processor-flags.h +++ b/arch/x86/include/uapi/asm/processor-flags.h @@ -139,6 +139,13 @@ #define X86_CR4_LAM_SUP_BIT 28 /* LAM for supervisor pointers */ #define X86_CR4_LAM_SUP _BITUL(X86_CR4_LAM_SUP_BIT) +#ifdef __x86_64__ +#define X86_CR4_FRED_BIT 32 /* enable FRED kernel entry */ +#define X86_CR4_FRED _BITUL(X86_CR4_FRED_BIT) +#else +#define X86_CR4_FRED (0) +#endif + /* * x86-64 Task Priority Register, CR8 */ diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 317b4877e9c7..42511209469b 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -400,9 +400,8 @@ static __always_inline void setup_umip(struct cpuinfo_x86 *c) } /* These bits should not change their value after CPU init is finished. */ -static const unsigned long cr4_pinned_mask = - X86_CR4_SMEP | X86_CR4_SMAP | X86_CR4_UMIP | - X86_CR4_FSGSBASE | X86_CR4_CET; +static const unsigned long cr4_pinned_mask = X86_CR4_SMEP | X86_CR4_SMAP | X86_CR4_UMIP | + X86_CR4_FSGSBASE | X86_CR4_CET | X86_CR4_FRED; static DEFINE_STATIC_KEY_FALSE_RO(cr_pinning); static unsigned long cr4_pinned_bits __ro_after_init;