rjw | 1f88458 | 2022-01-06 17:20:42 +0800 | [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 | /* |
| 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 | #include <linux/types.h> |
| 20 | |
| 21 | static inline bool constant_test_bit(int nr, const void *addr) |
| 22 | { |
| 23 | const u32 *p = (const u32 *)addr; |
| 24 | return ((1UL << (nr & 31)) & (p[nr >> 5])) != 0; |
| 25 | } |
| 26 | static inline bool variable_test_bit(int nr, const void *addr) |
| 27 | { |
| 28 | bool v; |
| 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 */ |