1 /*
2  * Copyright (c) 1987, 1991 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *      from: @(#)endian.h      7.8 (Berkeley) 4/3/91
34  *      $Id$
35  */
36 
37 #ifndef _MACHINE_ENDIAN_H_
38 #define _MACHINE_ENDIAN_H_
39 
40 /*
41  * Define the order of 32-bit words in 64-bit words.
42  */
43 #define _QUAD_HIGHWORD 1
44 #define _QUAD_LOWWORD 0
45 
46 /*
47  * Definitions for byte order, according to byte significance from low
48  * address to high.
49  */
50 
51 #ifndef LITTLE_ENDIAN
52 #define LITTLE_ENDIAN   1234    /* LSB first: i386, vax */
53 #endif
54 
55 #ifndef BIG_ENDIAN
56 #define BIG_ENDIAN      4321    /* MSB first: 68000, ibm, net */
57 #endif
58 
59 #ifndef PDP_ENDIAN
60 #define PDP_ENDIAN      3412    /* LSB first in word, MSW first in long */
61 #endif
62 
63 #ifndef BYTE_ORDER
64 #define BYTE_ORDER      LITTLE_ENDIAN
65 #endif
66 
67 #ifndef KERNEL
68 #include <sys/cdefs.h>
69 #endif
70 
71 #include <sys/types.h>
72 
73 __BEGIN_DECLS
74 unsigned long   htonl __P((unsigned long));
75 unsigned short  htons __P((unsigned short));
76 unsigned long   ntohl __P((unsigned long));
77 unsigned short  ntohs __P((unsigned short));
78 __END_DECLS
79 
80 #define __word_swap_long(x) \
81 __extension__ ({ register u_long __X = (x); \
82    __asm ("rorl $16, %1" \
83         : "=r" (__X) \
84         : "0" (__X)); \
85    __X; })
86 
87 #if defined(KERNEL) && (defined(I486_CPU) || defined(I586_CPU) || defined(I686_CPU)) && !defined(I386_CPU)
88 
89 #define __byte_swap_long(x) \
90 __extension__ ({ register u_long __X = (x); \
91    __asm ("bswap %0" \
92         : "=r" (__X) \
93         : "0" (__X)); \
94    __X; })
95 #else
96 
97 #define __byte_swap_long(x) \
98 __extension__ ({ register u_long __X = (x); \
99    __asm ("xchgb %h1, %b1\n\trorl $16, %1\n\txchgb %h1, %b1" \
100         : "=q" (__X) \
101         : "0" (__X)); \
102    __X; })
103 #endif
104 
105 #define __byte_swap_word(x) \
106 __extension__ ({ register u_short __X = (x); \
107    __asm ("xchgb %h1, %b1" \
108         : "=q" (__X) \
109         : "0" (__X)); \
110    __X; })
111 
112 /*
113  * Macros for network/external number representation conversion.
114  */
115 #ifdef __GNUC__
116 #define ntohl   __byte_swap_long
117 #define ntohs   __byte_swap_word
118 #define htonl   __byte_swap_long
119 #define htons   __byte_swap_word
120 #endif
121 
122 #define NTOHL(x)        ((x) = ntohl((u_long)(x)))
123 #define NTOHS(x)        ((x) = ntohs((u_short)(x)))
124 #define HTONL(x)        ((x) = htonl((u_long)(x)))
125 #define HTONS(x)        ((x) = htons((u_short)(x)))
126 
127 #endif /* !_MACHINE_ENDIAN_H_ */
128