1/* find_last_bit.c: fallback find next bit implementation 2 * 3 * Copyright (C) 2008 IBM Corporation 4 * Written by Rusty Russell <rusty@rustcorp.com.au> 5 * (Inspired by David Howell's find_next_bit implementation) 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 10 * 2 of the License, or (at your option) any later version. 11 */ 12 13#include <linux/bitops.h> 14#include <linux/export.h> 15#include <asm/types.h> 16#include <asm/byteorder.h> 17 18#ifndef find_last_bit 19 20unsigned long find_last_bit(const unsigned long *addr, unsigned long size) 21{ 22 unsigned long words; 23 unsigned long tmp; 24 25 /* Start at final word. */ 26 words = size / BITS_PER_LONG; 27 28 /* Partial final word? */ 29 if (size & (BITS_PER_LONG-1)) { 30 tmp = (addr[words] & (~0UL >> (BITS_PER_LONG 31 - (size & (BITS_PER_LONG-1))))); 32 if (tmp) 33 goto found; 34 } 35 36 while (words) { 37 tmp = addr[--words]; 38 if (tmp) { 39found: 40 return words * BITS_PER_LONG + __fls(tmp); 41 } 42 } 43 44 /* Not found */ 45 return size; 46} 47EXPORT_SYMBOL(find_last_bit); 48 49#endif 50