1 /* $OpenBSD: endian.h,v 1.21 2014/10/22 23:56:47 dlg 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 _POWERPC_ENDIAN_H_ 28 #define _POWERPC_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 __uint32_t *a = (__uint32_t *)m; 60 __uint64_t v; 61 62 v = (__uint64_t)__mswap32(a + 1) << 32 | 63 (__uint64_t)__mswap32(a); 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 __uint32_t *a = (__uint32_t *)m; 88 89 __swapm32(a + 1, v >> 32); 90 __swapm32(a, v); 91 } 92 93 #define __HAVE_MD_SWAPIO 94 #endif /* _KERNEL */ 95 96 #undef _BIG_ENDIAN /* XXX - gcc may define _BIG_ENDIAN too */ 97 #define _BYTE_ORDER _BIG_ENDIAN 98 99 #ifndef __FROM_SYS__ENDIAN 100 #include <sys/endian.h> 101 #endif 102 103 #endif /* _POWERPC_ENDIAN_H_ */ 104