diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-18 15:29:21 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2016-04-19 16:36:51 +0200 |
commit | 76a2110b473c12eb7a9c9e5d15d54309db5f8b9c (patch) | |
tree | bb66d54e37b313f2928f72e739abb25586f50532 /winsup/cygwin/include/machine/_endian.h | |
parent | 7a5b4524431110fde4e9336f64ade73ab2c26b6b (diff) | |
download | cygnal-76a2110b473c12eb7a9c9e5d15d54309db5f8b9c.tar.gz cygnal-76a2110b473c12eb7a9c9e5d15d54309db5f8b9c.tar.bz2 cygnal-76a2110b473c12eb7a9c9e5d15d54309db5f8b9c.zip |
BSD compatibility for <machine/endian.h>
Introduce <machine/_endian.h> to let target based customization of
<machine/endian.h> via
* _LITTLE_ENDIAN,
* _BIG_ENDIAN,
* _PDP_ENDIAN, and
* _BYTE_ORDER.
defines. Add definitions expected by FreeBSD to
<machine/endian.h> like
* _QUAD_HIGHWORD,
* _QUAD_LOWWORD,
* __bswap16(),
* __bswap32(),
* __bswap64(),
* __htonl(),
* __htons(),
* __ntohl(), and
* __ntohs().
Also, if __BSD_VISIBLE
* LITTLE_ENDIAN,
* BIG_ENDIAN,
* PDP_ENDIAN, and
* BYTE_ORDER.
Targets that define __machine_host_to_from_network_defined in
<machine/_endian.h> must provide their own implementation of
* __htonl(),
* __htons(),
* __ntohl(), and
* __ntohs(),
otherwise a default implementation is provided by <machine/endian.h>.
In case of GCC defines to builtins are used.
Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
Diffstat (limited to 'winsup/cygwin/include/machine/_endian.h')
-rw-r--r-- | winsup/cygwin/include/machine/_endian.h | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/winsup/cygwin/include/machine/_endian.h b/winsup/cygwin/include/machine/_endian.h new file mode 100644 index 000000000..d878cc180 --- /dev/null +++ b/winsup/cygwin/include/machine/_endian.h @@ -0,0 +1,45 @@ +/* machine/_endian.h + + Copyright 2005, 2010, 2011 Red Hat, Inc. + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#ifndef __MACHINE_ENDIAN_H__ +#error "must be included via <machine/endian.h>" +#endif /* !__MACHINE_ENDIAN_H__ */ + +#include <_ansi.h> +#include <bits/endian.h> + +#define _LITTLE_ENDIAN __LITTLE_ENDIAN +#define _BIG_ENDIAN __BIG_ENDIAN +#define _PDP_ENDIAN __PDP_ENDIAN +#define _BYTE_ORDER __BYTE_ORDER + +#define __machine_host_to_from_network_defined + +_ELIDABLE_INLINE __uint32_t __ntohl(__uint32_t); +_ELIDABLE_INLINE __uint16_t __ntohs(__uint16_t); + +_ELIDABLE_INLINE __uint32_t +__ntohl(__uint32_t _x) +{ + __asm__("bswap %0" : "=r" (_x) : "0" (_x)); + return _x; +} + +_ELIDABLE_INLINE __uint16_t +__ntohs(__uint16_t _x) +{ + __asm__("xchgb %b0,%h0" /* swap bytes */ + : "=Q" (_x) + : "0" (_x)); + return _x; +} + +#define __htonl(_x) __ntohl(_x) +#define __htons(_x) __ntohs(_x) |