zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

OSByteOrder.h (4758B) - Raw


      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 
     41 struct _OSUnalignedU16 {
     42 	volatile uint16_t __val;
     43 } __attribute__((__packed__));
     44 
     45 struct _OSUnalignedU32 {
     46 	volatile uint32_t __val;
     47 } __attribute__((__packed__));
     48 
     49 struct _OSUnalignedU64 {
     50 	volatile uint64_t __val;
     51 } __attribute__((__packed__));
     52 
     53 #if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)
     54 OS_INLINE
     55 uint16_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
     64 OS_INLINE
     65 uint16_t
     66 OSReadSwapInt16(
     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)
     76 OS_INLINE
     77 uint32_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
     86 OS_INLINE
     87 uint32_t
     88 OSReadSwapInt32(
     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)
     98 OS_INLINE
     99 uint64_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
    108 OS_INLINE
    109 uint64_t
    110 OSReadSwapInt64(
    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)
    122 OS_INLINE
    123 void
    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
    133 OS_INLINE
    134 void
    135 OSWriteSwapInt16(
    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)
    146 OS_INLINE
    147 void
    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
    157 OS_INLINE
    158 void
    159 OSWriteSwapInt32(
    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)
    170 OS_INLINE
    171 void
    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
    181 OS_INLINE
    182 void
    183 OSWriteSwapInt64(
    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 */