X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/de355530ae67247cbd0da700edb3a2a1dae884c2..5ba3f43ea354af8ad55bea84372a2bc834d8757c:/libkern/libkern/OSByteOrder.h diff --git a/libkern/libkern/OSByteOrder.h b/libkern/libkern/OSByteOrder.h index 7509cf040..2a1d1da5d 100644 --- a/libkern/libkern/OSByteOrder.h +++ b/libkern/libkern/OSByteOrder.h @@ -1,44 +1,62 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ - */ -/* - * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. - * - * HISTORY - * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ #ifndef _OS_OSBYTEORDER_H #define _OS_OSBYTEORDER_H -#include +#include +#include -#if defined(__ppc__) -#include -#elif defined(__i386__) +/* Macros for swapping constant values in the preprocessing stage. */ +#define OSSwapConstInt16(x) __DARWIN_OSSwapConstInt16(x) +#define OSSwapConstInt32(x) __DARWIN_OSSwapConstInt32(x) +#define OSSwapConstInt64(x) __DARWIN_OSSwapConstInt64(x) + +#if defined(__GNUC__) + +#if (defined(__i386__) || defined(__x86_64__)) #include +#elif defined (__arm__) || defined(__arm64__) +#include #else #include #endif +#else /* ! __GNUC__ */ + +#include + +#endif /* __GNUC__ */ + +#define OSSwapInt16(x) __DARWIN_OSSwapInt16(x) +#define OSSwapInt32(x) __DARWIN_OSSwapInt32(x) +#define OSSwapInt64(x) __DARWIN_OSSwapInt64(x) + enum { OSUnknownByteOrder, OSLittleEndian, @@ -46,242 +64,130 @@ enum { }; OS_INLINE -UInt32 +int32_t OSHostByteOrder(void) { - UInt32 x = (OSBigEndian << 24) | OSLittleEndian; - return (UInt32)*((UInt8 *)&x); +#if defined(__LITTLE_ENDIAN__) + return OSLittleEndian; +#elif defined(__BIG_ENDIAN__) + return OSBigEndian; +#else + return OSUnknownByteOrder; +#endif } -/* Macros for swapping constant values in the preprocessing stage. */ -#define OSSwapConstInt16(x) ((((x) & 0xff00) >> 8) | (((x) & 0x00ff) << 8)) - -#define OSSwapConstInt32(x) ((OSSwapConstInt16(x) << 16) | \ - (OSSwapConstInt16((x) >> 16))) +#define OSReadBigInt(x, y) OSReadBigInt32(x, y) +#define OSWriteBigInt(x, y, z) OSWriteBigInt32(x, y, z) +#define OSSwapBigToHostInt(x) OSSwapBigToHostInt32(x) +#define OSSwapHostToBigInt(x) OSSwapHostToBigInt32(x) +#define OSReadLittleInt(x, y) OSReadLittleInt32(x, y) +#define OSWriteLittleInt(x, y, z) OSWriteLittleInt32(x, y, z) +#define OSSwapHostToLittleInt(x) OSSwapHostToLittleInt32(x) +#define OSSwapLittleToHostInt(x) OSSwapLittleToHostInt32(x) -#define OSSwapConstInt64(x) ((OSSwapConstInt32(x) << 32) | \ - (OSSwapConstInt32((x) >> 32))) - -#if defined(__BIG_ENDIAN__) - -/* Functions for loading big endian to host endianess. */ +/* Functions for loading native endian values. */ OS_INLINE -UInt -OSReadBigInt( - volatile void * base, - UInt offset +uint16_t +_OSReadInt16( + const volatile void * base, + uintptr_t byteOffset ) { - return *(volatile UInt *)((UInt8 *)base + offset); + return *(volatile uint16_t *)((uintptr_t)base + byteOffset); } OS_INLINE -UInt16 -OSReadBigInt16( - volatile void * base, - UInt offset +uint32_t +_OSReadInt32( + const volatile void * base, + uintptr_t byteOffset ) { - return *(volatile UInt16 *)((UInt8 *)base + offset); + return *(volatile uint32_t *)((uintptr_t)base + byteOffset); } OS_INLINE -UInt32 -OSReadBigInt32( - volatile void * base, - UInt offset +uint64_t +_OSReadInt64( + const volatile void * base, + uintptr_t byteOffset ) { - return *(volatile UInt32 *)((UInt8 *)base + offset); + return *(volatile uint64_t *)((uintptr_t)base + byteOffset); } -OS_INLINE -UInt64 -OSReadBigInt64( - volatile void * base, - UInt offset -) -{ - return *(volatile UInt64 *)((UInt8 *)base + offset); -} - -/* Functions for storing host endianess to big endian. */ +/* Functions for storing native endian values. */ OS_INLINE void -OSWriteBigInt( +_OSWriteInt16( volatile void * base, - UInt offset, - UInt data + uintptr_t byteOffset, + uint16_t data ) { - *(volatile UInt *)((UInt8 *)base + offset) = data; + *(volatile uint16_t *)((uintptr_t)base + byteOffset) = data; } OS_INLINE void -OSWriteBigInt16( +_OSWriteInt32( volatile void * base, - UInt offset, - UInt16 data + uintptr_t byteOffset, + uint32_t data ) { - *(volatile UInt16 *)((UInt8 *)base + offset) = data; + *(volatile uint32_t *)((uintptr_t)base + byteOffset) = data; } OS_INLINE void -OSWriteBigInt32( +_OSWriteInt64( volatile void * base, - UInt offset, - UInt32 data + uintptr_t byteOffset, + uint64_t data ) { - *(volatile UInt32 *)((UInt8 *)base + offset) = data; + *(volatile uint64_t *)((uintptr_t)base + byteOffset) = data; } -OS_INLINE -void -OSWriteBigInt64( - volatile void * base, - UInt offset, - UInt64 data -) -{ - *(volatile UInt64 *)((UInt8 *)base + offset) = data; -} - -/* Functions for loading little endian to host endianess. */ +#if defined(__BIG_ENDIAN__) -OS_INLINE -UInt -OSReadLittleInt( - volatile void * base, - UInt offset -) -{ - return OSReadSwapInt(base, offset); -} +/* Functions for loading big endian to host endianess. */ -OS_INLINE -UInt16 -OSReadLittleInt16( - volatile void * base, - UInt offset -) -{ - return OSReadSwapInt16(base, offset); -} +#define OSReadBigInt16(base, byteOffset) _OSReadInt16(base, byteOffset) +#define OSReadBigInt32(base, byteOffset) _OSReadInt32(base, byteOffset) +#define OSReadBigInt64(base, byteOffset) _OSReadInt64(base, byteOffset) -OS_INLINE -UInt32 -OSReadLittleInt32( - volatile void * base, - UInt offset -) -{ - return OSReadSwapInt32(base, offset); -} +/* Functions for storing host endianess to big endian. */ -OS_INLINE -UInt64 -OSReadLittleInt64( - volatile void * base, - UInt offset -) -{ - return OSReadSwapInt64(base, offset); -} +#define OSWriteBigInt16(base, byteOffset, data) _OSWriteInt16(base, byteOffset, data) +#define OSWriteBigInt32(base, byteOffset, data) _OSWriteInt32(base, byteOffset, data) +#define OSWriteBigInt64(base, byteOffset, data) _OSWriteInt64(base, byteOffset, data) -/* Functions for storing host endianess to little endian. */ +/* Functions for loading little endian to host endianess. */ -OS_INLINE -void -OSWriteLittleInt( - volatile void * base, - UInt offset, - UInt data -) -{ - OSWriteSwapInt(base, offset, data); -} +#define OSReadLittleInt16(base, byteOffset) OSReadSwapInt16(base, byteOffset) +#define OSReadLittleInt32(base, byteOffset) OSReadSwapInt32(base, byteOffset) +#define OSReadLittleInt64(base, byteOffset) OSReadSwapInt64(base, byteOffset) -OS_INLINE -void -OSWriteLittleInt16( - volatile void * base, - UInt offset, - UInt16 data -) -{ - OSWriteSwapInt16(base, offset, data); -} +/* Functions for storing host endianess to little endian. */ -OS_INLINE -void -OSWriteLittleInt32( - volatile void * base, - UInt offset, - UInt32 data -) -{ - OSWriteSwapInt32(base, offset, data); -} - -OS_INLINE -void -OSWriteLittleInt64( - volatile void * base, - UInt offset, - UInt64 data -) -{ - OSWriteSwapInt64(base, offset, data); -} +#define OSWriteLittleInt16(base, byteOffset, data) OSWriteSwapInt16(base, byteOffset, data) +#define OSWriteLittleInt32(base, byteOffset, data) OSWriteSwapInt32(base, byteOffset, data) +#define OSWriteLittleInt64(base, byteOffset, data) OSWriteSwapInt64(base, byteOffset, data) /* Host endianess to big endian byte swapping macros for constants. */ -#define OSSwapHostToBigConstInt16(x) (x) -#define OSSwapHostToBigConstInt32(x) (x) -#define OSSwapHostToBigConstInt64(x) (x) +#define OSSwapHostToBigConstInt16(x) ((uint16_t)(x)) +#define OSSwapHostToBigConstInt32(x) ((uint32_t)(x)) +#define OSSwapHostToBigConstInt64(x) ((uint64_t)(x)) /* Generic host endianess to big endian byte swapping functions. */ -OS_INLINE -UInt -OSSwapHostToBigInt( - UInt data -) -{ - return data; -} - -OS_INLINE -UInt16 -OSSwapHostToBigInt16( - UInt16 data -) -{ - return data; -} - -OS_INLINE -UInt32 -OSSwapHostToBigInt32( - UInt32 data -) -{ - return data; -} - -OS_INLINE -UInt64 -OSSwapHostToBigInt64( - UInt64 data -) -{ - return data; -} +#define OSSwapHostToBigInt16(x) ((uint16_t)(x)) +#define OSSwapHostToBigInt32(x) ((uint32_t)(x)) +#define OSSwapHostToBigInt64(x) ((uint64_t)(x)) /* Host endianess to little endian byte swapping macros for constants. */ @@ -291,85 +197,21 @@ OSSwapHostToBigInt64( /* Generic host endianess to little endian byte swapping functions. */ -OS_INLINE -UInt -OSSwapHostToLittleInt( - UInt data -) -{ - return OSSwapInt(data); -} - -OS_INLINE -UInt16 -OSSwapHostToLittleInt16( - UInt16 data -) -{ - return OSSwapInt16(data); -} - -OS_INLINE -UInt32 -OSSwapHostToLittleInt32( - UInt32 data -) -{ - return OSSwapInt32(data); -} - -OS_INLINE -UInt64 -OSSwapHostToLittleInt64( - UInt64 data -) -{ - return OSSwapInt64(data); -} +#define OSSwapHostToLittleInt16(x) OSSwapInt16(x) +#define OSSwapHostToLittleInt32(x) OSSwapInt32(x) +#define OSSwapHostToLittleInt64(x) OSSwapInt64(x) /* Big endian to host endianess byte swapping macros for constants. */ -#define OSSwapBigToHostConstInt16(x) (x) -#define OSSwapBigToHostConstInt32(x) (x) -#define OSSwapBigToHostConstInt64(x) (x) +#define OSSwapBigToHostConstInt16(x) ((uint16_t)(x)) +#define OSSwapBigToHostConstInt32(x) ((uint32_t)(x)) +#define OSSwapBigToHostConstInt64(x) ((uint64_t)(x)) /* Generic big endian to host endianess byte swapping functions. */ -OS_INLINE -UInt -OSSwapBigToHostInt( - UInt data -) -{ - return data; -} - -OS_INLINE -UInt16 -OSSwapBigToHostInt16( - UInt16 data -) -{ - return data; -} - -OS_INLINE -UInt32 -OSSwapBigToHostInt32( - UInt32 data -) -{ - return data; -} - -OS_INLINE -UInt64 -OSSwapBigToHostInt64( - UInt64 data -) -{ - return data; -} +#define OSSwapBigToHostInt16(x) ((uint16_t)(x)) +#define OSSwapBigToHostInt32(x) ((uint32_t)(x)) +#define OSSwapBigToHostInt64(x) ((uint64_t)(x)) /* Little endian to host endianess byte swapping macros for constants. */ @@ -379,219 +221,35 @@ OSSwapBigToHostInt64( /* Generic little endian to host endianess byte swapping functions. */ -OS_INLINE -UInt -OSSwapLittleToHostInt( - UInt data -) -{ - return OSSwapInt(data); -} - -OS_INLINE -UInt16 -OSSwapLittleToHostInt16( - UInt16 data -) -{ - return OSSwapInt16(data); -} - -OS_INLINE -UInt32 -OSSwapLittleToHostInt32( - UInt32 data -) -{ - return OSSwapInt32(data); -} - -OS_INLINE -UInt64 -OSSwapLittleToHostInt64( - UInt64 data -) -{ - return OSSwapInt64(data); -} +#define OSSwapLittleToHostInt16(x) OSSwapInt16(x) +#define OSSwapLittleToHostInt32(x) OSSwapInt32(x) +#define OSSwapLittleToHostInt64(x) OSSwapInt64(x) #elif defined(__LITTLE_ENDIAN__) /* Functions for loading big endian to host endianess. */ -OS_INLINE -UInt -OSReadBigInt( - volatile void * base, - UInt offset -) -{ - return OSReadSwapInt(base, offset); -} - -OS_INLINE -UInt16 -OSReadBigInt16( - volatile void * base, - UInt offset -) -{ - return OSReadSwapInt16(base, offset); -} - -OS_INLINE -UInt32 -OSReadBigInt32( - volatile void * base, - UInt offset -) -{ - return OSReadSwapInt32(base, offset); -} - -OS_INLINE -UInt64 -OSReadBigInt64( - volatile void * base, - UInt offset -) -{ - return OSReadSwapInt64(base, offset); -} +#define OSReadBigInt16(base, byteOffset) OSReadSwapInt16(base, byteOffset) +#define OSReadBigInt32(base, byteOffset) OSReadSwapInt32(base, byteOffset) +#define OSReadBigInt64(base, byteOffset) OSReadSwapInt64(base, byteOffset) /* Functions for storing host endianess to big endian. */ -OS_INLINE -void -OSWriteBigInt( - volatile void * base, - UInt offset, - UInt data -) -{ - OSWriteSwapInt(base, offset, data); -} - -OS_INLINE -void -OSWriteBigInt16( - volatile void * base, - UInt offset, - UInt16 data -) -{ - OSWriteSwapInt16(base, offset, data); -} - -OS_INLINE -void -OSWriteBigInt32( - volatile void * base, - UInt offset, - UInt32 data -) -{ - OSWriteSwapInt32(base, offset, data); -} - -OS_INLINE -void -OSWriteBigInt64( - volatile void * base, - UInt offset, - UInt64 data -) -{ - OSWriteSwapInt64(base, offset, data); -} +#define OSWriteBigInt16(base, byteOffset, data) OSWriteSwapInt16(base, byteOffset, data) +#define OSWriteBigInt32(base, byteOffset, data) OSWriteSwapInt32(base, byteOffset, data) +#define OSWriteBigInt64(base, byteOffset, data) OSWriteSwapInt64(base, byteOffset, data) /* Functions for loading little endian to host endianess. */ -OS_INLINE -UInt -OSReadLittleInt( - volatile void * base, - UInt offset -) -{ - return *(volatile UInt *)((UInt8 *)base + offset); -} - -OS_INLINE -UInt16 -OSReadLittleInt16( - volatile void * base, - UInt offset -) -{ - return *(volatile UInt16 *)((UInt8 *)base + offset); -} - -OS_INLINE -UInt32 -OSReadLittleInt32( - volatile void * base, - UInt offset -) -{ - return *(volatile UInt32 *)((UInt8 *)base + offset); -} - -OS_INLINE -UInt64 -OSReadLittleInt64( - volatile void * base, - UInt offset -) -{ - return *(volatile UInt64 *)((UInt8 *)base + offset); -} +#define OSReadLittleInt16(base, byteOffset) _OSReadInt16(base, byteOffset) +#define OSReadLittleInt32(base, byteOffset) _OSReadInt32(base, byteOffset) +#define OSReadLittleInt64(base, byteOffset) _OSReadInt64(base, byteOffset) /* Functions for storing host endianess to little endian. */ -OS_INLINE -void -OSWriteLittleInt( - volatile void * base, - UInt offset, - UInt data -) -{ - *(volatile UInt *)((UInt8 *)base + offset) = data; -} - -OS_INLINE -void -OSWriteLittleInt16( - volatile void * base, - UInt offset, - UInt16 data -) -{ - *(volatile UInt16 *)((UInt8 *)base + offset) = data; -} - -OS_INLINE -void -OSWriteLittleInt32( - volatile void * base, - UInt offset, - UInt32 data -) -{ - *(volatile UInt32 *)((UInt8 *)base + offset) = data; -} - -OS_INLINE -void -OSWriteLittleInt64( - volatile void * base, - UInt offset, - UInt64 data -) -{ - *(volatile UInt64 *)((UInt8 *)base + offset) = data; -} +#define OSWriteLittleInt16(base, byteOffset, data) _OSWriteInt16(base, byteOffset, data) +#define OSWriteLittleInt32(base, byteOffset, data) _OSWriteInt32(base, byteOffset, data) +#define OSWriteLittleInt64(base, byteOffset, data) _OSWriteInt64(base, byteOffset, data) /* Host endianess to big endian byte swapping macros for constants. */ @@ -601,85 +259,21 @@ OSWriteLittleInt64( /* Generic host endianess to big endian byte swapping functions. */ -OS_INLINE -UInt -OSSwapHostToBigInt( - UInt data -) -{ - return OSSwapInt(data); -} - -OS_INLINE -UInt16 -OSSwapHostToBigInt16( - UInt16 data -) -{ - return OSSwapInt16(data); -} - -OS_INLINE -UInt32 -OSSwapHostToBigInt32( - UInt32 data -) -{ - return OSSwapInt32(data); -} - -OS_INLINE -UInt64 -OSSwapHostToBigInt64( - UInt64 data -) -{ - return OSSwapInt64(data); -} +#define OSSwapHostToBigInt16(x) OSSwapInt16(x) +#define OSSwapHostToBigInt32(x) OSSwapInt32(x) +#define OSSwapHostToBigInt64(x) OSSwapInt64(x) /* Host endianess to little endian byte swapping macros for constants. */ -#define OSSwapHostToLittleConstInt16(x) (x) -#define OSSwapHostToLittleConstInt32(x) (x) -#define OSSwapHostToLittleConstInt64(x) (x) +#define OSSwapHostToLittleConstInt16(x) ((uint16_t)(x)) +#define OSSwapHostToLittleConstInt32(x) ((uint32_t)(x)) +#define OSSwapHostToLittleConstInt64(x) ((uint64_t)(x)) /* Generic host endianess to little endian byte swapping functions. */ -OS_INLINE -UInt -OSSwapHostToLittleInt( - UInt data -) -{ - return data; -} - -OS_INLINE -UInt16 -OSSwapHostToLittleInt16( - UInt16 data -) -{ - return data; -} - -OS_INLINE -UInt32 -OSSwapHostToLittleInt32( - UInt32 data -) -{ - return data; -} - -OS_INLINE -UInt64 -OSSwapHostToLittleInt64( - UInt64 data -) -{ - return data; -} +#define OSSwapHostToLittleInt16(x) ((uint16_t)(x)) +#define OSSwapHostToLittleInt32(x) ((uint32_t)(x)) +#define OSSwapHostToLittleInt64(x) ((uint64_t)(x)) /* Big endian to host endianess byte swapping macros for constants. */ @@ -689,85 +283,21 @@ OSSwapHostToLittleInt64( /* Generic big endian to host endianess byte swapping functions. */ -OS_INLINE -UInt -OSSwapBigToHostInt( - UInt data -) -{ - return OSSwapInt(data); -} - -OS_INLINE -UInt16 -OSSwapBigToHostInt16( - UInt16 data -) -{ - return OSSwapInt16(data); -} - -OS_INLINE -UInt32 -OSSwapBigToHostInt32( - UInt32 data -) -{ - return OSSwapInt32(data); -} - -OS_INLINE -UInt64 -OSSwapBigToHostInt64( - UInt64 data -) -{ - return OSSwapInt64(data); -} +#define OSSwapBigToHostInt16(x) OSSwapInt16(x) +#define OSSwapBigToHostInt32(x) OSSwapInt32(x) +#define OSSwapBigToHostInt64(x) OSSwapInt64(x) /* Little endian to host endianess byte swapping macros for constants. */ -#define OSSwapLittleToHostConstInt16(x) (x) -#define OSSwapLittleToHostConstInt32(x) (x) -#define OSSwapLittleToHostConstInt64(x) (x) +#define OSSwapLittleToHostConstInt16(x) ((uint16_t)(x)) +#define OSSwapLittleToHostConstInt32(x) ((uint32_t)(x)) +#define OSSwapLittleToHostConstInt64(x) ((uint64_t)(x)) /* Generic little endian to host endianess byte swapping functions. */ -OS_INLINE -UInt -OSSwapLittleToHostInt( - UInt data -) -{ - return data; -} - -OS_INLINE -UInt16 -OSSwapLittleToHostInt16( - UInt16 data -) -{ - return data; -} - -OS_INLINE -UInt32 -OSSwapLittleToHostInt32( - UInt32 data -) -{ - return data; -} - -OS_INLINE -UInt64 -OSSwapLittleToHostInt64( - UInt64 data -) -{ - return data; -} +#define OSSwapLittleToHostInt16(x) ((uint16_t)(x)) +#define OSSwapLittleToHostInt32(x) ((uint32_t)(x)) +#define OSSwapLittleToHostInt64(x) ((uint64_t)(x)) #else #error Unknown endianess.