Re: [PATCH v10 03/15] x86/alternatives: Disable LASS when patching kernel alternatives

Borislav Petkov
2025-10-21T20:04:09Z

On Mon, Oct 06, 2025 at 11:51:07PM -0700, Sohil Mehta wrote:
> +static __always_inline void lass_clac(void)
> +{
> + alternative("", "clac", X86_FEATURE_LASS);
> +}
> +
> +static __always_inline void lass_stac(void)
> +{
> + alternative("", "stac", X86_FEATURE_LASS);
> +}

So I probably missed the whole discussion on how we arrived at
lass_{stac,clac}() but just in case, those names sound silly.

IOW, I'd do this ontop:

diff --git a/arch/x86/include/asm/smap.h b/arch/x86/include/asm/smap.h
index 3ecb4b0de1f9..066d83a6b1ff 100644
--- a/arch/x86/include/asm/smap.h
+++ b/arch/x86/include/asm/smap.h
@@ -55,16 +55,8 @@ static __always_inline void stac(void)
* Use lass_stac()/lass_clac() when accessing kernel mappings
* (!_PAGE_USER) in the lower half of the address space.
*/
-
-static __always_inline void lass_clac(void)
-{
- alternative("", "clac", X86_FEATURE_LASS);
-}
-
-static __always_inline void lass_stac(void)
-{
- alternative("", "stac", X86_FEATURE_LASS);
-}
+#define lass_disable() stac()
+#define lass_enable() clac()

static __always_inline unsigned long smap_save(void)
{
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index 6a96dbc60bf1..6cdf5c226c51 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -2487,18 +2487,18 @@ __ro_after_init unsigned long text_poke_mm_addr;

static void text_poke_memcpy(void *dst, const void *src, size_t len)
{
- lass_stac();
+ lass_disable();
__inline_memcpy(dst, src, len);
- lass_clac();
+ lass_enable();
}

static void text_poke_memset(void *dst, const void *src, size_t len)
{
int c = *(const int *)src;

- lass_stac();
+ lass_disable();
__inline_memset(dst, c, len);
- lass_clac();
+ lass_enable();
}

typedef void text_poke_f(void *dst, const void *src, size_t len);

--
Regards/Gruss,
Boris.