The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/lib/find_last_bit.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 
   20 unsigned 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) {
   39 found:
   40                         return words * BITS_PER_LONG + __fls(tmp);
   41                 }
   42         }
   43 
   44         /* Not found */
   45         return size;
   46 }
   47 EXPORT_SYMBOL(find_last_bit);
   48 
   49 #endif

Cache object: 86936619d7dd735c8ae7d292d2d40aa8


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.