master
  1/*
  2 * Copyright (c) 1999-2023 Apple 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_OSBYTEORDERARM_H
 30#define _OS_OSBYTEORDERARM_H
 31
 32#if defined (__arm__) || defined(__arm64__)
 33
 34#include <stdint.h>
 35#include <libkern/arm/_OSByteOrder.h>
 36#include <sys/_types/_os_inline.h>
 37#include <arm/arch.h> /* for _ARM_ARCH_6 */
 38
 39/* Functions for byte reversed loads. */
 40
 41struct _OSUnalignedU16 {
 42	volatile uint16_t __val;
 43} __attribute__((__packed__));
 44
 45struct _OSUnalignedU32 {
 46	volatile uint32_t __val;
 47} __attribute__((__packed__));
 48
 49struct _OSUnalignedU64 {
 50	volatile uint64_t __val;
 51} __attribute__((__packed__));
 52
 53#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)
 54OS_INLINE
 55uint16_t
 56_OSReadSwapInt16(
 57	const volatile void   * _base,
 58	uintptr_t       _offset
 59	)
 60{
 61	return _OSSwapInt16(((struct _OSUnalignedU16 *)((uintptr_t)_base + _offset))->__val);
 62}
 63#else
 64OS_INLINE
 65uint16_t
 66OSReadSwapInt16(
 67	const volatile void   * _base,
 68	uintptr_t       _offset
 69	)
 70{
 71	return _OSSwapInt16(((struct _OSUnalignedU16 *)((uintptr_t)_base + _offset))->__val);
 72}
 73#endif
 74
 75#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)
 76OS_INLINE
 77uint32_t
 78_OSReadSwapInt32(
 79	const volatile void   * _base,
 80	uintptr_t       _offset
 81	)
 82{
 83	return _OSSwapInt32(((struct _OSUnalignedU32 *)((uintptr_t)_base + _offset))->__val);
 84}
 85#else
 86OS_INLINE
 87uint32_t
 88OSReadSwapInt32(
 89	const volatile void   * _base,
 90	uintptr_t       _offset
 91	)
 92{
 93	return _OSSwapInt32(((struct _OSUnalignedU32 *)((uintptr_t)_base + _offset))->__val);
 94}
 95#endif
 96
 97#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)
 98OS_INLINE
 99uint64_t
100_OSReadSwapInt64(
101	const volatile void   * _base,
102	uintptr_t       _offset
103	)
104{
105	return _OSSwapInt64(((struct _OSUnalignedU64 *)((uintptr_t)_base + _offset))->__val);
106}
107#else
108OS_INLINE
109uint64_t
110OSReadSwapInt64(
111	const volatile void   * _base,
112	uintptr_t       _offset
113	)
114{
115	return _OSSwapInt64(((struct _OSUnalignedU64 *)((uintptr_t)_base + _offset))->__val);
116}
117#endif
118
119/* Functions for byte reversed stores. */
120
121#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)
122OS_INLINE
123void
124_OSWriteSwapInt16(
125	volatile void   * _base,
126	uintptr_t       _offset,
127	uint16_t        _data
128	)
129{
130	((struct _OSUnalignedU16 *)((uintptr_t)_base + _offset))->__val = _OSSwapInt16(_data);
131}
132#else
133OS_INLINE
134void
135OSWriteSwapInt16(
136	volatile void   * _base,
137	uintptr_t       _offset,
138	uint16_t        _data
139	)
140{
141	((struct _OSUnalignedU16 *)((uintptr_t)_base + _offset))->__val = _OSSwapInt16(_data);
142}
143#endif
144
145#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)
146OS_INLINE
147void
148_OSWriteSwapInt32(
149	volatile void   * _base,
150	uintptr_t       _offset,
151	uint32_t        _data
152	)
153{
154	((struct _OSUnalignedU32 *)((uintptr_t)_base + _offset))->__val = _OSSwapInt32(_data);
155}
156#else
157OS_INLINE
158void
159OSWriteSwapInt32(
160	volatile void   * _base,
161	uintptr_t       _offset,
162	uint32_t        _data
163	)
164{
165	((struct _OSUnalignedU32 *)((uintptr_t)_base + _offset))->__val = _OSSwapInt32(_data);
166}
167#endif
168
169#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)
170OS_INLINE
171void
172_OSWriteSwapInt64(
173	volatile void    * _base,
174	uintptr_t        _offset,
175	uint64_t         _data
176	)
177{
178	((struct _OSUnalignedU64 *)((uintptr_t)_base + _offset))->__val = _OSSwapInt64(_data);
179}
180#else
181OS_INLINE
182void
183OSWriteSwapInt64(
184	volatile void    * _base,
185	uintptr_t        _offset,
186	uint64_t         _data
187	)
188{
189	((struct _OSUnalignedU64 *)((uintptr_t)_base + _offset))->__val = _OSSwapInt64(_data);
190}
191#endif
192
193#endif /* defined (__arm__) || defined(__arm64__) */
194
195#endif /* ! _OS_OSBYTEORDERARM_H */