[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250607100845.GC39944@noisy.programming.kicks-ass.net>
Date: Sat, 7 Jun 2025 12:08:45 +0200
From: Peter Zijlstra <peterz@...radead.org>
To: x86@...nel.org
Cc: linux-kernel@...r.kernel.org, kees@...nel.org, acarmina@...hat.com,
jpoimboe@...nel.org, mark.rutland@....com,
torvalds@...uxfoundation.org
Subject: Re: [PATCH 08/11] x86_64/bug: Implement __WARN_printf()
On Sat, Jun 07, 2025 at 11:42:32AM +0200, Peter Zijlstra wrote:
> @@ -156,10 +166,21 @@ __always_inline int decode_bug(unsigned
> if (X86_MODRM_MOD(v) != 3 && X86_MODRM_RM(v) == 4)
> addr++; /* SIB */
>
> + reg = X86_MODRM_REG(v) + 8*!!X86_REX_R(rex);
> + rm = X86_MODRM_RM(v) + 8*!!X86_REX_B(rex);
> +
> /* Decode immediate, if present */
> switch (X86_MODRM_MOD(v)) {
> case 0: if (X86_MODRM_RM(v) == 5)
> - addr += 4; /* RIP + disp32 */
> + addr += 4; /* RIP + disp32 */
> +
> + if (rm == 0) /* (%eax) */
> + type = BUG_UD1_UBSAN;
> +
> + if (rm == 1) { /* (%ecx) */
> + *imm = reg;
> + type = BUG_UD1_WARN;
> + }
> break;
>
> case 1: *imm = *(s8 *)addr;
> @@ -176,12 +197,73 @@ __always_inline int decode_bug(unsigned
> /* record instruction length */
> *len = addr - start;
>
> - if (X86_MODRM_REG(v) == 0) /* EAX */
> - return BUG_UD1_UBSAN;
> + return type;
> +}
Oh, this breaks the UBSAN case, it must also set UD1_UBSAN for mod 1 and
2. I'll fix.
Powered by blists - more mailing lists