set_bit() is broken on i386?

From: Chuck Ebbert
Date: Fri Jan 20 2006 - 19:54:02 EST


/*
* setbit.c -- test the Linux set_bit() function
*
* Compare the output of this program with and without the
* -finline-functions option to GCC.
*
* If they are not the same, set_bit is broken.
*
* Result on i386 with gcc 3.3.2 (Fedora Core 2):
*
* [me@d2 t]$ gcc -O2 -o setbit.ex setbit.c ; ./setbit.ex
* 00010001
* [me@d2 t]$ gcc -O2 -o setbit.ex -finline-functions setbit.c ; ./setbit.ex
* 00000001
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

#define inline __attribute__((always_inline))

/*
* From 2.6.15/include/asm-i386/bitops.h -- needs a memory clobber?
*/
#define ADDR (*(volatile long *) addr)
static inline void set_bit(int nr, volatile unsigned long * addr)
{
__asm__ __volatile__( "lock ; "
"btsl %1,%0"
:"=m" (ADDR)
:"Ir" (nr));
}

unsigned long b[2];

int main(int argc, char * const argv[])
{
b[1] = 0x1;
set_bit(12 * sizeof(unsigned long), b);
printf("%08x\n", b[1]);
return 0;
}
--
Chuck
Currently reading: _Sun Of Suns_ by Karl Schroeder
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/