lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251124110425.GAaSQ7uSffz7xDayLJ@fat_crate.local>
Date: Mon, 24 Nov 2025 12:04:25 +0100
From: Borislav Petkov <bp@...en8.de>
To: Alexandre Chartre <alexandre.chartre@...cle.com>
Cc: 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 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.

> 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
> 
> 
> 

-- 
Regards/Gruss,
    Boris.

https://people.kernel.org/tglx/notes-about-netiquette

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ