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/libkern/libkern/OSByteOrder.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  * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
    3  *
    4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
    5  * 
    6  * This file contains Original Code and/or Modifications of Original Code
    7  * as defined in and that are subject to the Apple Public Source License
    8  * Version 2.0 (the 'License'). You may not use this file except in
    9  * compliance with the License. The rights granted to you under the License
   10  * may not be used to create, or enable the creation or redistribution of,
   11  * unlawful or unlicensed copies of an Apple operating system, or to
   12  * circumvent, violate, or enable the circumvention or violation of, any
   13  * terms of an Apple operating system software license agreement.
   14  * 
   15  * Please obtain a copy of the License at
   16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
   17  * 
   18  * The Original Code and all software distributed under the License are
   19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
   20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
   21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
   22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
   23  * Please see the License for the specific language governing rights and
   24  * limitations under the License.
   25  * 
   26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
   27  */
   28 
   29 #ifndef _OS_OSBYTEORDER_H
   30 #define _OS_OSBYTEORDER_H
   31 
   32 #include <stdint.h>
   33 #include <libkern/_OSByteOrder.h>
   34 
   35 /* Macros for swapping constant values in the preprocessing stage. */
   36 #define OSSwapConstInt16(x)     __DARWIN_OSSwapConstInt16(x)
   37 #define OSSwapConstInt32(x)     __DARWIN_OSSwapConstInt32(x)
   38 #define OSSwapConstInt64(x)     __DARWIN_OSSwapConstInt64(x)
   39 
   40 #if defined(__GNUC__)
   41 
   42 #if (defined(__ppc__) || defined(__ppc64__))
   43 #include <libkern/ppc/OSByteOrder.h>
   44 #elif (defined(__i386__) || defined(__x86_64__))
   45 #include <libkern/i386/OSByteOrder.h>
   46 #else
   47 #include <libkern/machine/OSByteOrder.h>
   48 #endif
   49 
   50 #else /* ! __GNUC__ */
   51 
   52 #include <libkern/machine/OSByteOrder.h>
   53 
   54 #endif /* __GNUC__ */
   55 
   56 #define OSSwapInt16(x)  __DARWIN_OSSwapInt16(x)
   57 #define OSSwapInt32(x)  __DARWIN_OSSwapInt32(x)
   58 #define OSSwapInt64(x)  __DARWIN_OSSwapInt64(x)
   59 
   60 enum {
   61     OSUnknownByteOrder,
   62     OSLittleEndian,
   63     OSBigEndian
   64 };
   65 
   66 OS_INLINE
   67 int32_t
   68 OSHostByteOrder(void) {
   69 #if defined(__LITTLE_ENDIAN__)
   70     return OSLittleEndian;
   71 #elif defined(__BIG_ENDIAN__)
   72     return OSBigEndian;
   73 #else
   74     return OSUnknownByteOrder;
   75 #endif
   76 }
   77 
   78 #define OSReadBigInt(x, y)              OSReadBigInt32(x, y)
   79 #define OSWriteBigInt(x, y, z)          OSWriteBigInt32(x, y, z)
   80 #define OSSwapBigToHostInt(x)           OSSwapBigToHostInt32(x)
   81 #define OSSwapHostToBigInt(x)           OSSwapHostToBigInt32(x)
   82 #define OSReadLittleInt(x, y)           OSReadLittleInt32(x, y)
   83 #define OSWriteLittleInt(x, y, z)       OSWriteLittleInt32(x, y, z)
   84 #define OSSwapHostToLittleInt(x)        OSSwapHostToLittleInt32(x)
   85 #define OSSwapLittleToHostInt(x)        OSSwapLittleToHostInt32(x)
   86 
   87 /* Functions for loading native endian values. */
   88 
   89 OS_INLINE
   90 uint16_t
   91 _OSReadInt16(
   92     const volatile void               * base,
   93     uintptr_t                     byteOffset
   94 )
   95 {
   96     return *(volatile uint16_t *)((uintptr_t)base + byteOffset);
   97 }
   98 
   99 OS_INLINE
  100 uint32_t
  101 _OSReadInt32(
  102     const volatile void               * base,
  103     uintptr_t                     byteOffset
  104 )
  105 {
  106     return *(volatile uint32_t *)((uintptr_t)base + byteOffset);
  107 }
  108 
  109 OS_INLINE
  110 uint64_t
  111 _OSReadInt64(
  112     const volatile void               * base,
  113     uintptr_t                     byteOffset
  114 )
  115 {
  116     return *(volatile uint64_t *)((uintptr_t)base + byteOffset);
  117 }
  118 
  119 /* Functions for storing native endian values. */
  120 
  121 OS_INLINE
  122 void
  123 _OSWriteInt16(
  124     volatile void               * base,
  125     uintptr_t                     byteOffset,
  126     uint16_t                      data
  127 )
  128 {
  129     *(volatile uint16_t *)((uintptr_t)base + byteOffset) = data;
  130 }
  131 
  132 OS_INLINE
  133 void
  134 _OSWriteInt32(
  135     volatile void               * base,
  136     uintptr_t                     byteOffset,
  137     uint32_t                      data
  138 )
  139 {
  140     *(volatile uint32_t *)((uintptr_t)base + byteOffset) = data;
  141 }
  142 
  143 OS_INLINE
  144 void
  145 _OSWriteInt64(
  146     volatile void               * base,
  147     uintptr_t                     byteOffset,
  148     uint64_t                      data
  149 )
  150 {
  151     *(volatile uint64_t *)((uintptr_t)base + byteOffset) = data;
  152 }
  153 
  154 #if             defined(__BIG_ENDIAN__)
  155 
  156 /* Functions for loading big endian to host endianess. */
  157 
  158 #define OSReadBigInt16(base, byteOffset) _OSReadInt16(base, byteOffset)
  159 #define OSReadBigInt32(base, byteOffset) _OSReadInt32(base, byteOffset)
  160 #define OSReadBigInt64(base, byteOffset) _OSReadInt64(base, byteOffset)
  161 
  162 /* Functions for storing host endianess to big endian. */
  163 
  164 #define OSWriteBigInt16(base, byteOffset, data) _OSWriteInt16(base, byteOffset, data)
  165 #define OSWriteBigInt32(base, byteOffset, data) _OSWriteInt32(base, byteOffset, data)
  166 #define OSWriteBigInt64(base, byteOffset, data) _OSWriteInt64(base, byteOffset, data)
  167 
  168 /* Functions for loading little endian to host endianess. */
  169 
  170 #define OSReadLittleInt16(base, byteOffset) OSReadSwapInt16(base, byteOffset)
  171 #define OSReadLittleInt32(base, byteOffset) OSReadSwapInt32(base, byteOffset)
  172 #define OSReadLittleInt64(base, byteOffset) OSReadSwapInt64(base, byteOffset)
  173 
  174 /* Functions for storing host endianess to little endian. */
  175 
  176 #define OSWriteLittleInt16(base, byteOffset, data) OSWriteSwapInt16(base, byteOffset, data)
  177 #define OSWriteLittleInt32(base, byteOffset, data) OSWriteSwapInt32(base, byteOffset, data)
  178 #define OSWriteLittleInt64(base, byteOffset, data) OSWriteSwapInt64(base, byteOffset, data)
  179 
  180 /* Host endianess to big endian byte swapping macros for constants. */
  181 
  182 #define OSSwapHostToBigConstInt16(x) ((uint16_t)(x))
  183 #define OSSwapHostToBigConstInt32(x) ((uint32_t)(x))
  184 #define OSSwapHostToBigConstInt64(x) ((uint64_t)(x))
  185 
  186 /* Generic host endianess to big endian byte swapping functions. */
  187 
  188 #define OSSwapHostToBigInt16(x) ((uint16_t)(x))
  189 #define OSSwapHostToBigInt32(x) ((uint32_t)(x))
  190 #define OSSwapHostToBigInt64(x) ((uint64_t)(x))
  191 
  192 /* Host endianess to little endian byte swapping macros for constants. */
  193 
  194 #define OSSwapHostToLittleConstInt16(x) OSSwapConstInt16(x)
  195 #define OSSwapHostToLittleConstInt32(x) OSSwapConstInt32(x) 
  196 #define OSSwapHostToLittleConstInt64(x) OSSwapConstInt64(x) 
  197 
  198 /* Generic host endianess to little endian byte swapping functions. */
  199 
  200 #define OSSwapHostToLittleInt16(x) OSSwapInt16(x)
  201 #define OSSwapHostToLittleInt32(x) OSSwapInt32(x)
  202 #define OSSwapHostToLittleInt64(x) OSSwapInt64(x)
  203 
  204 /* Big endian to host endianess byte swapping macros for constants. */
  205     
  206 #define OSSwapBigToHostConstInt16(x) ((uint16_t)(x))
  207 #define OSSwapBigToHostConstInt32(x) ((uint32_t)(x))
  208 #define OSSwapBigToHostConstInt64(x) ((uint64_t)(x))
  209 
  210 /* Generic big endian to host endianess byte swapping functions. */
  211 
  212 #define OSSwapBigToHostInt16(x) ((uint16_t)(x))
  213 #define OSSwapBigToHostInt32(x) ((uint32_t)(x))
  214 #define OSSwapBigToHostInt64(x) ((uint64_t)(x))
  215 
  216 /* Little endian to host endianess byte swapping macros for constants. */
  217    
  218 #define OSSwapLittleToHostConstInt16(x) OSSwapConstInt16(x)
  219 #define OSSwapLittleToHostConstInt32(x) OSSwapConstInt32(x)
  220 #define OSSwapLittleToHostConstInt64(x) OSSwapConstInt64(x)
  221 
  222 /* Generic little endian to host endianess byte swapping functions. */
  223 
  224 #define OSSwapLittleToHostInt16(x) OSSwapInt16(x)
  225 #define OSSwapLittleToHostInt32(x) OSSwapInt32(x)
  226 #define OSSwapLittleToHostInt64(x) OSSwapInt64(x)
  227 
  228 #elif           defined(__LITTLE_ENDIAN__)
  229 
  230 /* Functions for loading big endian to host endianess. */
  231 
  232 #define OSReadBigInt16(base, byteOffset) OSReadSwapInt16(base, byteOffset)
  233 #define OSReadBigInt32(base, byteOffset) OSReadSwapInt32(base, byteOffset)
  234 #define OSReadBigInt64(base, byteOffset) OSReadSwapInt64(base, byteOffset)
  235 
  236 /* Functions for storing host endianess to big endian. */
  237 
  238 #define OSWriteBigInt16(base, byteOffset, data) OSWriteSwapInt16(base, byteOffset, data)
  239 #define OSWriteBigInt32(base, byteOffset, data) OSWriteSwapInt32(base, byteOffset, data)
  240 #define OSWriteBigInt64(base, byteOffset, data) OSWriteSwapInt64(base, byteOffset, data)
  241 
  242 /* Functions for loading little endian to host endianess. */
  243 
  244 #define OSReadLittleInt16(base, byteOffset) _OSReadInt16(base, byteOffset)
  245 #define OSReadLittleInt32(base, byteOffset) _OSReadInt32(base, byteOffset)
  246 #define OSReadLittleInt64(base, byteOffset) _OSReadInt64(base, byteOffset)
  247 
  248 /* Functions for storing host endianess to little endian. */
  249 
  250 #define OSWriteLittleInt16(base, byteOffset, data) _OSWriteInt16(base, byteOffset, data)
  251 #define OSWriteLittleInt32(base, byteOffset, data) _OSWriteInt32(base, byteOffset, data)
  252 #define OSWriteLittleInt64(base, byteOffset, data) _OSWriteInt64(base, byteOffset, data)
  253 
  254 /* Host endianess to big endian byte swapping macros for constants. */
  255 
  256 #define OSSwapHostToBigConstInt16(x) OSSwapConstInt16(x)
  257 #define OSSwapHostToBigConstInt32(x) OSSwapConstInt32(x)
  258 #define OSSwapHostToBigConstInt64(x) OSSwapConstInt64(x)
  259 
  260 /* Generic host endianess to big endian byte swapping functions. */
  261 
  262 #define OSSwapHostToBigInt16(x) OSSwapInt16(x)
  263 #define OSSwapHostToBigInt32(x) OSSwapInt32(x)
  264 #define OSSwapHostToBigInt64(x) OSSwapInt64(x)
  265 
  266 /* Host endianess to little endian byte swapping macros for constants. */
  267 
  268 #define OSSwapHostToLittleConstInt16(x) ((uint16_t)(x))
  269 #define OSSwapHostToLittleConstInt32(x) ((uint32_t)(x))
  270 #define OSSwapHostToLittleConstInt64(x) ((uint64_t)(x)) 
  271 
  272 /* Generic host endianess to little endian byte swapping functions. */
  273 
  274 #define OSSwapHostToLittleInt16(x) ((uint16_t)(x))
  275 #define OSSwapHostToLittleInt32(x) ((uint32_t)(x))
  276 #define OSSwapHostToLittleInt64(x) ((uint64_t)(x))
  277 
  278 /* Big endian to host endianess byte swapping macros for constants. */
  279 
  280 #define OSSwapBigToHostConstInt16(x) OSSwapConstInt16(x)
  281 #define OSSwapBigToHostConstInt32(x) OSSwapConstInt32(x)
  282 #define OSSwapBigToHostConstInt64(x) OSSwapConstInt64(x)
  283 
  284 /* Generic big endian to host endianess byte swapping functions. */
  285 
  286 #define OSSwapBigToHostInt16(x) OSSwapInt16(x)
  287 #define OSSwapBigToHostInt32(x) OSSwapInt32(x)
  288 #define OSSwapBigToHostInt64(x) OSSwapInt64(x)
  289 
  290 /* Little endian to host endianess byte swapping macros for constants. */
  291 
  292 #define OSSwapLittleToHostConstInt16(x) ((uint16_t)(x))
  293 #define OSSwapLittleToHostConstInt32(x) ((uint32_t)(x))
  294 #define OSSwapLittleToHostConstInt64(x) ((uint64_t)(x))
  295 
  296 /* Generic little endian to host endianess byte swapping functions. */
  297 
  298 #define OSSwapLittleToHostInt16(x) ((uint16_t)(x))
  299 #define OSSwapLittleToHostInt32(x) ((uint32_t)(x))
  300 #define OSSwapLittleToHostInt64(x) ((uint64_t)(x))
  301 
  302 #else
  303 #error Unknown endianess.
  304 #endif
  305 
  306 #endif /* ! _OS_OSBYTEORDER_H */
  307 
  308 

Cache object: 438681609efee581ac9b1b8175aed8a5


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