[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <042a329d-a2dd-479b-af8f-916488042fd9@oracle.com>
Date: Fri, 14 Nov 2025 09:53:08 +0100
From: Alexandre Chartre <alexandre.chartre@...cle.com>
To: David Laight <david.laight.linux@...il.com>
Cc: alexandre.chartre@...cle.com, linux-kernel@...r.kernel.org,
mingo@...nel.org, jpoimboe@...nel.org, peterz@...radead.org
Subject: Re: [PATCH v4 00/28] objtool: Function validation tracing
On 11/13/25 20:55, David Laight wrote:
> On Thu, 13 Nov 2025 17:48:49 +0100
> Alexandre Chartre <alexandre.chartre@...cle.com> wrote:
>
>> Hi,
>>
>> These patches change objtool to disassemble code with libopcodes instead
>> of running objdump. You will find below:
>>
>> - Changes: list of changes made in this version
>> - Overview: overview of the changes
>> - Notes: description of some particular behavior
>> - Examples: output examples
> ...
>> 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
>> 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 | |
>> 8312: __switch_to_asm+0x52 pop %r15
>> 8314: __switch_to_asm+0x54 pop %r14
>> 8316: __switch_to_asm+0x56 pop %r13
>> 8318: __switch_to_asm+0x58 pop %r12
>> 831a: __switch_to_asm+0x5a pop %rbx
>> 831b: __switch_to_asm+0x5b pop %rbp
>> 831c: __switch_to_asm+0x5c jmpq 0x8321 <__switch_to>
>
> That might be rather easier to read if the alternatives followed each other.
> Not all of us want to use a very wide window to look at object files.
> (I didn't see any other example like that either.)
>
> Similarly in Ex 5:
> 332d4: early_ioremap_pmd+0x4 callq *0x0(%rip) # 0x332da <pv_ops+0x150> | mov %cr3,%rax (!X86_FEATURE_XENPV) | callq xen_read_cr3 (+X86_FEATURE_ALWAYS) # <alternative.332d4>
> might be more readable flipped to something like:
> 332d4: early_ioremap_pmd+0x4 callq *0x0(%rip) # 0x332da <pv_ops+0x150>
> !X86_FEATURE_XENPV: mov %cr3,%rax
> +X86_FEATURE_ALWAYS: callq xen_read_cr3
>
I initially had alternatives followed each other, but PeterZ suggested to
have them on one line. But I agree that this requires a large window.
I can add an option to select the display: either following each other (that
would be the default), or side-by-side.
Thanks,
alex.
Powered by blists - more mailing lists