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 | |
H. Peter Anvin | 117780e | 2016-06-08 12:38:38 -0700 | [diff] [blame] | 19 | #include <linux/types.h> |
| 20 | |
| 21 | static inline bool constant_test_bit(int nr, const void *addr) |
H. Peter Anvin | ad7e906 | 2007-07-11 12:18:40 -0700 | [diff] [blame] | 22 | { |
| 23 | const u32 *p = (const u32 *)addr; |
| 24 | return ((1UL << (nr & 31)) & (p[nr >> 5])) != 0; |
| 25 | } |
H. Peter Anvin | 117780e | 2016-06-08 12:38:38 -0700 | [diff] [blame] | 26 | static inline bool variable_test_bit(int nr, const void *addr) |
H. Peter Anvin | ad7e906 | 2007-07-11 12:18:40 -0700 | [diff] [blame] | 27 | { |
H. Peter Anvin | 117780e | 2016-06-08 12:38:38 -0700 | [diff] [blame] | 28 | bool v; |
H. Peter Anvin | ad7e906 | 2007-07-11 12:18:40 -0700 | [diff] [blame] | 29 | const u32 *p = (const u32 *)addr; |
| 30 | |
| 31 | asm("btl %2,%1; setc %0" : "=qm" (v) : "m" (*p), "Ir" (nr)); |
| 32 | return v; |
| 33 | } |
| 34 | |
| 35 | #define test_bit(nr,addr) \ |
| 36 | (__builtin_constant_p(nr) ? \ |
| 37 | constant_test_bit((nr),(addr)) : \ |
| 38 | variable_test_bit((nr),(addr))) |
| 39 | |
| 40 | static inline void set_bit(int nr, void *addr) |
| 41 | { |
| 42 | asm("btsl %1,%0" : "+m" (*(u32 *)addr) : "Ir" (nr)); |
| 43 | } |
| 44 | |
| 45 | #endif /* BOOT_BITOPS_H */ |