From: Alexandre Chartre <alexandre.chartre@oracle.com>
To: Josh Poimboeuf <jpoimboe@kernel.org>
Cc: alexandre.chartre@oracle.com, linux-kernel@vger.kernel.org,
mingo@kernel.org, peterz@infradead.org
Subject: Re: [PATCH v4 00/28] objtool: Function validation tracing
Date: Fri, 14 Nov 2025 10:56:48 +0100 [thread overview]
Message-ID: <3367da83-16b7-4c6a-bd08-d14ec4067025@oracle.com> (raw)
In-Reply-To: <xubzrvmfmhbrjagnhych53hmdaadeloybw55naqiokmxfkfvp5@gi6olgvnei4u>
On 11/14/25 02:48, Josh Poimboeuf wrote:
> On Thu, Nov 13, 2025 at 05:48:49PM +0100, Alexandre Chartre wrote:
>> Changes:
>> ========
>>
>> V4:
>> ---
>> This version fixes a build issue when disassembly is not available. Compared
>> with V3, this is addresses by changes in patch 14 (objtool: Improve tracing
>> of alternative instructions). Other patches are similar to V3.
>
> For the next revision, please base on tip/master, as there are some
> major objtool changes pending for the next merge window.
Ok, I will rebase the next revision on tip/master.
> Most of my comments below are bikeshedding, they are not required for
> the next revision and can be addressed in followup patch sets if you'd
> rather do it that way.
If changes are simple, I will try to address them immediately otherwise
defer to next patches.
>> - Each alternative of a group alternative is displayed with its feature
>> name and flags: <flags><feature-name>
>>
>> <flags> is made of the following characters:
>>
>> '!' : ALT_FLAG_NOT
>> '+' : ALT_FLAG_DIRECT_CALL
>> '?' : unknown flag (i.e. any other flags)
>
> Other than '!', the meaning of the flags isn't intuitive. Maybe it
> should just show the source code names:
>
> ALT_NOT(X86_FEATURE_FOO)
>
> ALT_DIRECT_CALL(X86_FEATURE_BAR)
>
> ALT_UNKNOWN_FLAG(X86_FEATURE_BAZ)
>
I think '?' is meaningful too, but I wasn't sure about '+'.
I am using single characters to keep the alternative name short. It can already
be fairly long because of the feature name (like "X86_FEATURE_SPEC_STORE_BYPASS_DISABLE")
Also I am assuming that flags can be combined (although that's not currently
the case) so that would be more difficult with full ALT_* names and the
result would be much longer.
>> - If an alternative is a jump table then "JUMP" is used as the feature
>> name.
>
> Hm, it's a bit confusing to label a jump label as an "alternative" as
> those are two distinct things (though I'm aware that objtool conflates
> the two).
>
>> - If an alternative is an exception table then "EXCEPTION" is used as the
>> feature name.
>
> Ditto.
>
Yes, the wording is not good, I use it just because objtool handles jump
labels and exception tables as alternative. I will reword to something
better.
>> Disassembly can show default alternative jumping to .altinstr_aux
>> -----------------------------------------------------------------
>> Disassembly can show a default alternative jumping to .altinstr_aux. This
>> happens when the _static_cpu_has() function is used. Its default code
>> jumps to .altinstr_aux where a test sequence is executed (test; jnz; jmp).
>>
>> At runtime, this sequence is not used because the _static_cpu_has()
>> an alternative with the X86_FEATURE_ALWAYS feature.
>>
>>
>> debc: perf_get_x86_pmu_capability+0xc jmpq 0xdec1 <.altinstr_aux+0xfc> | NOP5 (X86_FEATURE_HYBRID_CPU) | jmpq 0x61a <perf_get_x86_pmu_capability+0x37> (X86_FEATURE_ALWAYS) # <alternative.debc>
>
> I'm finding this one-line format considerably more difficult to parse
> than the slightly longer two-line form:
>
> debc: perf_get_x86_pmu_capability+0xc <alternative.debc> | X86_FEATURE_HYBRID_CPU | X86_FEATURE_ALWAYS
> debc: perf_get_x86_pmu_capability+0xc jmpq 0xdec1 <.altinstr_aux+0xfc> | NOP5 | jmpq 0x61a <perf_get_x86_pmu_capability+0x37>
Another option could be:
debc: perf_get_x86_pmu_capability+0xc jmpq 0xdec1 <.altinstr_aux+0xfc> (<alternative.debc>) |
NOP5 (X86_FEATURE_HYBRID_CPU) |
jmpq 0x61a <perf_get_x86_pmu_capability+0x37> (X86_FEATURE_ALWAYS)
I think I will use this option when displaying alternative one after the other,
and your suggestion when displaying side-by-side, and add an option to select
the display.
>
> Also, I wonder if we can make NOP5 lowercase (nop5), since it really is
> just an instruction, not something special like a feature.
This indicates that this is a pseudo instruction, NOP5 is actually nopl 0x00(%eax,%eax,1).
Even NOP1 can be a simple nop but also xchg %rax,%rax.
>> Disassembly can show alternative jumping to the next instruction
>> ----------------------------------------------------------------
>>
>> The disassembly can show jump tables with an alternative which jumps
>> to the next instruction.
>>
>> For example:
>>
>> def9: perf_get_x86_pmu_capability+0x49 NOP2 | jmp defb <perf_get_x86_pmu_capability+0x4b> (JUMP) # <alternative.def9>
>
> I'm also struggling to read this one.
>
> Maybe this needs a two-line form as well:
>
> def9: perf_get_x86_pmu_capability+0x49 <static_branch.def9> |
> def9: perf_get_x86_pmu_capability+0x49 NOP2 | jmp defb <perf_get_x86_pmu_capability+0x4b>
I will do something similar as suggested above.
>> Example 2 (--disas option): Single Instruction Alternatives
>> -----------------------------------------------------------
>
> I would like to convert this to a dedicated "disas" subcommand which can
> be run like "objtool disas <func>" or so. But again that can probably
> be done in a followup.
Ok, I will look at it.
>> Example 3 (--disas option): Alternatives with multiple instructions
>> -------------------------------------------------------------------
>> Alternatives with multiple instructions are displayed side-by-side, with
>> an header describing the alternative. The code in the first column is the
>> default code of the alternative.
>>
>>
>> $ ./tools/objtool/objtool --disas=__switch_to_asm --link vmlinux.o
>> __switch_to_asm:
>> 82c0: __switch_to_asm+0x0 push %rbp
>> 82c1: __switch_to_asm+0x1 push %rbx
>> 82c2: __switch_to_asm+0x2 push %r12
>> 82c4: __switch_to_asm+0x4 push %r13
>> 82c6: __switch_to_asm+0x6 push %r14
>> 82c8: __switch_to_asm+0x8 push %r15
>> 82ca: __switch_to_asm+0xa mov %rsp,0x1670(%rdi)
>> 82d1: __switch_to_asm+0x11 mov 0x1670(%rsi),%rsp
>> 82d8: __switch_to_asm+0x18 mov 0xad8(%rsi),%rbx
>> 82df: __switch_to_asm+0x1f mov %rbx,%gs:0x0(%rip) # 0x82e7 <__stack_chk_guard>
>> 82e7: __switch_to_asm+0x27 | <alternative.82e7> | !X86_FEATURE_ALWAYS | X86_FEATURE_RSB_CTXSW
>
> Are the alternatives swapped? I believe this comes from the following
> code, so the !X86_FEATURE_ALWAYS column should be last?
>
> .macro FILL_RETURN_BUFFER reg:req nr:req ftr:req ftr2=ALT_NOT(X86_FEATURE_ALWAYS)
> ALTERNATIVE_2 "jmp .Lskip_rsb_\@", \
> __stringify(__FILL_RETURN_BUFFER(\reg,\nr)), \ftr, \
> __stringify(nop;nop;__FILL_ONE_RETURN), \ftr2
>
> .Lskip_rsb_\@:
> .endm
I will check but I process/print alternative in the order provided by
objtool (in struct alternative)
>> 82e7: __switch_to_asm+0x27 | jmp 0x8312 <__switch_to_asm+0x52> | NOP1 | mov $0x10,%r12
>> 82e8: __switch_to_asm+0x28 | | NOP1 |
>> 82e9: __switch_to_asm+0x29 | NOP1 | callq 0x82ef <__switch_to_asm+0x2f> |
>> 82ea: __switch_to_asm+0x2a | NOP1 | |
>> 82eb: __switch_to_asm+0x2b | NOP1 | |
>> 82ec: __switch_to_asm+0x2c | NOP1 | |
>> 82ed: __switch_to_asm+0x2d | NOP1 | |
>> 82ee: __switch_to_asm+0x2e | NOP1 | int3 | callq 0x82f4 <__switch_to_asm+0x34>
>> 82ef: __switch_to_asm+0x2f | NOP1 | add $0x8,%rsp |
>> 82f0: __switch_to_asm+0x30 | NOP1 | |
>> 82f1: __switch_to_asm+0x31 | NOP1 | |
>> 82f2: __switch_to_asm+0x32 | NOP1 | |
>> 82f3: __switch_to_asm+0x33 | NOP1 | lfence | int3
>> 82f4: __switch_to_asm+0x34 | NOP1 | | callq 0x82fa <__switch_to_asm+0x3a>
>> 82f5: __switch_to_asm+0x35 | NOP1 | |
>> 82f6: __switch_to_asm+0x36 | NOP1 | |
>> 82f7: __switch_to_asm+0x37 | NOP1 | |
>> 82f8: __switch_to_asm+0x38 | NOP1 | |
>> 82f9: __switch_to_asm+0x39 | NOP1 | | int3
>> 82fa: __switch_to_asm+0x3a | NOP1 | | add $0x10,%rsp
>> 82fb: __switch_to_asm+0x3b | NOP1 | |
>> 82fc: __switch_to_asm+0x3c | NOP1 | |
>> 82fd: __switch_to_asm+0x3d | NOP1 | |
>> 82fe: __switch_to_asm+0x3e | NOP1 | | dec %r12
>> 82ff: __switch_to_asm+0x3f | NOP1 | |
>> 8300: __switch_to_asm+0x40 | NOP1 | |
>> 8301: __switch_to_asm+0x41 | NOP1 | | jne 0x82ee <__switch_to_asm+0x2e>
>> 8302: __switch_to_asm+0x42 | NOP1 | |
>> 8303: __switch_to_asm+0x43 | NOP1 | | lfence
>> 8304: __switch_to_asm+0x44 | NOP1 | |
>> 8305: __switch_to_asm+0x45 | NOP1 | |
>> 8306: __switch_to_asm+0x46 | NOP1 | | movq $0xffffffffffffffff,%gs:0x0(%rip) # 0x20b <__x86_call_depth>
>> 8307: __switch_to_asm+0x47 | NOP1 | |
>> 8308: __switch_to_asm+0x48 | NOP1 | |
>> 8309: __switch_to_asm+0x49 | NOP1 | |
>> 830a: __switch_to_asm+0x4a | NOP1 | |
>> 830b: __switch_to_asm+0x4b | NOP1 | |
>> 830c: __switch_to_asm+0x4c | NOP1 | |
>> 830d: __switch_to_asm+0x4d | NOP1 | |
>> 830e: __switch_to_asm+0x4e | NOP1 | |
>> 830f: __switch_to_asm+0x4f | NOP1 | |
>> 8310: __switch_to_asm+0x50 | NOP1 | |
>> 8311: __switch_to_asm+0x51 | NOP1 | |
>
> I like this a lot, but I think it could be vertically compressed quite a
> bit, and superfluous NOPs removed:
>
> 82e7: __switch_to_asm+0x27 | <alternative.82e7> | !X86_FEATURE_ALWAYS | X86_FEATURE_RSB_CTXSW
> 82e7: __switch_to_asm+0x27 | jmp 0x8312 <__switch_to_asm+0x52> | nop1 | mov $0x10,%r12
> 82e8: __switch_to_asm+0x28 | | nop1 |
> 82e9: __switch_to_asm+0x29 | | callq 0x82ef <__switch_to_asm+0x2f> |
> 82ee: __switch_to_asm+0x2e | | int3 | callq 0x82f4 <__switch_to_asm+0x34>
> 82ef: __switch_to_asm+0x2f | | add $0x8,%rsp |
> 82f3: __switch_to_asm+0x33 | | lfence | int3
> 82f4: __switch_to_asm+0x34 | | | callq 0x82fa <__switch_to_asm+0x3a>
> 82f9: __switch_to_asm+0x39 | | | int3
> 82fa: __switch_to_asm+0x3a | | | add $0x10,%rsp
> 82fe: __switch_to_asm+0x3e | | | dec %r12
> 8301: __switch_to_asm+0x41 | | | jne 0x82ee <__switch_to_asm+0x2e>
> 8303: __switch_to_asm+0x43 | | | lfence
> 8306: __switch_to_asm+0x46 | | | movq $0xffffffffffffffff,%gs:0x0(%rip) # 0x20b <__x86_call_depth>
>
> That reads much nicer to me.
>
Yeah, better. I can easily do that by getting rid of trailing NOPs.
Thanks,
alex.
next prev parent reply other threads:[~2025-11-14 9:57 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-13 16:48 Alexandre Chartre
2025-11-13 16:48 ` [PATCH v4 01/28] objtool: Move disassembly functions to a separated file Alexandre Chartre
2025-11-13 16:48 ` [PATCH v4 02/28] objtool: Create disassembly context Alexandre Chartre
2025-11-13 16:48 ` [PATCH v4 03/28] objtool: Disassemble code with libopcodes instead of running objdump Alexandre Chartre
2025-11-13 16:48 ` [PATCH v4 04/28] tool build: Remove annoying newline in build output Alexandre Chartre
2025-11-13 16:48 ` [PATCH v4 05/28] objtool: Print symbol during disassembly Alexandre Chartre
2025-11-13 16:48 ` [PATCH v4 06/28] objtool: Store instruction disassembly result Alexandre Chartre
2025-11-13 16:48 ` [PATCH v4 07/28] objtool: Disassemble instruction on warning or backtrace Alexandre Chartre
2025-11-13 16:48 ` [PATCH v4 08/28] objtool: Extract code to validate instruction from the validate branch loop Alexandre Chartre
2025-11-13 16:48 ` [PATCH v4 09/28] objtool: Record symbol name max length Alexandre Chartre
2025-11-13 16:48 ` [PATCH v4 10/28] objtool: Add option to trace function validation Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 11/28] objtool: Trace instruction state changes during " Alexandre Chartre
2025-11-14 21:21 ` Josh Poimboeuf
2025-11-17 7:33 ` Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 12/28] objtool: Improve register reporting " Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 13/28] objtool: Identify the different types of alternatives Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 14/28] objtool: Improve tracing of alternative instructions Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 15/28] objtool: Do not validate IBT for .return_sites and .call_sites Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 16/28] objtool: Add the --disas=<function-pattern> action Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 17/28] objtool: Print headers for alternatives Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 18/28] objtool: Disassemble group alternatives Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 19/28] objtool: Print addresses with alternative instructions Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 20/28] objtool: Disassemble exception table alternatives Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 21/28] objtool: Disassemble jump " Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 22/28] objtool: Fix address references in alternatives Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 23/28] objtool: Provide access to feature and flags of group alternatives Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 24/28] objtool: Function to get the name of a CPU feature Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 25/28] objtool: Improve naming of group alternatives Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 26/28] objtool: Get the destination name of a PV call Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 27/28] objtool: Improve the disassembly of the pv_ops call Alexandre Chartre
2025-11-15 1:34 ` kernel test robot
2025-11-17 7:37 ` Alexandre Chartre
2025-11-13 16:49 ` [PATCH v4 28/28] objtool: Print single line for alternatives with one instruction Alexandre Chartre
2025-11-13 19:55 ` [PATCH v4 00/28] objtool: Function validation tracing David Laight
2025-11-14 8:53 ` Alexandre Chartre
2025-11-14 1:48 ` Josh Poimboeuf
2025-11-14 9:56 ` Alexandre Chartre [this message]
2025-11-14 21:34 ` Josh Poimboeuf
2025-11-17 7:50 ` Alexandre Chartre
2025-11-17 9:42 ` David Laight
2025-11-17 9:47 ` Alexandre Chartre
2025-11-17 12:37 ` David Laight
2025-11-17 13:11 ` Alexandre Chartre
2025-11-17 22:09 ` David Laight
2025-11-17 22:38 ` Josh Poimboeuf
2025-11-18 9:58 ` David Laight
2025-11-18 7:19 ` Alexandre Chartre
2025-11-18 9:12 ` Peter Zijlstra
2025-11-18 11:39 ` Alexandre Chartre
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3367da83-16b7-4c6a-bd08-d14ec4067025@oracle.com \
--to=alexandre.chartre@oracle.com \
--cc=jpoimboe@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®