Index: sys/arch/amd64/include/endian.h =================================================================== RCS file: /mount/openbsd/cvs/src/sys/arch/amd64/include/endian.h,v diff -u -p -u -p -r1.8 endian.h --- sys/arch/amd64/include/endian.h 7 May 2024 14:26:48 -0000 1.8 +++ sys/arch/amd64/include/endian.h 14 May 2024 23:02:16 -0000 @@ -27,6 +27,34 @@ #ifndef _MACHINE_ENDIAN_H_ #define _MACHINE_ENDIAN_H_ +#ifndef __FROM_SYS__ENDIAN +#include +#endif + +static __inline __uint16_t +__swap16md(__uint16_t _x) +{ + __asm ("rorw $8, %w0" : "+r" (_x)); + return (_x); +} + +static __inline __uint32_t +__swap32md(__uint32_t _x) +{ + __asm ("bswap %0" : "+r" (_x)); + return (_x); +} + +static __inline __uint64_t +__swap64md(__uint64_t _x) +{ + __asm ("bswapq %0" : "+r" (_x)); + return (_x); +} + +/* Tell sys/endian.h we have MD variants of the swap macros. */ +#define __HAVE_MD_SWAP + #define _BYTE_ORDER _LITTLE_ENDIAN #ifndef __FROM_SYS__ENDIAN Index: sys/arch/arm/include/endian.h =================================================================== RCS file: /mount/openbsd/cvs/src/sys/arch/arm/include/endian.h,v diff -u -p -u -p -r1.12 endian.h --- sys/arch/arm/include/endian.h 7 May 2024 14:26:48 -0000 1.12 +++ sys/arch/arm/include/endian.h 14 May 2024 23:02:16 -0000 @@ -19,11 +19,48 @@ #ifndef _ARM_ENDIAN_H_ #define _ARM_ENDIAN_H_ +#ifndef __FROM_SYS__ENDIAN +#include +#endif + +static __inline __uint16_t +__swap16md(__uint16_t _x) +{ + __uint16_t _rv; + + __asm ("rev16 %0, %1" : "=r" (_rv) : "r" (_x)); + + return (_rv); +} + +static __inline __uint32_t +__swap32md(__uint32_t _x) +{ + __uint32_t _rv; + + __asm ("rev %0, %1" : "=r" (_rv) : "r" (_x)); + + return (_rv); +} + +static __inline __uint64_t +__swap64md(__uint64_t _x) +{ + __uint64_t _rv; + + _rv = (__uint64_t)__swap32md(_x >> 32) | + (__uint64_t)__swap32md(_x) << 32; + + return (_rv); +} + +/* Tell sys/endian.h we have MD variants of the swap macros. */ +#define __HAVE_MD_SWAP + #define _BYTE_ORDER _LITTLE_ENDIAN #define __STRICT_ALIGNMENT #ifndef __FROM_SYS__ENDIAN #include #endif - #endif /* _ARM_ENDIAN_H_ */ Index: sys/arch/arm64/include/endian.h =================================================================== RCS file: /mount/openbsd/cvs/src/sys/arch/arm64/include/endian.h,v diff -u -p -u -p -r1.4 endian.h --- sys/arch/arm64/include/endian.h 7 May 2024 14:26:48 -0000 1.4 +++ sys/arch/arm64/include/endian.h 14 May 2024 23:02:16 -0000 @@ -19,11 +19,48 @@ #ifndef _MACHINE_ENDIAN_H_ #define _MACHINE_ENDIAN_H_ +#ifndef __FROM_SYS__ENDIAN +#include +#endif + +static __inline __uint16_t +__swap16md(__uint16_t _x) +{ + __uint16_t _rv; + + __asm ("rev16 %w0, %w1" : "=r" (_rv) : "r"(_x)); + + return (_rv); +} + +static __inline __uint32_t +__swap32md(__uint32_t _x) +{ + __uint32_t _rv; + + __asm ("rev %w0, %w1" : "=r" (_rv) : "r"(_x)); + + return (_rv); +} + +static __inline __uint64_t +__swap64md(__uint64_t _x) +{ + __uint64_t _rv; + + __asm ("rev %x0, %x1" : "=r" (_rv) : "r"(_x)); + + return (_rv); +} + +/* Tell sys/endian.h we have MD variants of the swap macros. */ +#define __HAVE_MD_SWAP + + #define _BYTE_ORDER _LITTLE_ENDIAN #define __STRICT_ALIGNMENT #ifndef __FROM_SYS__ENDIAN #include #endif - #endif /* _MACHINE_ENDIAN_H_ */ Index: sys/arch/i386/include/endian.h =================================================================== RCS file: /mount/openbsd/cvs/src/sys/arch/i386/include/endian.h,v diff -u -p -u -p -r1.20 endian.h --- sys/arch/i386/include/endian.h 7 May 2024 14:26:48 -0000 1.20 +++ sys/arch/i386/include/endian.h 14 May 2024 23:02:16 -0000 @@ -27,6 +27,34 @@ #ifndef _MACHINE_ENDIAN_H_ #define _MACHINE_ENDIAN_H_ +#ifndef __FROM_SYS__ENDIAN +#include +#endif + +static __inline __uint16_t +__swap16md(__uint16_t _x) +{ + __asm ("rorw $8, %w0" : "+r" (_x)); + return (_x); +} + +static __inline __uint32_t +__swap32md(__uint32_t _x) +{ + __asm ("bswap %0" : "+r" (_x)); + return (_x); +} + +static __inline __uint64_t +__swap64md(__uint64_t _x) +{ + return ((__uint64_t)__swap32md(_x >> 32) | + (__uint64_t)__swap32md(_x & 0xffffffff) << 32); +} + +/* Tell sys/endian.h we have MD variants of the swap macros. */ +#define __HAVE_MD_SWAP + #define _BYTE_ORDER _LITTLE_ENDIAN #ifndef __FROM_SYS__ENDIAN Index: sys/arch/powerpc/include/endian.h =================================================================== RCS file: /mount/openbsd/cvs/src/sys/arch/powerpc/include/endian.h,v diff -u -p -u -p -r1.22 endian.h --- sys/arch/powerpc/include/endian.h 7 May 2024 14:26:48 -0000 1.22 +++ sys/arch/powerpc/include/endian.h 14 May 2024 23:02:16 -0000 @@ -27,6 +27,72 @@ #ifndef _POWERPC_ENDIAN_H_ #define _POWERPC_ENDIAN_H_ +#ifdef _KERNEL + +static inline __uint16_t +__mswap16(volatile const __uint16_t *m) +{ + __uint16_t v; + + __asm("lhbrx %0, 0, %1" + : "=r" (v) + : "r" (m), "m" (*m)); + + return (v); +} + +static inline __uint32_t +__mswap32(volatile const __uint32_t *m) +{ + __uint32_t v; + + __asm("lwbrx %0, 0, %1" + : "=r" (v) + : "r" (m), "m" (*m)); + + return (v); +} + +static inline __uint64_t +__mswap64(volatile const __uint64_t *m) +{ + __uint32_t *a = (__uint32_t *)m; + __uint64_t v; + + v = (__uint64_t)__mswap32(a + 1) << 32 | + (__uint64_t)__mswap32(a); + + return (v); +} + +static inline void +__swapm16(volatile __uint16_t *m, __uint16_t v) +{ + __asm("sthbrx %1, 0, %2" + : "=m" (*m) + : "r" (v), "r" (m)); +} + +static inline void +__swapm32(volatile __uint32_t *m, __uint32_t v) +{ + __asm("stwbrx %1, 0, %2" + : "=m" (*m) + : "r" (v), "r" (m)); +} + +static inline void +__swapm64(volatile __uint64_t *m, __uint64_t v) +{ + __uint32_t *a = (__uint32_t *)m; + + __swapm32(a + 1, v >> 32); + __swapm32(a, v); +} + +#define __HAVE_MD_SWAPIO +#endif /* _KERNEL */ + #undef _BIG_ENDIAN /* XXX - gcc may define _BIG_ENDIAN too */ #define _BYTE_ORDER _BIG_ENDIAN Index: sys/arch/powerpc64/include/endian.h =================================================================== RCS file: /mount/openbsd/cvs/src/sys/arch/powerpc64/include/endian.h,v diff -u -p -u -p -r1.3 endian.h --- sys/arch/powerpc64/include/endian.h 7 May 2024 14:26:48 -0000 1.3 +++ sys/arch/powerpc64/include/endian.h 14 May 2024 23:02:16 -0000 @@ -27,6 +27,71 @@ #ifndef _MACHINE_ENDIAN_H_ #define _MACHINE_ENDIAN_H_ +#ifdef _KERNEL + +static inline __uint16_t +__mswap16(volatile const __uint16_t *m) +{ + __uint16_t v; + + __asm("lhbrx %0, 0, %1" + : "=r" (v) + : "r" (m), "m" (*m)); + + return (v); +} + +static inline __uint32_t +__mswap32(volatile const __uint32_t *m) +{ + __uint32_t v; + + __asm("lwbrx %0, 0, %1" + : "=r" (v) + : "r" (m), "m" (*m)); + + return (v); +} + +static inline __uint64_t +__mswap64(volatile const __uint64_t *m) +{ + __uint64_t v; + + __asm("ldbrx %0, 0, %1" + : "=r" (v) + : "r" (m), "m" (*m)); + + return (v); +} + +static inline void +__swapm16(volatile __uint16_t *m, __uint16_t v) +{ + __asm("sthbrx %1, 0, %2" + : "=m" (*m) + : "r" (v), "r" (m)); +} + +static inline void +__swapm32(volatile __uint32_t *m, __uint32_t v) +{ + __asm("stwbrx %1, 0, %2" + : "=m" (*m) + : "r" (v), "r" (m)); +} + +static inline void +__swapm64(volatile __uint64_t *m, __uint64_t v) +{ + __asm("stdbrx %1, 0, %2" + : "=m" (*m) + : "r" (v), "r" (m)); +} + +#define __HAVE_MD_SWAPIO +#endif /* _KERNEL */ + #undef _BIG_ENDIAN /* XXX - gcc may define _BIG_ENDIAN too */ #define _BYTE_ORDER _BIG_ENDIAN