]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/cpu: Add an LASS dependency on SMAP
authorSohil Mehta <sohil.mehta@intel.com>
Tue, 18 Nov 2025 18:29:04 +0000 (10:29 -0800)
committerDave Hansen <dave.hansen@linux.intel.com>
Tue, 18 Nov 2025 18:38:26 +0000 (10:38 -0800)
With LASS enabled, any kernel data access to userspace typically results
in a #GP, or a #SS in some stack-related cases. When the kernel needs to
access user memory, it can suspend LASS enforcement by toggling the
RFLAGS.AC bit. Most of these cases are already covered by the
stac()/clac() pairs used to avoid SMAP violations.

Even though LASS could potentially be enabled independently, it would be
very painful without SMAP and the related stac()/clac() calls. There is
no reason to support such a configuration because all future hardware
with LASS is expected to have SMAP as well. Also, the STAC/CLAC
instructions are architected to:
#UD - If CPUID.(EAX=07H, ECX=0H):EBX.SMAP[bit 20] = 0.

So, make LASS depend on SMAP to conveniently reuse the existing AC bit
toggling already in place.

Note: Additional STAC/CLAC would still be needed for accesses such as
text poking which are not flagged by SMAP. This is because such mappings
are in the lower half but do not have the _PAGE_USER bit set which SMAP
uses for enforcement.

Signed-off-by: Sohil Mehta <sohil.mehta@intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com>
Link: https://patch.msgid.link/20251118182911.2983253-3-sohil.mehta%40intel.com
arch/x86/kernel/cpu/cpuid-deps.c

index 46efcbd6afa41ce8201229612fc082a3f3760868..98d0cdd82574798111a8092b6a812547071bb91c 100644 (file)
@@ -89,6 +89,7 @@ static const struct cpuid_dep cpuid_deps[] = {
        { X86_FEATURE_SHSTK,                    X86_FEATURE_XSAVES    },
        { X86_FEATURE_FRED,                     X86_FEATURE_LKGS      },
        { X86_FEATURE_SPEC_CTRL_SSBD,           X86_FEATURE_SPEC_CTRL },
+       { X86_FEATURE_LASS,                     X86_FEATURE_SMAP      },
        {}
 };