1 /* $OpenBSD: endian.h,v 1.2 2020/06/08 14:12:00 naddy Exp $ */ 2 3 /*- 4 * Copyright (c) 1997 Niklas Hallqvist. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #ifndef _MACHINE_ENDIAN_H_ 28 #define _MACHINE_ENDIAN_H_ 29 30 #ifdef _KERNEL 31 32 static inline __uint16_t 33 __mswap16(volatile const __uint16_t *m) 34 { 35 __uint16_t v; 36 37 __asm("lhbrx %0, 0, %1" 38 : "=r" (v) 39 : "r" (m), "m" (*m)); 40 41 return (v); 42 } 43 44 static inline __uint32_t 45 __mswap32(volatile const __uint32_t *m) 46 { 47 __uint32_t v; 48 49 __asm("lwbrx %0, 0, %1" 50 : "=r" (v) 51 : "r" (m), "m" (*m)); 52 53 return (v); 54 } 55 56 static inline __uint64_t 57 __mswap64(volatile const __uint64_t *m) 58 { 59 __uint64_t v; 60 61 __asm("ldbrx %0, 0, %1" 62 : "=r" (v) 63 : "r" (m), "m" (*m)); 64 65 return (v); 66 } 67 68 static inline void 69 __swapm16(volatile __uint16_t *m, __uint16_t v) 70 { 71 __asm("sthbrx %1, 0, %2" 72 : "=m" (*m) 73 : "r" (v), "r" (m)); 74 } 75 76 static inline void 77 __swapm32(volatile __uint32_t *m, __uint32_t v) 78 { 79 __asm("stwbrx %1, 0, %2" 80 : "=m" (*m) 81 : "r" (v), "r" (m)); 82 } 83 84 static inline void 85 __swapm64(volatile __uint64_t *m, __uint64_t v) 86 { 87 __asm("stdbrx %1, 0, %2" 88 : "=m" (*m) 89 : "r" (v), "r" (m)); 90 } 91 92 #define __HAVE_MD_SWAPIO 93 #endif /* _KERNEL */ 94 95 #undef _BIG_ENDIAN /* XXX - gcc may define _BIG_ENDIAN too */ 96 #define _BYTE_ORDER _BIG_ENDIAN 97 98 #ifndef __FROM_SYS__ENDIAN 99 #include <sys/endian.h> 100 #endif 101 102 #endif /* _MACHINE_ENDIAN_H_ */ 103