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