Rev 422 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 1 | #ifndef _ASM_GENERIC_BITOPS_H_ |
2 | #define _ASM_GENERIC_BITOPS_H_ |
||
3 | |||
4 | /* |
||
5 | * For the benefit of those who are trying to port Linux to another |
||
6 | * architecture, here are some C-language equivalents. You should |
||
7 | * recode these in the native assembly language, if at all possible. |
||
8 | * To guarantee atomicity, these routines call cli() and sti() to |
||
9 | * disable interrupts while they operate. (You have to provide inline |
||
10 | * routines to cli() and sti().) |
||
11 | * |
||
12 | * Also note, these routines assume that you have 32 bit longs. |
||
13 | * You will have to change this if you are trying to port Linux to the |
||
14 | * Alpha architecture or to a Cray. :-) |
||
15 | * |
||
16 | * C language equivalents written by Theodore Ts'o, 9/26/92 |
||
17 | */ |
||
18 | |||
19 | extern __inline__ int set_bit(int nr,long * addr) |
||
20 | { |
||
21 | int mask, retval; |
||
22 | |||
23 | addr += nr >> 5; |
||
24 | mask = 1 << (nr & 0x1f); |
||
25 | cli(); |
||
26 | retval = (mask & *addr) != 0; |
||
27 | *addr |= mask; |
||
28 | sti(); |
||
29 | return retval; |
||
30 | } |
||
31 | |||
32 | extern __inline__ int clear_bit(int nr, long * addr) |
||
33 | { |
||
34 | int mask, retval; |
||
35 | |||
36 | addr += nr >> 5; |
||
37 | mask = 1 << (nr & 0x1f); |
||
38 | cli(); |
||
39 | retval = (mask & *addr) != 0; |
||
40 | *addr &= ~mask; |
||
41 | sti(); |
||
42 | return retval; |
||
43 | } |
||
44 | |||
45 | extern __inline__ int test_bit(int nr, long * addr) |
||
46 | { |
||
47 | int mask; |
||
48 | |||
49 | addr += nr >> 5; |
||
50 | mask = 1 << (nr & 0x1f); |
||
51 | return ((mask & *addr) != 0); |
||
52 | } |
||
53 | |||
54 | /* |
||
55 | * fls: find last bit set. |
||
56 | */ |
||
57 | |||
58 | #define fls(x) generic_fls(x) |
||
59 | |||
60 | #ifdef __KERNEL__ |
||
61 | |||
62 | /* |
||
63 | * ffs: find first bit set. This is defined the same way as |
||
64 | * the libc and compiler builtin ffs routines, therefore |
||
65 | * differs in spirit from the above ffz (man ffs). |
||
66 | */ |
||
67 | |||
68 | #define ffs(x) generic_ffs(x) |
||
69 | |||
70 | /* |
||
71 | * hweightN: returns the hamming weight (i.e. the number |
||
72 | * of bits set) of a N-bit word |
||
73 | */ |
||
74 | |||
75 | #define hweight32(x) generic_hweight32(x) |
||
76 | #define hweight16(x) generic_hweight16(x) |
||
77 | #define hweight8(x) generic_hweight8(x) |
||
78 | |||
79 | #endif /* __KERNEL__ */ |
||
80 | |||
81 | #endif /* _ASM_GENERIC_BITOPS_H */ |