On 7/7/2025 1:03 AM, Kirill A. Shutemov wrote: > From: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx> > > Provide a more helpful message on #GP when a kernel side LASS violation > is detected. > > A NULL pointer dereference is reported if a LASS violation occurs due to > accessing the first page frame. > > Signed-off-by: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx> > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > --- > arch/x86/kernel/traps.c | 41 +++++++++++++++++++++++++++++------------ > 1 file changed, 29 insertions(+), 12 deletions(-) > Reviewed-by: Sohil Mehta <sohil.mehta@xxxxxxxxx> A nit below. > diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c > index 59bfbdf0a1a0..4a4194e1d119 100644 > --- a/arch/x86/kernel/traps.c > +++ b/arch/x86/kernel/traps.c > @@ -636,7 +636,16 @@ DEFINE_IDTENTRY(exc_bounds) > enum kernel_gp_hint { > GP_NO_HINT, > GP_NON_CANONICAL, > - GP_CANONICAL > + GP_CANONICAL, > + GP_LASS_VIOLATION, > + GP_NULL_POINTER, > +}; > + > +static const char * const kernel_gp_hint_help[] = { > + [GP_NON_CANONICAL] = "probably for non-canonical address", > + [GP_CANONICAL] = "maybe for address", > + [GP_LASS_VIOLATION] = "LASS prevented access to address", > + [GP_NULL_POINTER] = "kernel NULL pointer dereference", > }; > > /* > @@ -664,14 +673,23 @@ static enum kernel_gp_hint get_kernel_gp_address(struct pt_regs *regs, > return GP_NO_HINT; > > #ifdef CONFIG_X86_64 Might as well get rid of the #ifdef in C code, if possible. if (!IS_ENABLED(CONFIG_X86_64) return GP_CANONICAL; or combine it with the next check. > - /* > - * Check that: > - * - the operand is not in the kernel half > - * - the last byte of the operand is not in the user canonical half > - */ > - if (*addr < ~__VIRTUAL_MASK && > - *addr + insn.opnd_bytes - 1 > __VIRTUAL_MASK) > + /* Operand is in the kernel half */ > + if (*addr >= ~__VIRTUAL_MASK) > + return GP_CANONICAL; > + > + /* The last byte of the operand is not in the user canonical half */ > + if (*addr + insn.opnd_bytes - 1 > __VIRTUAL_MASK) > return GP_NON_CANONICAL; > + > + /* > + * If LASS is enabled, NULL pointer dereference generates > + * #GP instead of #PF. > + */ > + if (*addr < PAGE_SIZE) > + return GP_NULL_POINTER; > + > + if (cpu_feature_enabled(X86_FEATURE_LASS)) > + return GP_LASS_VIOLATION; > #endif > > return GP_CANONICAL;