On 2025-09-08 at 14:54:32 +0200, Maciej Wieczor-Retman wrote: >On 2025-09-08 at 12:38:57 +0200, Maciej Wieczor-Retman wrote: >>On 2025-09-06 at 19:19:01 +0200, Andrey Konovalov wrote: >>>On Mon, Aug 25, 2025 at 10:30 PM Maciej Wieczor-Retman >>>> diff --git a/arch/x86/mm/kasan_inline.c b/arch/x86/mm/kasan_inline.c >>>> new file mode 100644 >>>> index 000000000000..9f85dfd1c38b >>>> --- /dev/null >>>> +++ b/arch/x86/mm/kasan_inline.c >>>> @@ -0,0 +1,23 @@ >>>> +// SPDX-License-Identifier: GPL-2.0 >>>> +#include <linux/kasan.h> >>>> +#include <linux/kdebug.h> >>>> + >>>> +bool kasan_inline_handler(struct pt_regs *regs) >>>> +{ >>>> + int metadata = regs->ax; >>>> + u64 addr = regs->di; >>>> + u64 pc = regs->ip; >>>> + bool recover = metadata & KASAN_RAX_RECOVER; >>>> + bool write = metadata & KASAN_RAX_WRITE; >>>> + size_t size = KASAN_RAX_SIZE(metadata); >>>> + >>>> + if (user_mode(regs)) >>>> + return false; >>>> + >>>> + if (!kasan_report((void *)addr, size, write, pc)) >>>> + return false; >>> >>>Hm, this part is different than on arm64: there, we don't check the >>>return value. >>> >>>Do I understand correctly that the return value from this function >>>controls whether we skip over the int3 instruction and continue the >>>execution? If so, we should return the same value regardless of >>>whether the report is suppressed or not. And then you should not need >>>to explicitly check for KASAN_BIT_MULTI_SHOT in the latter patch. >> >>I recall there were some corner cases where this code path got called in outline >>mode, didn't have a mismatch but still died due to the die() below. But I'll >>recheck and either apply what you wrote above or get add a better explanation >>to the patch message. > >Okay, so the int3_selftest_ip() is causing a problem in outline mode. > >I tried disabling kasan with kasan_disable_current() but thinking of it now it >won't work because int3 handler will still be called and die() will happen. Sorry, I meant to write that kasan_disable_current() works together with if(!kasan_report()). Because without checking kasan_report()' return value, if kasan is disabled through kasan_disable_current() it will have no effect in both inline mode, and if int3 is called in outline mode - the kasan_inline_handler will lead to die(). > >What did you mean by "return the same value regardless of kasan_report()"? Then >it will never reach the kasan_inline_recover() which I assume is needed for >inline mode (once recover will work). > >-- >Kind regards >Maciej Wieczór-Retman -- Kind regards Maciej Wieczór-Retman