Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/modules/include/libkern/OSByteOrder.h

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(__i386__) || defined(__x86_64__))
43#include <libkern/i386/OSByteOrder.h>
44#elif defined (__arm__)
45#include <libkern/arm/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
60enum {
61 OSUnknownByteOrder,
62 OSLittleEndian,
63 OSBigEndian
64};
65
66OS_INLINE
67int32_t
68OSHostByteOrder(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
89OS_INLINE
90uint16_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
99OS_INLINE
100uint32_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
109OS_INLINE
110uint64_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
121OS_INLINE
122void
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
132OS_INLINE
133void
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
143OS_INLINE
144void
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#ifdefined(__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#elifdefined(__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
309

Archive Download this file

Revision: 2182