[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <42761dfb-b58e-49b0-bb62-dd548c238b8b@oracle.com>
Date: Mon, 24 Nov 2025 12:39:08 +0100
From: Alexandre Chartre <alexandre.chartre@...cle.com>
To: Borislav Petkov <bp@...en8.de>
Cc: alexandre.chartre@...cle.com, linux-kernel@...r.kernel.org,
mingo@...nel.org, jpoimboe@...nel.org, peterz@...radead.org,
david.laight.linux@...il.com
Subject: Re: [PATCH v6 00/30] objtool: Function validation tracing
On 11/24/25 12:04, Borislav Petkov wrote:
> On Fri, Nov 21, 2025 at 10:53:10AM +0100, Alexandre Chartre wrote:
>> Notes:
>> ======
>
> So those examples below look very useful and cool. Can you pls document them
> so that I can find the breadcrumbs next time and use them?
>
> :-)
>
> Thx.
Sure. I will add a doc in tools/objtool/Documentation/ in followup patches.
Rgds,
alex.
>
>> 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>
>> dec1: perf_get_x86_pmu_capability+0x11 ud2
>>
>>
>> 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>
>> defb: perf_get_x86_pmu_capability+0x4b mov 0x0(%rip),%rdi # 0xdf02 <x86_pmu+0xd8>
>>
>> This disassembly is correct. These instructions come from:
>>
>> cap->num_counters_gp = x86_pmu_num_counters(NULL)):
>>
>> which will end up executing this statement:
>>
>> if (static_branch_unlikely(&perf_is_hybrid) && NULL)
>> <do something>;
>>
>> This statement is optimized to do nothing because the condition is
>> always false. But static_branch_unlikely() is implemented with a jump
>> table inside an "asm goto" statement, and "asm goto" statements are
>> not optimized.
>>
>> So basically the code is optimized like this:
>>
>> if (static_branch_unlikely(&perf_is_hybrid))
>> ;
>>
>> And this translates to the assembly code above.
>>
>>
>> Examples:
>> =========
>>
>> Example 1 (--trace option): Trace the validation of the os_save() function
>> --------------------------------------------------------------------------
>>
>> $ ./tools/objtool/objtool --hacks=jump_label --hacks=noinstr --hacks=skylake --ibt --orc --retpoline --rethunk --sls --static-call --uaccess --prefix=16 --link --trace os_xsave -v vmlinux.o
>> os_xsave: validation begin
>> 59be0: os_xsave+0x0 push %r12 - state: cfa=rsp+16 r12=(cfa-16) stack_size=16
>> 59be2: os_xsave+0x2 mov 0x0(%rip),%eax # 0x59be8 <alternatives_patched>
>> 59be8: os_xsave+0x8 push %rbp - state: cfa=rsp+24 rbp=(cfa-24) stack_size=24
>> 59be9: os_xsave+0x9 mov %rdi,%rbp
>> 59bec: os_xsave+0xc push %rbx - state: cfa=rsp+32 rbx=(cfa-32) stack_size=32
>> 59bed: os_xsave+0xd mov 0x8(%rdi),%rbx
>> 59bf1: os_xsave+0x11 mov %rbx,%r12
>> 59bf4: os_xsave+0x14 shr $0x20,%r12
>> 59bf8: os_xsave+0x18 test %eax,%eax
>> 59bfa: os_xsave+0x1a je 0x59c22 <os_xsave+0x42> - jump taken
>> 59c22: os_xsave+0x42 | ud2
>> 59c24: os_xsave+0x44 | jmp 0x59bfc <os_xsave+0x1c> - unconditional jump
>> 59bfc: os_xsave+0x1c | | xor %edx,%edx
>> 59bfe: os_xsave+0x1e | | mov %rbx,%rsi
>> 59c01: os_xsave+0x21 | | mov %rbp,%rdi
>> 59c04: os_xsave+0x24 | | callq 0x59c09 <xfd_validate_state> - call
>> 59c09: os_xsave+0x29 | | mov %ebx,%eax
>> 59c0b: os_xsave+0x2b | | mov %r12d,%edx
>> | | / <alternative.59c0e> X86_FEATURE_XSAVEOPT
>> 1b29: .altinstr_replacement+0x1b29 | | | xsaveopt64 0x40(%rbp)
>> 59c13: os_xsave+0x33 | | | xor %ebx,%ebx
>> 59c15: os_xsave+0x35 | | | test %ebx,%ebx
>> 59c17: os_xsave+0x37 | | | jne 0x59c26 <os_xsave+0x46> - jump taken
>> 59c26: os_xsave+0x46 | | | | ud2
>> 59c28: os_xsave+0x48 | | | | pop %rbx - state: cfa=rsp+24 rbx=<undef> stack_size=24
>> 59c29: os_xsave+0x49 | | | | pop %rbp - state: cfa=rsp+16 rbp=<undef> stack_size=16
>> 59c2a: os_xsave+0x4a | | | | pop %r12 - state: cfa=rsp+8 r12=<undef> stack_size=8
>> 59c2c: os_xsave+0x4c | | | | jmpq 0x59c31 <__x86_return_thunk> - return
>> 59c17: os_xsave+0x37 | | | jne 0x59c26 <os_xsave+0x46> - jump not taken
>> 59c19: os_xsave+0x39 | | | pop %rbx - state: cfa=rsp+24 rbx=<undef> stack_size=24
>> 59c1a: os_xsave+0x3a | | | pop %rbp - state: cfa=rsp+16 rbp=<undef> stack_size=16
>> 59c1b: os_xsave+0x3b | | | pop %r12 - state: cfa=rsp+8 r12=<undef> stack_size=8
>> 59c1d: os_xsave+0x3d | | | jmpq 0x59c22 <__x86_return_thunk> - return
>> | | \ <alternative.59c0e> X86_FEATURE_XSAVEOPT
>> | | / <alternative.59c0e> X86_FEATURE_XSAVEC
>> 1b2e: .altinstr_replacement+0x1b2e | | | xsavec64 0x40(%rbp)
>> 59c13: os_xsave+0x33 | | | xor %ebx,%ebx - already visited
>> | | \ <alternative.59c0e> X86_FEATURE_XSAVEC
>> | | / <alternative.59c0e> X86_FEATURE_XSAVES
>> 1b33: .altinstr_replacement+0x1b33 | | | xsaves64 0x40(%rbp)
>> 59c13: os_xsave+0x33 | | | xor %ebx,%ebx - already visited
>> | | \ <alternative.59c0e> X86_FEATURE_XSAVES
>> | | / <alternative.59c0e> EXCEPTION for instruction at 0x59c0e <os_xsave+0x2e>
>> 59c15: os_xsave+0x35 | | | test %ebx,%ebx - already visited
>> | | \ <alternative.59c0e> EXCEPTION
>> | | / <alternative.59c0e> DEFAULT
>> 59c0e: os_xsave+0x2e | | xsave64 0x40(%rbp)
>> 59c13: os_xsave+0x33 | | xor %ebx,%ebx - already visited
>> 59bfa: os_xsave+0x1a je 0x59c22 <os_xsave+0x42> - jump not taken
>> 59bfc: os_xsave+0x1c xor %edx,%edx - already visited
>> os_xsave: validation end
>>
>>
>> Example 2 (--disas option): Single Instruction Alternatives
>> -----------------------------------------------------------
>>
>> Compact Output (default):
>>
>> Alternatives with single instructions are displayed each on one line,
>> with the instruction and a description of the alternative.
>>
>> $ ./tools/objtool/objtool --disas=perf_get_x86_pmu_capability --link vmlinux.o
>> perf_get_x86_pmu_capability:
>> deb0: perf_get_x86_pmu_capability+0x0 endbr64
>> deb4: perf_get_x86_pmu_capability+0x4 callq 0xdeb9 <__fentry__>
>> deb9: perf_get_x86_pmu_capability+0x9 mov %rdi,%rdx
>> debc: perf_get_x86_pmu_capability+0xc <alternative.debc>
>> = jmpq 0xdec1 <.altinstr_aux+0xfc> (if DEFAULT)
>> = jmpq 0x622 <perf_get_x86_pmu_capability+0x37> (if X86_FEATURE_ALWAYS)
>> = nop5 (if X86_FEATURE_HYBRID_CPU)
>> dec1: perf_get_x86_pmu_capability+0x11 ud2
>> dec3: perf_get_x86_pmu_capability+0x13 movq $0x0,(%rdx)
>> deca: perf_get_x86_pmu_capability+0x1a movq $0x0,0x8(%rdx)
>> ded2: perf_get_x86_pmu_capability+0x22 movq $0x0,0x10(%rdx)
>> deda: perf_get_x86_pmu_capability+0x2a movq $0x0,0x18(%rdx)
>> dee2: perf_get_x86_pmu_capability+0x32 jmpq 0xdee7 <__x86_return_thunk>
>> dee7: perf_get_x86_pmu_capability+0x37 cmpq $0x0,0x0(%rip) # 0xdeef <x86_pmu+0x10>
>> deef: perf_get_x86_pmu_capability+0x3f je 0xdec3 <perf_get_x86_pmu_capability+0x13>
>> def1: perf_get_x86_pmu_capability+0x41 mov 0x0(%rip),%eax # 0xdef7 <x86_pmu+0x8>
>> def7: perf_get_x86_pmu_capability+0x47 mov %eax,(%rdi)
>> def9: perf_get_x86_pmu_capability+0x49 <jump_table.def9>
>> = nop2 (if DEFAULT)
>> = jmp defb <perf_get_x86_pmu_capability+0x4b> (if JUMP)
>> defb: perf_get_x86_pmu_capability+0x4b mov 0x0(%rip),%rdi # 0xdf02 <x86_pmu+0xd8>
>> df02: perf_get_x86_pmu_capability+0x52 <alternative.df02>
>> = callq 0xdf07 <__sw_hweight64> (if DEFAULT)
>> = popcnt %rdi,%rax (if X86_FEATURE_POPCNT)
>> df07: perf_get_x86_pmu_capability+0x57 mov %eax,0x4(%rdx)
>> df0a: perf_get_x86_pmu_capability+0x5a <jump_table.df0a>
>> = nop2 (if DEFAULT)
>> = jmp df0c <perf_get_x86_pmu_capability+0x5c> (if JUMP)
>> df0c: perf_get_x86_pmu_capability+0x5c mov 0x0(%rip),%rdi # 0xdf13 <x86_pmu+0xe0>
>> df13: perf_get_x86_pmu_capability+0x63 <alternative.df13>
>> = callq 0xdf18 <__sw_hweight64> (if DEFAULT)
>> = popcnt %rdi,%rax (if X86_FEATURE_POPCNT)
>> df18: perf_get_x86_pmu_capability+0x68 mov %eax,0x8(%rdx)
>> df1b: perf_get_x86_pmu_capability+0x6b mov 0x0(%rip),%eax # 0xdf21 <x86_pmu+0xf8>
>> df21: perf_get_x86_pmu_capability+0x71 mov %eax,0xc(%rdx)
>> df24: perf_get_x86_pmu_capability+0x74 mov %eax,0x10(%rdx)
>> df27: perf_get_x86_pmu_capability+0x77 mov 0x0(%rip),%rax # 0xdf2e <x86_pmu+0x108>
>> df2e: perf_get_x86_pmu_capability+0x7e mov %eax,0x14(%rdx)
>> df31: perf_get_x86_pmu_capability+0x81 mov 0x0(%rip),%eax # 0xdf37 <x86_pmu+0x110>
>> df37: perf_get_x86_pmu_capability+0x87 mov %eax,0x18(%rdx)
>> df3a: perf_get_x86_pmu_capability+0x8a movzbl 0x0(%rip),%ecx # 0xdf41 <x86_pmu+0x1d1>
>> df41: perf_get_x86_pmu_capability+0x91 movzbl 0x1c(%rdx),%eax
>> df45: perf_get_x86_pmu_capability+0x95 shr %cl
>> df47: perf_get_x86_pmu_capability+0x97 and $0x1,%ecx
>> df4a: perf_get_x86_pmu_capability+0x9a and $0xfffffffe,%eax
>> df4d: perf_get_x86_pmu_capability+0x9d or %ecx,%eax
>> df4f: perf_get_x86_pmu_capability+0x9f mov %al,0x1c(%rdx)
>> df52: perf_get_x86_pmu_capability+0xa2 jmpq 0xdf57 <__x86_return_thunk>
>>
>>
>> Wide Output (--wide option):
>>
>> Alternatives with single instructions are displayed side-by-side,
>> with an header.
>>
>> $ ./tools/objtool/objtool --disas=perf_get_x86_pmu_capability --wide --link vmlinux.o
>> perf_get_x86_pmu_capability:
>> deb0: perf_get_x86_pmu_capability+0x0 endbr64
>> deb4: perf_get_x86_pmu_capability+0x4 callq 0xdeb9 <__fentry__>
>> deb9: perf_get_x86_pmu_capability+0x9 mov %rdi,%rdx
>> debc: perf_get_x86_pmu_capability+0xc | <alternative.debc> | X86_FEATURE_ALWAYS | X86_FEATURE_HYBRID_CPU
>> debc: perf_get_x86_pmu_capability+0xc | jmpq 0xdec1 <.altinstr_aux+0xfc> | jmpq 0x622 <perf_get_x86_pmu_capability+0x37> | nop5
>> dec1: perf_get_x86_pmu_capability+0x11 ud2
>> dec3: perf_get_x86_pmu_capability+0x13 movq $0x0,(%rdx)
>> deca: perf_get_x86_pmu_capability+0x1a movq $0x0,0x8(%rdx)
>> ded2: perf_get_x86_pmu_capability+0x22 movq $0x0,0x10(%rdx)
>> deda: perf_get_x86_pmu_capability+0x2a movq $0x0,0x18(%rdx)
>> dee2: perf_get_x86_pmu_capability+0x32 jmpq 0xdee7 <__x86_return_thunk>
>> dee7: perf_get_x86_pmu_capability+0x37 cmpq $0x0,0x0(%rip) # 0xdeef <x86_pmu+0x10>
>> deef: perf_get_x86_pmu_capability+0x3f je 0xdec3 <perf_get_x86_pmu_capability+0x13>
>> def1: perf_get_x86_pmu_capability+0x41 mov 0x0(%rip),%eax # 0xdef7 <x86_pmu+0x8>
>> def7: perf_get_x86_pmu_capability+0x47 mov %eax,(%rdi)
>> def9: perf_get_x86_pmu_capability+0x49 | <jump_table.def9> | JUMP
>> def9: perf_get_x86_pmu_capability+0x49 | nop2 | jmp defb <perf_get_x86_pmu_capability+0x4b>
>> defb: perf_get_x86_pmu_capability+0x4b mov 0x0(%rip),%rdi # 0xdf02 <x86_pmu+0xd8>
>> df02: perf_get_x86_pmu_capability+0x52 | <alternative.df02> | X86_FEATURE_POPCNT
>> df02: perf_get_x86_pmu_capability+0x52 | callq 0xdf07 <__sw_hweight64> | popcnt %rdi,%rax
>> df07: perf_get_x86_pmu_capability+0x57 mov %eax,0x4(%rdx)
>> df0a: perf_get_x86_pmu_capability+0x5a | <jump_table.df0a> | JUMP
>> df0a: perf_get_x86_pmu_capability+0x5a | nop2 | jmp df0c <perf_get_x86_pmu_capability+0x5c>
>> df0c: perf_get_x86_pmu_capability+0x5c mov 0x0(%rip),%rdi # 0xdf13 <x86_pmu+0xe0>
>> df13: perf_get_x86_pmu_capability+0x63 | <alternative.df13> | X86_FEATURE_POPCNT
>> df13: perf_get_x86_pmu_capability+0x63 | callq 0xdf18 <__sw_hweight64> | popcnt %rdi,%rax
>> df18: perf_get_x86_pmu_capability+0x68 mov %eax,0x8(%rdx)
>> df1b: perf_get_x86_pmu_capability+0x6b mov 0x0(%rip),%eax # 0xdf21 <x86_pmu+0xf8>
>> df21: perf_get_x86_pmu_capability+0x71 mov %eax,0xc(%rdx)
>> df24: perf_get_x86_pmu_capability+0x74 mov %eax,0x10(%rdx)
>> df27: perf_get_x86_pmu_capability+0x77 mov 0x0(%rip),%rax # 0xdf2e <x86_pmu+0x108>
>> df2e: perf_get_x86_pmu_capability+0x7e mov %eax,0x14(%rdx)
>> df31: perf_get_x86_pmu_capability+0x81 mov 0x0(%rip),%eax # 0xdf37 <x86_pmu+0x110>
>> df37: perf_get_x86_pmu_capability+0x87 mov %eax,0x18(%rdx)
>> df3a: perf_get_x86_pmu_capability+0x8a movzbl 0x0(%rip),%ecx # 0xdf41 <x86_pmu+0x1d1>
>> df41: perf_get_x86_pmu_capability+0x91 movzbl 0x1c(%rdx),%eax
>> df45: perf_get_x86_pmu_capability+0x95 shr %cl
>> df47: perf_get_x86_pmu_capability+0x97 and $0x1,%ecx
>> df4a: perf_get_x86_pmu_capability+0x9a and $0xfffffffe,%eax
>> df4d: perf_get_x86_pmu_capability+0x9d or %ecx,%eax
>> df4f: perf_get_x86_pmu_capability+0x9f mov %al,0x1c(%rdx)
>> df52: perf_get_x86_pmu_capability+0xa2 jmpq 0xdf57 <__x86_return_thunk>
>>
>>
>> Example 3 (--disas option): Alternatives with multiple instructions
>> -------------------------------------------------------------------
>>
>> Compact Output (default):
>>
>> Alternatives with multiple instructions are displayed one above the other,
>> with an header describing 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>
>> = DEFAULT
>> 82e7: __switch_to_asm+0x27 | jmp 0x8312 <__switch_to_asm+0x52>
>> 82e9: __switch_to_asm+0x29 | nop*41
>> |
>> = X86_FEATURE_RSB_CTXSW
>> 82e7: __switch_to_asm+0x27 | mov $0x10,%r12
>> 82ee: __switch_to_asm+0x2e | callq 0x82f4 <__switch_to_asm+0x34>
>> 82f3: __switch_to_asm+0x33 | 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>
>> |
>> = !X86_FEATURE_ALWAYS
>> 82e7: __switch_to_asm+0x27 | nop1
>> 82e8: __switch_to_asm+0x28 | nop1
>> 82e9: __switch_to_asm+0x29 | callq 0x82ef <__switch_to_asm+0x2f>
>> 82ee: __switch_to_asm+0x2e | int3
>> 82ef: __switch_to_asm+0x2f | add $0x8,%rsp
>> 82f3: __switch_to_asm+0x33 | lfence
>> |
>> 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>
>>
>>
>> Wide Output (--wide option):
>>
>> 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 --wide --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_RSB_CTXSW | !X86_FEATURE_ALWAYS
>> 82e7: __switch_to_asm+0x27 | jmp 0x8312 <__switch_to_asm+0x52> | mov $0x10,%r12 | nop1
>> 82e8: __switch_to_asm+0x28 | | | nop1
>> 82e9: __switch_to_asm+0x29 | nop*41 | | callq 0x82ef <__switch_to_asm+0x2f>
>> 82ee: __switch_to_asm+0x2e | | callq 0x82f4 <__switch_to_asm+0x34> | int3
>> 82ef: __switch_to_asm+0x2f | | | add $0x8,%rsp
>> 82f3: __switch_to_asm+0x33 | | int3 | lfence
>> 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> |
>> 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>
>>
>> -----
>>
>> Alexandre Chartre (30):
>> objtool: Move disassembly functions to a separated file
>> objtool: Create disassembly context
>> objtool: Disassemble code with libopcodes instead of running objdump
>> tool build: Remove annoying newline in build output
>> objtool: Print symbol during disassembly
>> objtool: Store instruction disassembly result
>> objtool: Disassemble instruction on warning or backtrace
>> objtool: Extract code to validate instruction from the validate branch
>> loop
>> objtool: Record symbol name max length
>> objtool: Add option to trace function validation
>> objtool: Trace instruction state changes during function validation
>> objtool: Improve register reporting during function validation
>> objtool: Identify the different types of alternatives
>> objtool: Add functions to better name alternatives
>> objtool: Improve tracing of alternative instructions
>> objtool: Do not validate IBT for .return_sites and .call_sites
>> objtool: Add the --disas=<function-pattern> action
>> objtool: Preserve alternatives order
>> objtool: Print headers for alternatives
>> objtool: Disassemble group alternatives
>> objtool: Print addresses with alternative instructions
>> objtool: Disassemble exception table alternatives
>> objtool: Disassemble jump table alternatives
>> objtool: Fix address references in alternatives
>> objtool: Provide access to feature and flags of group alternatives
>> objtool: Function to get the name of a CPU feature
>> objtool: Improve naming of group alternatives
>> objtool: Compact output for alternatives with one instruction
>> objtool: Add wide output for disassembly
>> objtool: Trim trailing NOPs in alternative
>>
>> .../x86/tools/gen-cpu-feature-names-x86.awk | 33 +
>> tools/build/Makefile.feature | 4 +-
>> tools/objtool/.gitignore | 3 +
>> tools/objtool/Build | 3 +
>> tools/objtool/Makefile | 26 +
>> tools/objtool/arch/loongarch/decode.c | 23 +
>> tools/objtool/arch/loongarch/special.c | 5 +
>> tools/objtool/arch/powerpc/decode.c | 24 +
>> tools/objtool/arch/powerpc/special.c | 5 +
>> tools/objtool/arch/x86/Build | 8 +
>> tools/objtool/arch/x86/decode.c | 20 +
>> tools/objtool/arch/x86/special.c | 10 +
>> tools/objtool/builtin-check.c | 4 +
>> tools/objtool/check.c | 648 +++++----
>> tools/objtool/disas.c | 1245 +++++++++++++++++
>> tools/objtool/include/objtool/arch.h | 11 +
>> tools/objtool/include/objtool/builtin.h | 3 +
>> tools/objtool/include/objtool/check.h | 35 +-
>> tools/objtool/include/objtool/disas.h | 81 ++
>> tools/objtool/include/objtool/special.h | 4 +-
>> tools/objtool/include/objtool/trace.h | 141 ++
>> tools/objtool/include/objtool/warn.h | 17 +-
>> tools/objtool/special.c | 2 +
>> tools/objtool/trace.c | 203 +++
>> 24 files changed, 2259 insertions(+), 299 deletions(-)
>> create mode 100644 tools/arch/x86/tools/gen-cpu-feature-names-x86.awk
>> create mode 100644 tools/objtool/disas.c
>> create mode 100644 tools/objtool/include/objtool/disas.h
>> create mode 100644 tools/objtool/include/objtool/trace.h
>> create mode 100644 tools/objtool/trace.c
>>
>> --
>> 2.43.5
>>
>>
>>
>
Powered by blists - more mailing lists