~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/lib/cmpxchg16b_emu.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/x86/lib/cmpxchg16b_emu.S (Version linux-6.12-rc7) and /arch/i386/lib/cmpxchg16b_emu.S (Version linux-2.6.0)


  1 /* SPDX-License-Identifier: GPL-2.0-only */       
  2 #include <linux/linkage.h>                        
  3 #include <asm/percpu.h>                           
  4 #include <asm/processor-flags.h>                  
  5                                                   
  6 .text                                             
  7                                                   
  8 /*                                                
  9  * Emulate 'cmpxchg16b %gs:(%rsi)'                
 10  *                                                
 11  * Inputs:                                        
 12  * %rsi : memory location to compare              
 13  * %rax : low 64 bits of old value                
 14  * %rdx : high 64 bits of old value               
 15  * %rbx : low 64 bits of new value                
 16  * %rcx : high 64 bits of new value               
 17  *                                                
 18  * Notably this is not LOCK prefixed and is no    
 19  */                                               
 20 SYM_FUNC_START(this_cpu_cmpxchg16b_emu)           
 21                                                   
 22         pushfq                                    
 23         cli                                       
 24                                                   
 25         /* if (*ptr == old) */                    
 26         cmpq    __percpu (%rsi), %rax             
 27         jne     .Lnot_same                        
 28         cmpq    __percpu 8(%rsi), %rdx            
 29         jne     .Lnot_same                        
 30                                                   
 31         /* *ptr = new */                          
 32         movq    %rbx, __percpu (%rsi)             
 33         movq    %rcx, __percpu 8(%rsi)            
 34                                                   
 35         /* set ZF in EFLAGS to indicate succes    
 36         orl     $X86_EFLAGS_ZF, (%rsp)            
 37                                                   
 38         popfq                                     
 39         RET                                       
 40                                                   
 41 .Lnot_same:                                       
 42         /* *ptr != old */                         
 43                                                   
 44         /* old = *ptr */                          
 45         movq    __percpu (%rsi), %rax             
 46         movq    __percpu 8(%rsi), %rdx            
 47                                                   
 48         /* clear ZF in EFLAGS to indicate fail    
 49         andl    $(~X86_EFLAGS_ZF), (%rsp)         
 50                                                   
 51         popfq                                     
 52         RET                                       
 53                                                   
 54 SYM_FUNC_END(this_cpu_cmpxchg16b_emu)             
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php