Index: include/Makefile =================================================================== --- include/Makefile +++ include/Makefile @@ -11,8 +11,8 @@ SUBDIR_PARALLEL= INCS= a.out.h ar.h assert.h bitstring.h complex.h cpio.h _ctype.h ctype.h \ db.h \ - dirent.h dlfcn.h elf.h elf-hints.h err.h fmtmsg.h fnmatch.h fstab.h \ - fts.h ftw.h getopt.h glob.h grp.h \ + dirent.h dlfcn.h elf.h elf-hints.h endian.h err.h fmtmsg.h fnmatch.h \ + fstab.h fts.h ftw.h getopt.h glob.h grp.h \ ieeefp.h ifaddrs.h \ inttypes.h iso646.h kenv.h langinfo.h libgen.h limits.h link.h \ locale.h malloc.h malloc_np.h memory.h monetary.h mpool.h mqueue.h \ Index: include/endian.h =================================================================== --- /dev/null +++ include/endian.h @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2021 M Warner Losh + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +/* + * A mostly compatible with Linux/glibc endian.h + */ + +#ifndef _ENDIAN_H_ +#define _ENDIAN_H_ + +/* + * FreeBSD's sys/endian.h is very close to the Linux. Linux doesn't define the + * hto* [bl]*toh macros when there's a strict name space. We request that the + * FreeBSD specific [lb]e{16,32,64}{enc,dec} are omitted as well. + */ +#define __OMIT_ENDIAN_ENCODE_DECODE +#include + +/* + * The bswap* functions cause problems for some Linux code (like mesa), so + * remove them from the name space as well. You need to include sys/endian.h + * directly if you want these to be visible. + */ +#undef bswap16 +#undef bswap32 +#undef bswap64 + +/* + * glibc uses double underscore for these symbols. Define these unconditionally. + * The compiler defines __BYTE_ORDER__ these days, so we don't do anything + * with that. + */ +#define __BIG_ENDIAN _BIG_ENDIAN +#define __BYTE_ORDER _BYTE_ORDER +#define __LITTLE_ENDIAN _LITTLE_ENDIAN +#define __PDP_ENDIAN _PDP_ENDIAN + +/* + * FreeBSD's sys/endian.h and machine/endian.h doesn't define a separate + * byte order for floats. Use the host non-float byte order. + */ +#define __FLOAT_WORD_ORDER _BYTE_ORDER + +/* + * We don't define BIG_ENDI, LITTLE_ENDI, HIGH_HALF and LOW_HALF + * since those appear to be internal to internal to glibc + */ + +#endif /* _ENDIAN_H_ */ Index: sys/sys/endian.h =================================================================== --- sys/sys/endian.h +++ sys/sys/endian.h @@ -55,6 +55,7 @@ #define _UINT64_T_DECLARED #endif +#if __BSD_VISIBLE /* * General byte order swapping functions. */ @@ -97,7 +98,7 @@ #endif /* _BYTE_ORDER == _LITTLE_ENDIAN */ /* Alignment-agnostic encode/decode bytestream to/from little/big endian. */ - +#ifndef __OMIT_ENDIAN_ENCODE_DECODE static __inline uint16_t be16dec(const void *pp) { @@ -203,5 +204,6 @@ le32enc(p, (uint32_t)(u & 0xffffffffU)); le32enc(p + 4, (uint32_t)(u >> 32)); } - +#endif /* __OMIT_ENDIAN_ENCODE_DECODE */ +#endif /* __BSD_VISIBLE */ #endif /* _SYS_ENDIAN_H_ */