• Jan Beulich's avatar
    x86: bitops asm constraint fixes · 709f744f
    Jan Beulich authored
    This (simplified) piece of code didn't behave as expected due to
    incorrect constraints in some of the bitops functions, when
    X86_FEATURE_xxx is referring to other than the first long:
    
    int test(struct cpuinfo_x86 *c) {
    	if (cpu_has(c, X86_FEATURE_xxx))
    		clear_cpu_cap(c, X86_FEATURE_xxx);
    	return cpu_has(c, X86_FEATURE_xxx);
    }
    
    I'd really like understand, though, what the policy of (not) having a
    "memory" clobber in these operations is - currently, this appears to
    be totally inconsistent. Also, many comments of the non-atomic
    functions say those may also be re-ordered - this contradicts the use
    of "asm volatile" in there, which again I'd like to understand.
    
    As much as all of these, using 'int' for the 'nr' parameter and
    'void *' for the 'addr' one is in conflict with
    Documentation/atomic_ops.txt, especially because bt{,c,r,s} indeed
    take the bit index as signed (which hence would really need special
    precaution) and access the full 32 bits (if 'unsigned long' was used
    properly here, 64 bits for x86-64) pointed at, so invalid uses like
    referencing a 'char' array cannot currently be caught.
    
    Finally, the code with and without this patch relies heavily on the
    -fno-strict-aliasing compiler switch and I'm not certain this really
    is a good idea.
    
    In the light of all of this I'm sending this as RFC, as fixing the
    above might warrant a much bigger patch...
    Signed-off-by: default avatarJan Beulich <jbeulich@novell.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    709f744f
bitops.h 8.32 KB