843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER START
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The contents of this file are subject to the terms of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Common Development and Distribution License (the "License").
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You may not use this file except in compliance with the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
843e19887f64dde75055cf8842fc4db2171eff45johnlev * or http://www.opensolaris.org/os/licensing.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * See the License for the specific language governing permissions
843e19887f64dde75055cf8842fc4db2171eff45johnlev * and limitations under the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * When distributing Covered Code, include this CDDL HEADER in each
843e19887f64dde75055cf8842fc4db2171eff45johnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If applicable, add the following below this CDDL HEADER, with the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * fields enclosed by brackets "[]" replaced with your own identifying
843e19887f64dde75055cf8842fc4db2171eff45johnlev * information: Portions Copyright [yyyy] [name of copyright owner]
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER END
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Use is subject to license terms.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Copyright (c) 2015, Joyent, Inc.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab .file "byteorder.s"
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#include "SYS.h"
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab /*
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * NOTE: htonl/ntohl are identical routines, as are htons/ntohs.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * As such, they could be implemented as a single routine, using
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * multiple ALTENTRY/SET_SIZE definitions. We don't do this so
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * that they will have unique addresses, allowing DTrace and
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * other debuggers to tell them apart. With the endian
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * functions we do the same, even though it's similarly
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab * repetitive.
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab */
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
843e19887f64dde75055cf8842fc4db2171eff45johnlev/ unsigned long htonl( hl )
843e19887f64dde75055cf8842fc4db2171eff45johnlev/ unsigned long ntohl( hl )
843e19887f64dde75055cf8842fc4db2171eff45johnlev/ long hl;
843e19887f64dde75055cf8842fc4db2171eff45johnlev/ reverses the byte order of 'long hl'
843e19887f64dde75055cf8842fc4db2171eff45johnlev/
843e19887f64dde75055cf8842fc4db2171eff45johnlev ENTRY(htonl)
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl 4(%esp), %eax / %eax = hl
843e19887f64dde75055cf8842fc4db2171eff45johnlev bswap %eax / reverses the byte order of %eax
843e19887f64dde75055cf8842fc4db2171eff45johnlev ret / return (%eax)
843e19887f64dde75055cf8842fc4db2171eff45johnlev SET_SIZE(htonl)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev ENTRY(ntohl)
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl 4(%esp), %eax / %eax = hl
843e19887f64dde75055cf8842fc4db2171eff45johnlev bswap %eax / reverses the byte order of %eax
843e19887f64dde75055cf8842fc4db2171eff45johnlev ret / return (%eax)
843e19887f64dde75055cf8842fc4db2171eff45johnlev SET_SIZE(ntohl)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/ unsigned short htons( hs )
843e19887f64dde75055cf8842fc4db2171eff45johnlev/ short hs;
843e19887f64dde75055cf8842fc4db2171eff45johnlev/
843e19887f64dde75055cf8842fc4db2171eff45johnlev/ reverses the byte order in hs.
843e19887f64dde75055cf8842fc4db2171eff45johnlev/
843e19887f64dde75055cf8842fc4db2171eff45johnlev ENTRY(htons)
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl 4(%esp), %eax / %eax = hs
843e19887f64dde75055cf8842fc4db2171eff45johnlev bswap %eax / reverses the byte order of %eax
843e19887f64dde75055cf8842fc4db2171eff45johnlev shrl $16, %eax / moves high 16-bit to low 16-bit
843e19887f64dde75055cf8842fc4db2171eff45johnlev ret / return (%eax)
843e19887f64dde75055cf8842fc4db2171eff45johnlev SET_SIZE(htons)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev ENTRY(ntohs)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab movl 4(%esp), %eax / %eax = hs
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab bswap %eax / reverses the byte order of %eax
843e19887f64dde75055cf8842fc4db2171eff45johnlev shrl $16, %eax / moves high 16-bit to low 16-bit
843e19887f64dde75055cf8842fc4db2171eff45johnlev ret / return (%eax)
843e19887f64dde75055cf8842fc4db2171eff45johnlev SET_SIZE(ntohs)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/ uint16_t htobe16(uint16_t in)
843e19887f64dde75055cf8842fc4db2171eff45johnlev/
843e19887f64dde75055cf8842fc4db2171eff45johnlev/ Convert in to big endian, eg. htons()
843e19887f64dde75055cf8842fc4db2171eff45johnlev/
843e19887f64dde75055cf8842fc4db2171eff45johnlev ENTRY(htobe16)
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl 4(%esp), %eax / %eax = hs
843e19887f64dde75055cf8842fc4db2171eff45johnlev bswap %eax / reverses the byte order of %eax
843e19887f64dde75055cf8842fc4db2171eff45johnlev shrl $16, %eax / moves high 16-bit to low 16-bit
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab ret / return (%eax)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab SET_SIZE(htobe16)
5d2eda970e48f8985448151c73e699614ce9f357John Levon
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/ uint32_t htobe32(uint32_t in)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/
5d2eda970e48f8985448151c73e699614ce9f357John Levon/ Convert in to big endian, eg. htonl()
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab ENTRY(htobe32)
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl 4(%esp), %eax / %eax = hl
843e19887f64dde75055cf8842fc4db2171eff45johnlev bswap %eax / reverses the byte order of %eax
843e19887f64dde75055cf8842fc4db2171eff45johnlev ret / return (%eax)
843e19887f64dde75055cf8842fc4db2171eff45johnlev SET_SIZE(htobe32)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
5d2eda970e48f8985448151c73e699614ce9f357John Levon/ uint16_t betoh16(uint16_t in)
843e19887f64dde75055cf8842fc4db2171eff45johnlev/ uint16_t be16toh(uint16_t in)
843e19887f64dde75055cf8842fc4db2171eff45johnlev/
5d2eda970e48f8985448151c73e699614ce9f357John Levon/ Convert in to little endian, eg. ntohs()
5d2eda970e48f8985448151c73e699614ce9f357John Levon/
843e19887f64dde75055cf8842fc4db2171eff45johnlev ENTRY(betoh16)
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl 4(%esp), %eax / %eax = hs
843e19887f64dde75055cf8842fc4db2171eff45johnlev bswap %eax / reverses the byte order of %eax
843e19887f64dde75055cf8842fc4db2171eff45johnlev shrl $16, %eax / moves high 16-bit to low 16-bit
843e19887f64dde75055cf8842fc4db2171eff45johnlev ret / return (%eax)
843e19887f64dde75055cf8842fc4db2171eff45johnlev SET_SIZE(betoh16)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev ENTRY(be16toh)
843e19887f64dde75055cf8842fc4db2171eff45johnlev movl 4(%esp), %eax / %eax = hs
843e19887f64dde75055cf8842fc4db2171eff45johnlev bswap %eax / reverses the byte order of %eax
843e19887f64dde75055cf8842fc4db2171eff45johnlev shrl $16, %eax / moves high 16-bit to low 16-bit
843e19887f64dde75055cf8842fc4db2171eff45johnlev ret / return (%eax)
843e19887f64dde75055cf8842fc4db2171eff45johnlev SET_SIZE(be16toh)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/ uint32_t be32toh(uint32_t in)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/ uint32_t betoh32(uint32_t in)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/ Convert in to little endian, eg. ntohl()
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab/
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab ENTRY(be32toh)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab movl 4(%esp), %eax / %eax = hl
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab bswap %eax / reverses the byte order of %eax
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab ret / return (%eax)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab SET_SIZE(be32toh)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab ENTRY(betoh32)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab movl 4(%esp), %eax / %eax = hl
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab bswap %eax / reverses the byte order of %eax
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab ret / return (%eax)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab SET_SIZE(betoh32)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab