On Wed, 29 May 2024 at 04:20, Gatlin Newhouse <gatlin.newho...@gmail.com> wrote: [...] > if (regs->flags & X86_EFLAGS_IF) > raw_local_irq_enable(); > - if (report_bug(regs->ip, regs) == BUG_TRAP_TYPE_WARN || > - handle_cfi_failure(regs) == BUG_TRAP_TYPE_WARN) { > - regs->ip += LEN_UD2; > - handled = true; > + > + if (insn == INSN_UD2) { > + if (report_bug(regs->ip, regs) == BUG_TRAP_TYPE_WARN || > + handle_cfi_failure(regs) == BUG_TRAP_TYPE_WARN) { > + regs->ip += LEN_UD2; > + handled = true; > + } > + } else { > + if (handle_ubsan_failure(regs, insn) == BUG_TRAP_TYPE_WARN) {
handle_ubsan_failure currently only returns BUG_TRAP_TYPE_NONE? > + if (insn == INSN_REX) > + regs->ip += LEN_REX; > + regs->ip += LEN_UD1; > + handled = true; > + } > } > if (regs->flags & X86_EFLAGS_IF) > raw_local_irq_disable(); > diff --git a/arch/x86/kernel/ubsan.c b/arch/x86/kernel/ubsan.c > new file mode 100644 > index 000000000000..6cae11f4fe23 > --- /dev/null > +++ b/arch/x86/kernel/ubsan.c > @@ -0,0 +1,32 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Clang Undefined Behavior Sanitizer trap mode support. > + */ > +#include <linux/bug.h> > +#include <linux/string.h> > +#include <linux/printk.h> > +#include <linux/ubsan.h> > +#include <asm/ptrace.h> > +#include <asm/ubsan.h> > + > +/* > + * Checks for the information embedded in the UD1 trap instruction > + * for the UB Sanitizer in order to pass along debugging output. > + */ > +enum bug_trap_type handle_ubsan_failure(struct pt_regs *regs, int insn) > +{ > + u32 type = 0; > + > + if (insn == INSN_REX) { > + type = (*(u16 *)(regs->ip + LEN_REX + LEN_UD1)); > + if ((type & 0xFF) == 0x40) > + type = (type >> 8) & 0xFF; > + } else { > + type = (*(u16 *)(regs->ip + LEN_UD1)); > + if ((type & 0xFF) == 0x40) > + type = (type >> 8) & 0xFF; > + } > + pr_crit("%s at %pS\n", report_ubsan_failure(regs, type), (void > *)regs->ip); > + > + return BUG_TRAP_TYPE_NONE; > +} Shouldn't this return BUG_TRAP_TYPE_WARN?