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/OSCrossEndian.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 /*
   30  * This private header exports 3 APIs.
   31  *      _OSRosettaCheck() -     An inline function that returns true if we are
   32  *                              currently running under Rosetta.
   33  *      IF_ROSETTA() -          Which is used to as a regular conditional
   34  *                              expression that is true only if the current
   35  *                              code is executing in the Rosetta
   36  *                              translation space.
   37  *      ROSETTA_ONLY(exprs) -   Which is used to create a block code that only
   38  *                              executes if we are running in Rosetta.
   39  *
   40  * for example
   41  *
   42  * IF_ROSETTA() {
   43  *      // Do Cross endian swapping of input data
   44  *      outdata = OSSwap??(indata);
   45  * }
   46  * else {
   47  *      // Do straight through 
   48  *      outdata = indata;
   49  * }
   50  *
   51  * outdata = indata;
   52  * ROSETTA_ONLY(
   53  *      // Do Cross endian swapping of input data
   54  *      outdata = OSSwap??(outdata);
   55  * );
   56  */
   57 
   58 #ifndef _LIBKERN_OSCROSSENDIAN_H
   59 #define _LIBKERN_OSCROSSENDIAN_H
   60 
   61 #include <sys/sysctl.h>
   62 
   63 #if __ppc__
   64 
   65 static __inline__ int
   66 _OSRosettaCheck(void)
   67 {
   68         int isCrossEndian = 0;
   69         int val = 0;
   70         size_t size = sizeof val;
   71 
   72         if (sysctlbyname("sysctl.proc_native", &val, &size, NULL, 0) == -1)
   73                 isCrossEndian = 0;
   74         else
   75                 isCrossEndian = val ? 0 : 1;
   76 
   77         return isCrossEndian;
   78 }
   79 
   80 #else /* __ppc__ */
   81 
   82 static __inline__ int _OSRosettaCheck(void) { return 0; }
   83 
   84 #endif /* __ppc__ */
   85 
   86 #define IF_ROSETTA() if (__builtin_expect(_OSRosettaCheck(), 0) )
   87 
   88 #define ROSETTA_ONLY(exprs)     \
   89 do {                            \
   90     IF_ROSETTA() {              \
   91         exprs                   \
   92     }                           \
   93 } while(0)
   94 
   95 #endif /*  _LIBKERN_OSCROSSENDIAN_H */

Cache object: a18cd91c13b2a78be792a3febc0aa182


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