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/compat/linuxkpi/common/include/linux/bitfield.h

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 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause
    3  *
    4  * Copyright (c) 2020 The FreeBSD Foundation
    5  *
    6  * This software was developed by Björn Zeeb under sponsorship from
    7  * the FreeBSD Foundation.
    8  *
    9  * Redistribution and use in source and binary forms, with or without
   10  * modification, are permitted provided that the following conditions
   11  * are met:
   12  * 1. Redistributions of source code must retain the above copyright
   13  *    notice, this list of conditions and the following disclaimer.
   14  * 2. Redistributions in binary form must reproduce the above copyright
   15  *    notice, this list of conditions and the following disclaimer in the
   16  *    documentation and/or other materials provided with the distribution.
   17  *
   18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   28  * SUCH DAMAGE.
   29  *
   30  * $FreeBSD$
   31  */
   32 
   33 #ifndef _LINUXKPI_LINUX_BITFIELD_H
   34 #define _LINUXKPI_LINUX_BITFIELD_H
   35 
   36 #include <linux/types.h>
   37 #include <asm/byteorder.h>
   38 
   39 /* Use largest possible type. */
   40 static inline uint64_t ___lsb(uint64_t f) { return (f & -f); }
   41 static inline uint64_t ___bitmask(uint64_t f) { return (f / ___lsb(f)); }
   42 
   43 #define _uX_get_bits(_n)                                                \
   44         static __inline uint ## _n ## _t                                \
   45         u ## _n ## _get_bits(uint ## _n ## _t v, uint ## _n ## _t f)    \
   46         {                                                               \
   47                 return ((v & f) / ___lsb(f));                           \
   48         }
   49 
   50 _uX_get_bits(64)
   51 _uX_get_bits(32)
   52 _uX_get_bits(16)
   53 _uX_get_bits(8)
   54 
   55 #define _leX_get_bits(_n)                                               \
   56         static __inline uint ## _n ## _t                                \
   57         le ## _n ## _get_bits(__le ## _n v, uint ## _n ## _t f)         \
   58         {                                                               \
   59                 return ((le ## _n ## _to_cpu(v) & f) / ___lsb(f));      \
   60         }
   61 
   62 _leX_get_bits(64)
   63 _leX_get_bits(32)
   64 _leX_get_bits(16)
   65 
   66 #define _uX_encode_bits(_n)                                             \
   67         static __inline uint ## _n ## _t                                \
   68         u ## _n ## _encode_bits(uint ## _n ## _t v, uint ## _n ## _t f) \
   69         {                                                               \
   70                 return ((v & ___bitmask(f)) * ___lsb(f));               \
   71         }
   72 
   73 _uX_encode_bits(64)
   74 _uX_encode_bits(32)
   75 _uX_encode_bits(16)
   76 _uX_encode_bits(8)
   77 
   78 #define _leX_encode_bits(_n)                                            \
   79         static __inline uint ## _n ## _t                                \
   80         le ## _n ## _encode_bits(__le ## _n v, uint ## _n ## _t f)      \
   81         {                                                               \
   82                 return (cpu_to_le ## _n((v & ___bitmask(f)) * ___lsb(f))); \
   83         }
   84 
   85 _leX_encode_bits(64)
   86 _leX_encode_bits(32)
   87 _leX_encode_bits(16)
   88 
   89 #define _leXp_replace_bits(_n)                                          \
   90         static __inline void                                            \
   91         le ## _n ## p_replace_bits(uint ## _n ## _t *p,                 \
   92             uint ## _n ## _t v, uint ## _n ## _t f)                     \
   93         {                                                               \
   94                 *p = (*p & ~(cpu_to_le ## _n(f))) |                     \
   95                      le ## _n ## _encode_bits(v, f);                    \
   96         }
   97 
   98 _leXp_replace_bits(64)
   99 _leXp_replace_bits(32)
  100 _leXp_replace_bits(16)
  101 
  102 #define _uXp_replace_bits(_n)                                           \
  103         static __inline void                                            \
  104         u ## _n ## p_replace_bits(uint ## _n ## _t *p,                  \
  105             uint ## _n ## _t v, uint ## _n ## _t f)                     \
  106         {                                                               \
  107                 *p = (*p & ~f) | u ## _n ## _encode_bits(v, f);         \
  108         }
  109 
  110 _uXp_replace_bits(64)
  111 _uXp_replace_bits(32)
  112 _uXp_replace_bits(16)
  113 _uXp_replace_bits(8)
  114 
  115 #define _uX_replace_bits(_n)                                            \
  116         static __inline uint ## _n ## _t                                \
  117         u ## _n ## _replace_bits(uint ## _n ## _t p,                    \
  118             uint ## _n ## _t v, uint ## _n ## _t f)                     \
  119         {                                                               \
  120                 return ((p & ~f) | u ## _n ## _encode_bits(v, f));      \
  121         }
  122 
  123 _uX_replace_bits(64)
  124 _uX_replace_bits(32)
  125 _uX_replace_bits(16)
  126 _uX_replace_bits(8)
  127 
  128 #define __bf_shf(x)     (__builtin_ffsll(x) - 1)
  129 
  130 #define FIELD_PREP(_mask, _value)                                       \
  131         (((typeof(_mask))(_value) << __bf_shf(_mask)) & (_mask))
  132 
  133 #define FIELD_GET(_mask, _value)                                        \
  134         ((typeof(_mask))(((_value) & (_mask)) >> __bf_shf(_mask)))
  135 
  136 #endif  /* _LINUXKPI_LINUX_BITFIELD_H */

Cache object: bd4792aac4d139b7edd828c967d50158


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