H. Peter Anvin | ad7e906 | 2007-07-11 12:18:40 -0700 | [diff] [blame] | 1 | /* -*- linux-c -*- ------------------------------------------------------- * |
| 2 | * |
| 3 | * Copyright (C) 1991, 1992 Linus Torvalds |
| 4 | * Copyright 2007 rPath, Inc. - All Rights Reserved |
| 5 | * |
| 6 | * This file is part of the Linux kernel, and is made available under |
| 7 | * the terms of the GNU General Public License version 2. |
| 8 | * |
| 9 | * ----------------------------------------------------------------------- */ |
| 10 | |
| 11 | /* |
H. Peter Anvin | ad7e906 | 2007-07-11 12:18:40 -0700 | [diff] [blame] | 12 | * Very simple bitops for the boot code. |
| 13 | */ |
| 14 | |
| 15 | #ifndef BOOT_BITOPS_H |
| 16 | #define BOOT_BITOPS_H |
| 17 | #define _LINUX_BITOPS_H /* Inhibit inclusion of <linux/bitops.h> */ |
| 18 | |
| 19 | static inline int constant_test_bit(int nr, const void *addr) |
| 20 | { |
| 21 | const u32 *p = (const u32 *)addr; |
| 22 | return ((1UL << (nr & 31)) & (p[nr >> 5])) != 0; |
| 23 | } |
| 24 | static inline int variable_test_bit(int nr, const void *addr) |
| 25 | { |
| 26 | u8 v; |
| 27 | const u32 *p = (const u32 *)addr; |
| 28 | |
| 29 | asm("btl %2,%1; setc %0" : "=qm" (v) : "m" (*p), "Ir" (nr)); |
| 30 | return v; |
| 31 | } |
| 32 | |
| 33 | #define test_bit(nr,addr) \ |
| 34 | (__builtin_constant_p(nr) ? \ |
| 35 | constant_test_bit((nr),(addr)) : \ |
| 36 | variable_test_bit((nr),(addr))) |
| 37 | |
| 38 | static inline void set_bit(int nr, void *addr) |
| 39 | { |
| 40 | asm("btsl %1,%0" : "+m" (*(u32 *)addr) : "Ir" (nr)); |
| 41 | } |
| 42 | |
| 43 | #endif /* BOOT_BITOPS_H */ |