Make CONFIG_KASAN_SW_TAGS available for x86 machines if they have
ADDRESS_MASKING enabled (LAM) as that works similarly to Top-Byte Ignore
(TBI) that allows the software tag-based mode on arm64 platform.
Set scale macro based on KASAN mode: in software tag-based mode 16 bytes
of memory map to one shadow byte and 8 in generic mode.
Disable CONFIG_KASAN_INLINE and CONFIG_KASAN_STACK when
CONFIG_KASAN_SW_TAGS is enabled on x86 until the appropriate compiler
support is available.
Signed-off-by: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>
---
Changelog v4:
- Add x86 specific kasan_mem_to_shadow().
- Revert x86 to the older unsigned KASAN_SHADOW_OFFSET. Do the same to
KASAN_SHADOW_START/END.
- Modify scripts/gdb/linux/kasan.py to keep x86 using unsigned offset.
- Disable inline and stack support when software tags are enabled on
x86.
Changelog v3:
- Remove runtime_const from previous patch and merge the rest here.
- Move scale shift definition back to header file.
- Add new kasan offset for software tag based mode.
- Fix patch message typo 32 -> 16, and 16 -> 8.
- Update lib/Kconfig.kasan with x86 now having software tag-based
support.
Changelog v2:
- Remove KASAN dense code.
Documentation/arch/x86/x86_64/mm.rst | 6 ++++--
arch/x86/Kconfig | 4 +++-
arch/x86/boot/compressed/misc.h | 1 +
arch/x86/include/asm/kasan.h | 1 +
arch/x86/kernel/setup.c | 2 ++
lib/Kconfig.kasan | 3 ++-
scripts/gdb/linux/kasan.py | 4 ++--
7 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/Documentation/arch/x86/x86_64/mm.rst b/Documentation/arch/x86/x86_64/mm.rst
index a6cf05d51bd8..ccbdbb4cda36 100644
--- a/Documentation/arch/x86/x86_64/mm.rst
+++ b/Documentation/arch/x86/x86_64/mm.rst
@@ -60,7 +60,8 @@ Complete virtual memory map with 4-level page tables
ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole
ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base)
ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole
- ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory
+ ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory (generic mode)
+ fffff40000000000 | -8 TB | fffffbffffffffff | 8 TB | KASAN shadow memory (software tag-based mode)
__________________|____________|__________________|_________|____________________________________________________________
|
| Identical layout to the 56-bit one from here on:
@@ -130,7 +131,8 @@ Complete virtual memory map with 5-level page tables
ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole
ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base)
ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole
- ffdf000000000000 | -8.25 PB | fffffbffffffffff | ~8 PB | KASAN shadow memory
+ ffdf000000000000 | -8.25 PB | fffffbffffffffff | ~8 PB | KASAN shadow memory (generic mode)
+ ffeffc0000000000 | -6 PB | fffffbffffffffff | 4 PB | KASAN shadow memory (software tag-based mode)
__________________|____________|__________________|_________|____________________________________________________________
|
| Identical layout to the 47-bit one from here on:
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index b8df57ac0f28..f44fec1190b6 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -69,6 +69,7 @@ config X86
select ARCH_CLOCKSOURCE_INIT
select ARCH_CONFIGURES_CPU_MITIGATIONS
select ARCH_CORRECT_STACKTRACE_ON_KRETPROBE
+ select ARCH_DISABLE_KASAN_INLINE if X86_64 && KASAN_SW_TAGS
select ARCH_ENABLE_HUGEPAGE_MIGRATION if X86_64 && HUGETLB_PAGE && MIGRATION
select ARCH_ENABLE_MEMORY_HOTPLUG if X86_64
select ARCH_ENABLE_MEMORY_HOTREMOVE if MEMORY_HOTPLUG
@@ -199,6 +200,7 @@ config X86
select HAVE_ARCH_JUMP_LABEL_RELATIVE
select HAVE_ARCH_KASAN if X86_64
select HAVE_ARCH_KASAN_VMALLOC if X86_64
+ select HAVE_ARCH_KASAN_SW_TAGS if ADDRESS_MASKING
select HAVE_ARCH_KFENCE
select HAVE_ARCH_KMSAN if X86_64
select HAVE_ARCH_KGDB
@@ -403,7 +405,7 @@ config AUDIT_ARCH
config KASAN_SHADOW_OFFSET
hex
- depends on KASAN
+ default 0xeffffc0000000000 if KASAN_SW_TAGS
default 0xdffffc0000000000
config HAVE_INTEL_TXT
diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h
index db1048621ea2..ded92b439ada 100644
--- a/arch/x86/boot/compressed/misc.h
+++ b/arch/x86/boot/compressed/misc.h
@@ -13,6 +13,7 @@
#undef CONFIG_PARAVIRT_SPINLOCKS
#undef CONFIG_KASAN
#undef CONFIG_KASAN_GENERIC
+#undef CONFIG_KASAN_SW_TAGS
#define __NO_FORTIFY
diff --git a/arch/x86/include/asm/kasan.h b/arch/x86/include/asm/kasan.h
index f3e34a9754d2..385f4e9daab3 100644
--- a/arch/x86/include/asm/kasan.h
+++ b/arch/x86/include/asm/kasan.h
@@ -7,6 +7,7 @@
#include <linux/types.h>
#define KASAN_SHADOW_OFFSET _AC(CONFIG_KASAN_SHADOW_OFFSET, UL)
#ifdef CONFIG_KASAN_SW_TAGS
+#define KASAN_SHADOW_SCALE_SHIFT 4
/*
* LLVM ABI for reporting tag mismatches in inline KASAN mode.
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 1b2edd07a3e1..5b819f84f6db 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -1207,6 +1207,8 @@ void __init setup_arch(char **cmdline_p)
kasan_init();
+ kasan_init_sw_tags();
+
/*
* Sync back kernel address range.
*
diff --git a/lib/Kconfig.kasan b/lib/Kconfig.kasan
index f82889a830fa..9ddbc6aeb5d5 100644
--- a/lib/Kconfig.kasan
+++ b/lib/Kconfig.kasan
@@ -100,7 +100,8 @@ config KASAN_SW_TAGS
Requires GCC 11+ or Clang.
- Supported only on arm64 CPUs and relies on Top Byte Ignore.
+ Supported on arm64 CPUs that support Top Byte Ignore and on x86 CPUs
+ that support Linear Address Masking.
Consumes about 1/16th of available memory at kernel start and
add an overhead of ~20% for dynamic allocations.
diff --git a/scripts/gdb/linux/kasan.py b/scripts/gdb/linux/kasan.py
index fca39968d308..4b86202b155f 100644
--- a/scripts/gdb/linux/kasan.py
+++ b/scripts/gdb/linux/kasan.py
@@ -7,7 +7,7 @@
#
import gdb
-from linux import constants, mm
+from linux import constants, utils, mm
from ctypes import c_int64 as s64
def help():
@@ -40,7 +40,7 @@ class KasanMemToShadow(gdb.Command):
else:
help()
def kasan_mem_to_shadow(self, addr):
- if constants.CONFIG_KASAN_SW_TAGS:
+ if constants.CONFIG_KASAN_SW_TAGS and not utils.is_target_arch('x86'):
addr = s64(addr)
return (addr >> self.p_ops.KASAN_SHADOW_SCALE_SHIFT) + self.p_ops.KASAN_SHADOW_OFFSET
--
2.50.1
On Mon, Aug 25, 2025 at 10:32 PM Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com> wrote: > > Make CONFIG_KASAN_SW_TAGS available for x86 machines if they have > ADDRESS_MASKING enabled (LAM) as that works similarly to Top-Byte Ignore > (TBI) that allows the software tag-based mode on arm64 platform. > > Set scale macro based on KASAN mode: in software tag-based mode 16 bytes > of memory map to one shadow byte and 8 in generic mode. > > Disable CONFIG_KASAN_INLINE and CONFIG_KASAN_STACK when > CONFIG_KASAN_SW_TAGS is enabled on x86 until the appropriate compiler > support is available. > > Signed-off-by: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com> > --- > Changelog v4: > - Add x86 specific kasan_mem_to_shadow(). > - Revert x86 to the older unsigned KASAN_SHADOW_OFFSET. Do the same to > KASAN_SHADOW_START/END. > - Modify scripts/gdb/linux/kasan.py to keep x86 using unsigned offset. > - Disable inline and stack support when software tags are enabled on > x86. > > Changelog v3: > - Remove runtime_const from previous patch and merge the rest here. > - Move scale shift definition back to header file. > - Add new kasan offset for software tag based mode. > - Fix patch message typo 32 -> 16, and 16 -> 8. > - Update lib/Kconfig.kasan with x86 now having software tag-based > support. > > Changelog v2: > - Remove KASAN dense code. > > Documentation/arch/x86/x86_64/mm.rst | 6 ++++-- > arch/x86/Kconfig | 4 +++- > arch/x86/boot/compressed/misc.h | 1 + > arch/x86/include/asm/kasan.h | 1 + > arch/x86/kernel/setup.c | 2 ++ > lib/Kconfig.kasan | 3 ++- > scripts/gdb/linux/kasan.py | 4 ++-- > 7 files changed, 15 insertions(+), 6 deletions(-) > > diff --git a/Documentation/arch/x86/x86_64/mm.rst b/Documentation/arch/x86/x86_64/mm.rst > index a6cf05d51bd8..ccbdbb4cda36 100644 > --- a/Documentation/arch/x86/x86_64/mm.rst > +++ b/Documentation/arch/x86/x86_64/mm.rst > @@ -60,7 +60,8 @@ Complete virtual memory map with 4-level page tables > ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole > ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base) > ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole > - ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory > + ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory (generic mode) > + fffff40000000000 | -8 TB | fffffbffffffffff | 8 TB | KASAN shadow memory (software tag-based mode) > __________________|____________|__________________|_________|____________________________________________________________ > | > | Identical layout to the 56-bit one from here on: > @@ -130,7 +131,8 @@ Complete virtual memory map with 5-level page tables > ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole > ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base) > ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole > - ffdf000000000000 | -8.25 PB | fffffbffffffffff | ~8 PB | KASAN shadow memory > + ffdf000000000000 | -8.25 PB | fffffbffffffffff | ~8 PB | KASAN shadow memory (generic mode) > + ffeffc0000000000 | -6 PB | fffffbffffffffff | 4 PB | KASAN shadow memory (software tag-based mode) > __________________|____________|__________________|_________|____________________________________________________________ > | > | Identical layout to the 47-bit one from here on: > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > index b8df57ac0f28..f44fec1190b6 100644 > --- a/arch/x86/Kconfig > +++ b/arch/x86/Kconfig > @@ -69,6 +69,7 @@ config X86 > select ARCH_CLOCKSOURCE_INIT > select ARCH_CONFIGURES_CPU_MITIGATIONS > select ARCH_CORRECT_STACKTRACE_ON_KRETPROBE > + select ARCH_DISABLE_KASAN_INLINE if X86_64 && KASAN_SW_TAGS Do you think it would make sense to drop the parts of the series that add int3 handling, since the inline instrumentation does not work yet anyway? > select ARCH_ENABLE_HUGEPAGE_MIGRATION if X86_64 && HUGETLB_PAGE && MIGRATION > select ARCH_ENABLE_MEMORY_HOTPLUG if X86_64 > select ARCH_ENABLE_MEMORY_HOTREMOVE if MEMORY_HOTPLUG > @@ -199,6 +200,7 @@ config X86 > select HAVE_ARCH_JUMP_LABEL_RELATIVE > select HAVE_ARCH_KASAN if X86_64 > select HAVE_ARCH_KASAN_VMALLOC if X86_64 > + select HAVE_ARCH_KASAN_SW_TAGS if ADDRESS_MASKING > select HAVE_ARCH_KFENCE > select HAVE_ARCH_KMSAN if X86_64 > select HAVE_ARCH_KGDB > @@ -403,7 +405,7 @@ config AUDIT_ARCH > > config KASAN_SHADOW_OFFSET > hex > - depends on KASAN Line accidentally removed? > + default 0xeffffc0000000000 if KASAN_SW_TAGS > default 0xdffffc0000000000 > > config HAVE_INTEL_TXT > diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h > index db1048621ea2..ded92b439ada 100644 > --- a/arch/x86/boot/compressed/misc.h > +++ b/arch/x86/boot/compressed/misc.h > @@ -13,6 +13,7 @@ > #undef CONFIG_PARAVIRT_SPINLOCKS > #undef CONFIG_KASAN > #undef CONFIG_KASAN_GENERIC > +#undef CONFIG_KASAN_SW_TAGS > > #define __NO_FORTIFY > > diff --git a/arch/x86/include/asm/kasan.h b/arch/x86/include/asm/kasan.h > index f3e34a9754d2..385f4e9daab3 100644 > --- a/arch/x86/include/asm/kasan.h > +++ b/arch/x86/include/asm/kasan.h > @@ -7,6 +7,7 @@ > #include <linux/types.h> > #define KASAN_SHADOW_OFFSET _AC(CONFIG_KASAN_SHADOW_OFFSET, UL) > #ifdef CONFIG_KASAN_SW_TAGS > +#define KASAN_SHADOW_SCALE_SHIFT 4 > > /* > * LLVM ABI for reporting tag mismatches in inline KASAN mode. > diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c > index 1b2edd07a3e1..5b819f84f6db 100644 > --- a/arch/x86/kernel/setup.c > +++ b/arch/x86/kernel/setup.c > @@ -1207,6 +1207,8 @@ void __init setup_arch(char **cmdline_p) > > kasan_init(); > > + kasan_init_sw_tags(); > + > /* > * Sync back kernel address range. > * > diff --git a/lib/Kconfig.kasan b/lib/Kconfig.kasan > index f82889a830fa..9ddbc6aeb5d5 100644 > --- a/lib/Kconfig.kasan > +++ b/lib/Kconfig.kasan > @@ -100,7 +100,8 @@ config KASAN_SW_TAGS > > Requires GCC 11+ or Clang. > > - Supported only on arm64 CPUs and relies on Top Byte Ignore. > + Supported on arm64 CPUs that support Top Byte Ignore and on x86 CPUs > + that support Linear Address Masking. > > Consumes about 1/16th of available memory at kernel start and > add an overhead of ~20% for dynamic allocations. > diff --git a/scripts/gdb/linux/kasan.py b/scripts/gdb/linux/kasan.py > index fca39968d308..4b86202b155f 100644 > --- a/scripts/gdb/linux/kasan.py > +++ b/scripts/gdb/linux/kasan.py > @@ -7,7 +7,7 @@ > # > > import gdb > -from linux import constants, mm > +from linux import constants, utils, mm > from ctypes import c_int64 as s64 > > def help(): > @@ -40,7 +40,7 @@ class KasanMemToShadow(gdb.Command): > else: > help() > def kasan_mem_to_shadow(self, addr): > - if constants.CONFIG_KASAN_SW_TAGS: > + if constants.CONFIG_KASAN_SW_TAGS and not utils.is_target_arch('x86'): This change seems to belong to the patch that changes how the shadow memory address is calculated. > addr = s64(addr) > return (addr >> self.p_ops.KASAN_SHADOW_SCALE_SHIFT) + self.p_ops.KASAN_SHADOW_OFFSET > > -- > 2.50.1 >
On 2025-09-06 at 19:19:33 +0200, Andrey Konovalov wrote: >On Mon, Aug 25, 2025 at 10:32 PM Maciej Wieczor-Retman ><maciej.wieczor-retman@intel.com> wrote: >> >> Make CONFIG_KASAN_SW_TAGS available for x86 machines if they have >> ADDRESS_MASKING enabled (LAM) as that works similarly to Top-Byte Ignore >> (TBI) that allows the software tag-based mode on arm64 platform. >> >> Set scale macro based on KASAN mode: in software tag-based mode 16 bytes >> of memory map to one shadow byte and 8 in generic mode. >> >> Disable CONFIG_KASAN_INLINE and CONFIG_KASAN_STACK when >> CONFIG_KASAN_SW_TAGS is enabled on x86 until the appropriate compiler >> support is available. >> >> Signed-off-by: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com> >> --- >> Changelog v4: >> - Add x86 specific kasan_mem_to_shadow(). >> - Revert x86 to the older unsigned KASAN_SHADOW_OFFSET. Do the same to >> KASAN_SHADOW_START/END. >> - Modify scripts/gdb/linux/kasan.py to keep x86 using unsigned offset. >> - Disable inline and stack support when software tags are enabled on >> x86. >> >> Changelog v3: >> - Remove runtime_const from previous patch and merge the rest here. >> - Move scale shift definition back to header file. >> - Add new kasan offset for software tag based mode. >> - Fix patch message typo 32 -> 16, and 16 -> 8. >> - Update lib/Kconfig.kasan with x86 now having software tag-based >> support. >> >> Changelog v2: >> - Remove KASAN dense code. >> >> Documentation/arch/x86/x86_64/mm.rst | 6 ++++-- >> arch/x86/Kconfig | 4 +++- >> arch/x86/boot/compressed/misc.h | 1 + >> arch/x86/include/asm/kasan.h | 1 + >> arch/x86/kernel/setup.c | 2 ++ >> lib/Kconfig.kasan | 3 ++- >> scripts/gdb/linux/kasan.py | 4 ++-- >> 7 files changed, 15 insertions(+), 6 deletions(-) >> >> diff --git a/Documentation/arch/x86/x86_64/mm.rst b/Documentation/arch/x86/x86_64/mm.rst >> index a6cf05d51bd8..ccbdbb4cda36 100644 >> --- a/Documentation/arch/x86/x86_64/mm.rst >> +++ b/Documentation/arch/x86/x86_64/mm.rst >> @@ -60,7 +60,8 @@ Complete virtual memory map with 4-level page tables >> ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole >> ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base) >> ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole >> - ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory >> + ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory (generic mode) >> + fffff40000000000 | -8 TB | fffffbffffffffff | 8 TB | KASAN shadow memory (software tag-based mode) >> __________________|____________|__________________|_________|____________________________________________________________ >> | >> | Identical layout to the 56-bit one from here on: >> @@ -130,7 +131,8 @@ Complete virtual memory map with 5-level page tables >> ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole >> ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base) >> ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole >> - ffdf000000000000 | -8.25 PB | fffffbffffffffff | ~8 PB | KASAN shadow memory >> + ffdf000000000000 | -8.25 PB | fffffbffffffffff | ~8 PB | KASAN shadow memory (generic mode) >> + ffeffc0000000000 | -6 PB | fffffbffffffffff | 4 PB | KASAN shadow memory (software tag-based mode) >> __________________|____________|__________________|_________|____________________________________________________________ >> | >> | Identical layout to the 47-bit one from here on: >> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig >> index b8df57ac0f28..f44fec1190b6 100644 >> --- a/arch/x86/Kconfig >> +++ b/arch/x86/Kconfig >> @@ -69,6 +69,7 @@ config X86 >> select ARCH_CLOCKSOURCE_INIT >> select ARCH_CONFIGURES_CPU_MITIGATIONS >> select ARCH_CORRECT_STACKTRACE_ON_KRETPROBE >> + select ARCH_DISABLE_KASAN_INLINE if X86_64 && KASAN_SW_TAGS > >Do you think it would make sense to drop the parts of the series that >add int3 handling, since the inline instrumentation does not work yet >anyway? I thought we might as well put it into the kernel, so once the compiler side gets upstreamed only the Kconfig needs to be modified. But both options are okay, I thought itd be easy to argument changes to LLVM if this inline mode is already prepared in the kernel. > >> select ARCH_ENABLE_HUGEPAGE_MIGRATION if X86_64 && HUGETLB_PAGE && MIGRATION >> select ARCH_ENABLE_MEMORY_HOTPLUG if X86_64 >> select ARCH_ENABLE_MEMORY_HOTREMOVE if MEMORY_HOTPLUG >> @@ -199,6 +200,7 @@ config X86 >> select HAVE_ARCH_JUMP_LABEL_RELATIVE >> select HAVE_ARCH_KASAN if X86_64 >> select HAVE_ARCH_KASAN_VMALLOC if X86_64 >> + select HAVE_ARCH_KASAN_SW_TAGS if ADDRESS_MASKING >> select HAVE_ARCH_KFENCE >> select HAVE_ARCH_KMSAN if X86_64 >> select HAVE_ARCH_KGDB >> @@ -403,7 +405,7 @@ config AUDIT_ARCH >> >> config KASAN_SHADOW_OFFSET >> hex >> - depends on KASAN > >Line accidentally removed? Yes, sorry, I'll put it back in. > >> + default 0xeffffc0000000000 if KASAN_SW_TAGS >> default 0xdffffc0000000000 >> >> config HAVE_INTEL_TXT >> diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h >> index db1048621ea2..ded92b439ada 100644 >> --- a/arch/x86/boot/compressed/misc.h >> +++ b/arch/x86/boot/compressed/misc.h >> @@ -13,6 +13,7 @@ >> #undef CONFIG_PARAVIRT_SPINLOCKS >> #undef CONFIG_KASAN >> #undef CONFIG_KASAN_GENERIC >> +#undef CONFIG_KASAN_SW_TAGS >> >> #define __NO_FORTIFY >> >> diff --git a/arch/x86/include/asm/kasan.h b/arch/x86/include/asm/kasan.h >> index f3e34a9754d2..385f4e9daab3 100644 >> --- a/arch/x86/include/asm/kasan.h >> +++ b/arch/x86/include/asm/kasan.h >> @@ -7,6 +7,7 @@ >> #include <linux/types.h> >> #define KASAN_SHADOW_OFFSET _AC(CONFIG_KASAN_SHADOW_OFFSET, UL) >> #ifdef CONFIG_KASAN_SW_TAGS >> +#define KASAN_SHADOW_SCALE_SHIFT 4 >> >> /* >> * LLVM ABI for reporting tag mismatches in inline KASAN mode. >> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c >> index 1b2edd07a3e1..5b819f84f6db 100644 >> --- a/arch/x86/kernel/setup.c >> +++ b/arch/x86/kernel/setup.c >> @@ -1207,6 +1207,8 @@ void __init setup_arch(char **cmdline_p) >> >> kasan_init(); >> >> + kasan_init_sw_tags(); >> + >> /* >> * Sync back kernel address range. >> * >> diff --git a/lib/Kconfig.kasan b/lib/Kconfig.kasan >> index f82889a830fa..9ddbc6aeb5d5 100644 >> --- a/lib/Kconfig.kasan >> +++ b/lib/Kconfig.kasan >> @@ -100,7 +100,8 @@ config KASAN_SW_TAGS >> >> Requires GCC 11+ or Clang. >> >> - Supported only on arm64 CPUs and relies on Top Byte Ignore. >> + Supported on arm64 CPUs that support Top Byte Ignore and on x86 CPUs >> + that support Linear Address Masking. >> >> Consumes about 1/16th of available memory at kernel start and >> add an overhead of ~20% for dynamic allocations. >> diff --git a/scripts/gdb/linux/kasan.py b/scripts/gdb/linux/kasan.py >> index fca39968d308..4b86202b155f 100644 >> --- a/scripts/gdb/linux/kasan.py >> +++ b/scripts/gdb/linux/kasan.py >> @@ -7,7 +7,7 @@ >> # >> >> import gdb >> -from linux import constants, mm >> +from linux import constants, utils, mm >> from ctypes import c_int64 as s64 >> >> def help(): >> @@ -40,7 +40,7 @@ class KasanMemToShadow(gdb.Command): >> else: >> help() >> def kasan_mem_to_shadow(self, addr): >> - if constants.CONFIG_KASAN_SW_TAGS: >> + if constants.CONFIG_KASAN_SW_TAGS and not utils.is_target_arch('x86'): > >This change seems to belong to the patch that changes how the shadow >memory address is calculated. Okay, I can move it there. > >> addr = s64(addr) >> return (addr >> self.p_ops.KASAN_SHADOW_SCALE_SHIFT) + self.p_ops.KASAN_SHADOW_OFFSET >> >> -- >> 2.50.1 >> -- Kind regards Maciej Wieczór-Retman
© 2016 - 2025 Red Hat, Inc.