Hi Nadav, Thank you for the patch! Yet something to improve: [auto build test ERROR on linus/master] [also build test ERROR on v4.17 next-20180604] [cannot apply to tip/x86/core] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Nadav-Amit/x86-macrofying-inline-asm-for-better-compilation/20180605-124313 config: um-i386_defconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=um SUBARCH=i386 All errors (new ones prefixed by >>): arch/x86/include/asm/bitops.h: Assembler messages: >> arch/x86/include/asm/bitops.h:220: Error: no such instruction: `lock_prefix btsl $0,once.63562' >> arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 16(%esi)' -- arch/x86/include/asm/atomic.h: Assembler messages: >> arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl contig_page_data+500(%edx)' >> arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl vm_zone_stat+32' -- arch/x86/include/asm/bitops.h: Assembler messages: >> arch/x86/include/asm/bitops.h:267: Error: no such instruction: `lock_prefix btrl $8,4(%eax)' -- arch/x86/include/asm/bitops.h: Assembler messages: >> arch/x86/include/asm/bitops.h:76: Error: no such instruction: `lock_prefix orb $2,4(%eax)' -- arch/x86/include/asm/bitops.h: Assembler messages: arch/x86/include/asm/bitops.h:76: Error: no such instruction: `lock_prefix orb $1,64(%eax)' >> arch/x86/include/asm/bitops.h:114: Error: no such instruction: `lock_prefix andb $-2,64(%eax)' >> arch/x86/include/asm/bitops.h:114: Error: no such instruction: `lock_prefix andb $-2,64(%edx)' >> arch/x86/include/asm/bitops.h:114: Error: no such instruction: `lock_prefix andb $-2,64(%edx)' arch/x86/include/asm/bitops.h:76: Error: no such instruction: `lock_prefix orb $1,64(%eax)' >> arch/x86/include/asm/bitops.h:114: Error: no such instruction: `lock_prefix andb $-2,64(%eax)' -- arch/x86/include/asm/atomic.h: Assembler messages: >> arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 8(%esi)' arch/x86/include/asm/atomic.h:108: Error: no such instruction: `lock_prefix decl 8(%esi)' -- arch/x86/include/asm/atomic.h: Assembler messages: >> arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl host_sleep_count' >> arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl host_sleep_count' -- arch/x86/include/asm/atomic.h: Assembler messages: >> arch/x86/include/asm/atomic.h:55: Error: no such instruction: `lock_prefix addl %edx,contig_page_data+504(%eax)' >> arch/x86/include/asm/atomic.h:55: Error: no such instruction: `lock_prefix addl %edx,vm_zone_stat+36' >> arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 36(%eax)' >> arch/x86/include/asm/atomic.h:197: Error: no such instruction: `lock_prefix cmpxchgl %ecx,28(%edx)' >> arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 40(%eax)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl (%esi)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 36(%eax)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 28(%eax)' >> arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 36(%ebx)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 40(%ebx)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl -444(%ebx)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl (%ebx)' arch/x86/include/asm/bitops.h:114: Error: no such instruction: `lock_prefix andb $-5,4(%eax)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl (%eax)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl (%eax)' >> arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 36(%eax)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 28(%eax)' >> arch/x86/include/asm/atomic.h:108: Error: no such instruction: `lock_prefix decl 184(%ecx)' >> arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 12(%edi)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl (%esi)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 4(%esi)' >> arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 8(%esi)' arch/x86/include/asm/bitops.h:114: Error: no such instruction: `lock_prefix andb $-2,4(%eax)' >> arch/x86/include/asm/bitops.h:76: Error: no such instruction: `lock_prefix orb $1,404(%ebx)' arch/x86/include/asm/bitops.h:76: Error: no such instruction: `lock_prefix orb $2,5(%eax)' >> arch/x86/include/asm/bitops.h:76: Error: no such instruction: `lock_prefix orb $2,4(%eax)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 4(%eax)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 4(%eax)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl (%eax)' arch/x86/include/asm/atomic.h:108: Error: no such instruction: `lock_prefix decl 4(%eax)' >> arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 8(%esi)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 8(%esi)' -- arch/x86/include/asm/bitops.h: Assembler messages: >> arch/x86/include/asm/bitops.h:81: Error: no such instruction: `lock_prefix btsl %eax,tainted_mask' >> arch/x86/include/asm/atomic.h:191: Error: no such instruction: `lock_prefix cmpxchgl %edx,panic_cpu' >> arch/x86/include/asm/atomic.h:191: Error: no such instruction: `lock_prefix cmpxchgl %edx,panic_cpu' -- arch/x86/include/asm/bitops.h: Assembler messages: >> arch/x86/include/asm/bitops.h:76: Error: no such instruction: `lock_prefix orb $1,__cpu_online_mask' >> arch/x86/include/asm/bitops.h:76: Error: no such instruction: `lock_prefix orb $1,__cpu_active_mask' >> arch/x86/include/asm/bitops.h:76: Error: no such instruction: `lock_prefix orb $1,__cpu_present_mask' >> arch/x86/include/asm/bitops.h:76: Error: no such instruction: `lock_prefix orb $1,__cpu_possible_mask' -- arch/x86/include/asm/atomic.h: Assembler messages: arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl -888(%eax)' >> arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl (%edi)' >> arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 40(%ebx)' arch/x86/include/asm/atomic.h:108: Error: no such instruction: `lock_prefix decl 4(%eax)' arch/x86/include/asm/bitops.h:114: Error: no such instruction: `lock_prefix andb $-3,4(%eax)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 4(%eax)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 16(%eax)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 8(%edi)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 8(%edi)' >> include/asm-generic/atomic-instrumented.h:362: Error: no such instruction: `lock_prefix cmpxchgl %ecx,372(%edi)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 8(%edi)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 8(%edi)' arch/x86/include/asm/atomic.h:96: Error: no such instruction: `lock_prefix incl 8(%edi)' arch/x86/include/asm/atomic.h:122: Error: no such instruction: `lock_prefix decl 8(%edi)' .. vim +220 arch/x86/include/asm/bitops.h 1a750e0cd include/asm-x86/bitops.h Linus Torvalds 2008-06-18 56 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 57 /** 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 58 * set_bit - Atomically set a bit in memory 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 59 * @nr: the bit to set 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 60 * @addr: the address to start counting from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 61 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 62 * This function is atomic and may not be reordered. See __set_bit() 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 63 * if you do not require the atomic guarantees. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 64 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 65 * Note: there are no guarantees that this function will not be reordered 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 66 * on non x86 architectures, so if you are writing portable code, 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 67 * make sure not to rely on its reordering guarantees. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 68 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 69 * Note that @nr may be almost arbitrarily large; this function is not 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 70 * restricted to acting on a single-word quantity. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 71 */ c8399943b arch/x86/include/asm/bitops.h Andi Kleen 2009-01-12 72 static __always_inline void 9b710506a arch/x86/include/asm/bitops.h H. Peter Anvin 2013-07-16 73 set_bit(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 74 { 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 75 if (IS_IMMEDIATE(nr)) { 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 @76 asm volatile(LOCK_PREFIX "orb %1,%0" 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 77 : CONST_MASK_ADDR(nr, addr) 437a0a54e include/asm-x86/bitops.h Ingo Molnar 2008-06-20 78 : "iq" ((u8)CONST_MASK(nr)) 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 79 : "memory"); 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 80 } else { 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 @81 asm volatile(LOCK_PREFIX __ASM_SIZE(bts) " %1,%0" 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 82 : BITOP_ADDR(addr) : "Ir" (nr) : "memory"); 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 83 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 84 } 1a750e0cd include/asm-x86/bitops.h Linus Torvalds 2008-06-18 85 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 86 /** 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 87 * __set_bit - Set a bit in memory 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 88 * @nr: the bit to set 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 89 * @addr: the address to start counting from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 90 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 91 * Unlike set_bit(), this function is non-atomic and may be reordered. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 92 * If it's called on the same region of memory simultaneously, the effect 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 93 * may be that only one operation succeeds. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 94 */ 8dd5032d9 arch/x86/include/asm/bitops.h Denys Vlasenko 2016-02-07 95 static __always_inline void __set_bit(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 96 { 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 97 asm volatile(__ASM_SIZE(bts) " %1,%0" : ADDR : "Ir" (nr) : "memory"); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 98 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 99 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 100 /** 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 101 * clear_bit - Clears a bit in memory 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 102 * @nr: Bit to clear 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 103 * @addr: Address to start counting from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 104 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 105 * clear_bit() is atomic and may not be reordered. However, it does 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 106 * not contain a memory barrier, so if it is used for locking purposes, d00a56928 arch/x86/include/asm/bitops.h Peter Zijlstra 2014-03-13 107 * you should call smp_mb__before_atomic() and/or smp_mb__after_atomic() 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 108 * in order to ensure changes are visible on other processors. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 109 */ c8399943b arch/x86/include/asm/bitops.h Andi Kleen 2009-01-12 110 static __always_inline void 9b710506a arch/x86/include/asm/bitops.h H. Peter Anvin 2013-07-16 111 clear_bit(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 112 { 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 113 if (IS_IMMEDIATE(nr)) { 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 @114 asm volatile(LOCK_PREFIX "andb %1,%0" 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 115 : CONST_MASK_ADDR(nr, addr) 437a0a54e include/asm-x86/bitops.h Ingo Molnar 2008-06-20 116 : "iq" ((u8)~CONST_MASK(nr))); 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 117 } else { 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 @118 asm volatile(LOCK_PREFIX __ASM_SIZE(btr) " %1,%0" 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 119 : BITOP_ADDR(addr) 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 120 : "Ir" (nr)); 7dbceaf9b include/asm-x86/bitops.h Ingo Molnar 2008-06-20 121 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 122 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 123 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 124 /* 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 125 * clear_bit_unlock - Clears a bit in memory 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 126 * @nr: Bit to clear 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 127 * @addr: Address to start counting from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 128 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 129 * clear_bit() is atomic and implies release semantics before the memory 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 130 * operation. It can be used for an unlock. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 131 */ 8dd5032d9 arch/x86/include/asm/bitops.h Denys Vlasenko 2016-02-07 132 static __always_inline void clear_bit_unlock(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 133 { 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 134 barrier(); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 135 clear_bit(nr, addr); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 136 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 137 8dd5032d9 arch/x86/include/asm/bitops.h Denys Vlasenko 2016-02-07 138 static __always_inline void __clear_bit(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 139 { 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 140 asm volatile(__ASM_SIZE(btr) " %1,%0" : ADDR : "Ir" (nr)); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 141 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 142 b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 143 static __always_inline bool clear_bit_unlock_is_negative_byte(long nr, volatile unsigned long *addr) b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 144 { b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 145 bool negative; 3c52b5c64 arch/x86/include/asm/bitops.h Uros Bizjak 2017-09-06 146 asm volatile(LOCK_PREFIX "andb %2,%1" b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 147 CC_SET(s) b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 148 : CC_OUT(s) (negative), ADDR b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 149 : "ir" ((char) ~(1 << nr)) : "memory"); b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 150 return negative; b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 151 } b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 152 b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 153 // Let everybody know we have it b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 154 #define clear_bit_unlock_is_negative_byte clear_bit_unlock_is_negative_byte b91e1302a arch/x86/include/asm/bitops.h Linus Torvalds 2016-12-27 155 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 156 /* 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 157 * __clear_bit_unlock - Clears a bit in memory 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 158 * @nr: Bit to clear 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 159 * @addr: Address to start counting from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 160 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 161 * __clear_bit() is non-atomic and implies release semantics before the memory 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 162 * operation. It can be used for an unlock if no other CPUs can concurrently 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 163 * modify other bits in the word. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 164 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 165 * No memory barrier is required here, because x86 cannot reorder stores past 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 166 * older loads. Same principle as spin_unlock. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 167 */ 8dd5032d9 arch/x86/include/asm/bitops.h Denys Vlasenko 2016-02-07 168 static __always_inline void __clear_bit_unlock(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 169 { 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 170 barrier(); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 171 __clear_bit(nr, addr); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 172 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 173 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 174 /** 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 175 * __change_bit - Toggle a bit in memory 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 176 * @nr: the bit to change 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 177 * @addr: the address to start counting from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 178 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 179 * Unlike change_bit(), this function is non-atomic and may be reordered. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 180 * If it's called on the same region of memory simultaneously, the effect 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 181 * may be that only one operation succeeds. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 182 */ 8dd5032d9 arch/x86/include/asm/bitops.h Denys Vlasenko 2016-02-07 183 static __always_inline void __change_bit(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 184 { 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 185 asm volatile(__ASM_SIZE(btc) " %1,%0" : ADDR : "Ir" (nr)); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 186 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 187 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 188 /** 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 189 * change_bit - Toggle a bit in memory 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 190 * @nr: Bit to change 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 191 * @addr: Address to start counting from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 192 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 193 * change_bit() is atomic and may not be reordered. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 194 * Note that @nr may be almost arbitrarily large; this function is not 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 195 * restricted to acting on a single-word quantity. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 196 */ 8dd5032d9 arch/x86/include/asm/bitops.h Denys Vlasenko 2016-02-07 197 static __always_inline void change_bit(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 198 { 838e8bb71 arch/x86/include/asm/bitops.h Uros Bizjak 2008-10-24 199 if (IS_IMMEDIATE(nr)) { 838e8bb71 arch/x86/include/asm/bitops.h Uros Bizjak 2008-10-24 200 asm volatile(LOCK_PREFIX "xorb %1,%0" 838e8bb71 arch/x86/include/asm/bitops.h Uros Bizjak 2008-10-24 201 : CONST_MASK_ADDR(nr, addr) 838e8bb71 arch/x86/include/asm/bitops.h Uros Bizjak 2008-10-24 202 : "iq" ((u8)CONST_MASK(nr))); 838e8bb71 arch/x86/include/asm/bitops.h Uros Bizjak 2008-10-24 203 } else { 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 204 asm volatile(LOCK_PREFIX __ASM_SIZE(btc) " %1,%0" 838e8bb71 arch/x86/include/asm/bitops.h Uros Bizjak 2008-10-24 205 : BITOP_ADDR(addr) 838e8bb71 arch/x86/include/asm/bitops.h Uros Bizjak 2008-10-24 206 : "Ir" (nr)); 838e8bb71 arch/x86/include/asm/bitops.h Uros Bizjak 2008-10-24 207 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 208 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 209 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 210 /** 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 211 * test_and_set_bit - Set a bit and return its old value 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 212 * @nr: Bit to set 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 213 * @addr: Address to count from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 214 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 215 * This operation is atomic and cannot be reordered. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 216 * It also implies a memory barrier. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 217 */ 117780eef arch/x86/include/asm/bitops.h H. Peter Anvin 2016-06-08 218 static __always_inline bool test_and_set_bit(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 219 { 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 @220 GEN_BINARY_RMWcc(LOCK_PREFIX __ASM_SIZE(bts), 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 221 *addr, "Ir", nr, "%0", c); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 222 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 223 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 224 /** 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 225 * test_and_set_bit_lock - Set a bit and return its old value for lock 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 226 * @nr: Bit to set 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 227 * @addr: Address to count from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 228 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 229 * This is the same as test_and_set_bit on x86. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 230 */ 117780eef arch/x86/include/asm/bitops.h H. Peter Anvin 2016-06-08 231 static __always_inline bool 9b710506a arch/x86/include/asm/bitops.h H. Peter Anvin 2013-07-16 232 test_and_set_bit_lock(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 233 { 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 234 return test_and_set_bit(nr, addr); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 235 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 236 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 237 /** 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 238 * __test_and_set_bit - Set a bit and return its old value 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 239 * @nr: Bit to set 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 240 * @addr: Address to count from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 241 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 242 * This operation is non-atomic and can be reordered. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 243 * If two examples of this operation race, one can appear to succeed 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 244 * but actually fail. You must protect multiple accesses with a lock. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 245 */ 117780eef arch/x86/include/asm/bitops.h H. Peter Anvin 2016-06-08 246 static __always_inline bool __test_and_set_bit(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 247 { 117780eef arch/x86/include/asm/bitops.h H. Peter Anvin 2016-06-08 248 bool oldbit; 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 249 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 250 asm(__ASM_SIZE(bts) " %2,%1" 86b61240d arch/x86/include/asm/bitops.h H. Peter Anvin 2016-06-08 251 CC_SET(c) 86b61240d arch/x86/include/asm/bitops.h H. Peter Anvin 2016-06-08 252 : CC_OUT(c) (oldbit), ADDR eb2b4e682 include/asm-x86/bitops.h Simon Holm Thøgersen 2008-05-05 253 : "Ir" (nr)); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 254 return oldbit; 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 255 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 256 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 257 /** 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 258 * test_and_clear_bit - Clear a bit and return its old value 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 259 * @nr: Bit to clear 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 260 * @addr: Address to count from 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 261 * 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 262 * This operation is atomic and cannot be reordered. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 263 * It also implies a memory barrier. 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 264 */ 117780eef arch/x86/include/asm/bitops.h H. Peter Anvin 2016-06-08 265 static __always_inline bool test_and_clear_bit(long nr, volatile unsigned long *addr) 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 266 { 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 @267 GEN_BINARY_RMWcc(LOCK_PREFIX __ASM_SIZE(btr), 22636f8c9 arch/x86/include/asm/bitops.h Jan Beulich 2018-02-26 268 *addr, "Ir", nr, "%0", c); 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 269 } 1c54d7707 include/asm-x86/bitops.h Jeremy Fitzhardinge 2008-01-30 270 :::::: The code at line 220 was first introduced by commit :::::: 22636f8c9511245cb3c8412039f1dd95afb3aa59 x86/asm: Add instruction suffixes to bitops :::::: TO: Jan Beulich :::::: CC: Thomas Gleixner --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation