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/memweight.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 #include <linux/export.h>
    2 #include <linux/bug.h>
    3 #include <linux/bitmap.h>
    4 
    5 /**
    6  * memweight - count the total number of bits set in memory area
    7  * @ptr: pointer to the start of the area
    8  * @bytes: the size of the area
    9  */
   10 size_t memweight(const void *ptr, size_t bytes)
   11 {
   12         size_t ret = 0;
   13         size_t longs;
   14         const unsigned char *bitmap = ptr;
   15 
   16         for (; bytes > 0 && ((unsigned long)bitmap) % sizeof(long);
   17                         bytes--, bitmap++)
   18                 ret += hweight8(*bitmap);
   19 
   20         longs = bytes / sizeof(long);
   21         if (longs) {
   22                 BUG_ON(longs >= INT_MAX / BITS_PER_LONG);
   23                 ret += bitmap_weight((unsigned long *)bitmap,
   24                                 longs * BITS_PER_LONG);
   25                 bytes -= longs * sizeof(long);
   26                 bitmap += longs * sizeof(long);
   27         }
   28         /*
   29          * The reason that this last loop is distinct from the preceding
   30          * bitmap_weight() call is to compute 1-bits in the last region smaller
   31          * than sizeof(long) properly on big-endian systems.
   32          */
   33         for (; bytes > 0; bytes--, bitmap++)
   34                 ret += hweight8(*bitmap);
   35 
   36         return ret;
   37 }
   38 EXPORT_SYMBOL(memweight);

Cache object: cd9ca5c22c1719185d890aec78305d13


[ 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.