Print this page
5007142 Add ntohll and htonll to sys/byteorder.h
6717509 Need to use bswap/bswapq for byte swap of 64-bit integer on x32/x64
PSARC 2008/474
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/uts/intel/asm/byteorder.h
+++ new/usr/src/uts/intel/asm/byteorder.h
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 - * Common Development and Distribution License, Version 1.0 only
6 - * (the "License"). You may not use this file except in compliance
7 - * with the License.
5 + * Common Development and Distribution License (the "License").
6 + * You may not use this file except in compliance with the License.
8 7 *
9 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 9 * or http://www.opensolaris.org/os/licensing.
11 10 * See the License for the specific language governing permissions
12 11 * and limitations under the License.
13 12 *
14 13 * When distributing Covered Code, include this CDDL HEADER in each
15 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 15 * If applicable, add the following below this CDDL HEADER, with the
17 16 * fields enclosed by brackets "[]" replaced with your own identifying
18 17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 18 *
20 19 * CDDL HEADER END
21 20 */
22 21 /*
23 - * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
22 + * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 23 * Use is subject to license terms.
25 24 */
26 25
27 26 #ifndef _ASM_BYTEORDER_H
28 27 #define _ASM_BYTEORDER_H
29 28
30 -#pragma ident "%Z%%M% %I% %E% SMI"
31 -
32 29 #include <sys/types.h>
33 30
34 31 #ifdef __cplusplus
35 32 extern "C" {
36 33 #endif
37 34
38 35 #if !defined(__lint) && defined(__GNUC__)
39 36
40 -#if defined(__i386) || defined(__amd64)
37 +/*
38 + * htonll(), ntohll(), htonl(), ntohl(), htons(), ntohs()
39 + * These functions reverse the byte order of the input parameter and returns
40 + * the result. This is to convert the byte order from host byte order
41 + * (little endian) to network byte order (big endian), or vice versa.
42 + */
41 43
42 -extern __inline__ uint32_t htonl(uint32_t value)
43 -{
44 - __asm__("bswap %0" : "+r" (value));
45 - return (value);
46 -}
47 44
48 -extern __inline__ uint32_t ntohl(uint32_t value)
49 -{
50 - __asm__("bswap %0" : "+r" (value));
51 - return (value);
52 -}
45 +#if defined(__i386) || defined(__amd64)
53 46
54 47 extern __inline__ uint16_t htons(uint16_t value)
55 48 {
56 49 #if defined(__amd64)
57 50 __asm__("xchgb %h0, %b0" : "+Q" (value));
58 51 #elif defined(__i386)
59 52 __asm__("xchgb %h0, %b0" : "+q" (value));
60 53 #endif
61 54 return (value);
62 55 }
63 56
↓ open down ↓ |
1 lines elided |
↑ open up ↑ |
64 57 extern __inline__ uint16_t ntohs(uint16_t value)
65 58 {
66 59 #if defined(__amd64)
67 60 __asm__("xchgb %h0, %b0" : "+Q" (value));
68 61 #elif defined(__i386)
69 62 __asm__("xchgb %h0, %b0" : "+q" (value));
70 63 #endif
71 64 return (value);
72 65 }
73 66
67 +extern __inline__ uint32_t htonl(uint32_t value)
68 +{
69 + __asm__("bswap %0" : "+r" (value));
70 + return (value);
71 +}
72 +
73 +extern __inline__ uint32_t ntohl(uint32_t value)
74 +{
75 + __asm__("bswap %0" : "+r" (value));
76 + return (value);
77 +}
78 +
79 +#if defined(__amd64)
80 +extern __inline__ uint64_t htonll(uint64_t value)
81 +{
82 + __asm__("bswapq %0" : "+r" (value));
83 + return (value);
84 +}
85 +
86 +extern __inline__ uint64_t ntohll(uint64_t value)
87 +{
88 + __asm__("bswapq %0" : "+r" (value));
89 + return (value);
90 +}
91 +
92 +#elif defined(__i386)
93 +/* Use the htonl() and ntohl() inline functions defined above */
94 +extern __inline__ uint64_t htonll(uint64_t value)
95 +{
96 + return (htonl(value >> 32) | ((uint64_t)htonl(value) << 32));
97 +}
98 +
99 +extern __inline__ uint64_t ntohll(uint64_t value)
100 +{
101 + return (ntohl(value >> 32) | (uint64_t)ntohl(value) << 32);
102 +}
103 +#endif /* __amd64 */
104 +
74 105 #endif /* __i386 || __amd64 */
75 106
76 107 #endif /* !__lint && __GNUC__ */
77 108
78 109 #ifdef __cplusplus
79 110 }
80 111 #endif
81 112
82 113 #endif /* _ASM_BYTEORDER_H */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX