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  }
↓ 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