17dc9a163SRobert Mustacchi /*
27dc9a163SRobert Mustacchi  * This file and its contents are supplied under the terms of the
37dc9a163SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
47dc9a163SRobert Mustacchi  * You may only use this file in accordance with the terms of version
57dc9a163SRobert Mustacchi  * 1.0 of the CDDL.
67dc9a163SRobert Mustacchi  *
77dc9a163SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
87dc9a163SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
97dc9a163SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
107dc9a163SRobert Mustacchi  */
117dc9a163SRobert Mustacchi 
127dc9a163SRobert Mustacchi /*
137dc9a163SRobert Mustacchi  * Copyright 2016 Joyent, Inc.
147dc9a163SRobert Mustacchi  */
157dc9a163SRobert Mustacchi 
167dc9a163SRobert Mustacchi /*
177dc9a163SRobert Mustacchi  * Test endian(3C).
187dc9a163SRobert Mustacchi  */
197dc9a163SRobert Mustacchi 
207dc9a163SRobert Mustacchi #include <sys/types.h>
217dc9a163SRobert Mustacchi #include <endian.h>
227dc9a163SRobert Mustacchi #include <sys/debug.h>
237dc9a163SRobert Mustacchi 
247dc9a163SRobert Mustacchi #ifndef BIG_ENDIAN
257dc9a163SRobert Mustacchi #error "Missing BIG_ENDIAN definition"
267dc9a163SRobert Mustacchi #endif
277dc9a163SRobert Mustacchi 
287dc9a163SRobert Mustacchi #ifndef LITTLE_ENDIAN
297dc9a163SRobert Mustacchi #error "Missing LITTLE_ENDIAN definition"
307dc9a163SRobert Mustacchi #endif
317dc9a163SRobert Mustacchi 
327dc9a163SRobert Mustacchi static void
endian_fromhost(void)337dc9a163SRobert Mustacchi endian_fromhost(void)
347dc9a163SRobert Mustacchi {
357dc9a163SRobert Mustacchi 	uint16_t val16 = 0x1122;
367dc9a163SRobert Mustacchi 	uint32_t val32 = 0x11223344;
377dc9a163SRobert Mustacchi 	uint64_t val64 = 0x1122334455667788ULL;
387dc9a163SRobert Mustacchi 	uint16_t ebe16, ele16, test16;
397dc9a163SRobert Mustacchi 	uint32_t ebe32, ele32, test32;
407dc9a163SRobert Mustacchi 	uint64_t ebe64, ele64, test64;
417dc9a163SRobert Mustacchi 
42*cc366bfcSRobert Mustacchi #if	defined(_LITTLE_ENDIAN)
437dc9a163SRobert Mustacchi 	ebe16 = 0x2211;
447dc9a163SRobert Mustacchi 	ebe32 = 0x44332211UL;
457dc9a163SRobert Mustacchi 	ebe64 = 0x8877665544332211ULL;
467dc9a163SRobert Mustacchi 	ele16 = 0x1122;
477dc9a163SRobert Mustacchi 	ele32 = 0x11223344UL;
487dc9a163SRobert Mustacchi 	ele64 = 0x1122334455667788ULL;
49*cc366bfcSRobert Mustacchi #elif	defined(_BIG_ENDIAN)
507dc9a163SRobert Mustacchi 	ele16 = 0x2211;
517dc9a163SRobert Mustacchi 	ele32 = 0x44332211UL;
527dc9a163SRobert Mustacchi 	ele64 = 0x8877665544332211ULL;
537dc9a163SRobert Mustacchi 	ebe16 = 0x1122;
547dc9a163SRobert Mustacchi 	ebe32 = 0x11223344UL;
557dc9a163SRobert Mustacchi 	ebe64 = 0x1122334455667788ULL;
567dc9a163SRobert Mustacchi #else
577dc9a163SRobert Mustacchi #error	"Unknown byte order"
587dc9a163SRobert Mustacchi #endif	/* _LITTLE_ENDIAN */
597dc9a163SRobert Mustacchi 
607dc9a163SRobert Mustacchi 	test16 = htobe16(val16);
617dc9a163SRobert Mustacchi 	VERIFY3U(test16, ==, ebe16);
627dc9a163SRobert Mustacchi 	test32 = htobe32(val32);
637dc9a163SRobert Mustacchi 	VERIFY3U(test32, ==, ebe32);
647dc9a163SRobert Mustacchi 	test64 = htobe64(val64);
657dc9a163SRobert Mustacchi 	VERIFY3U(test64, ==, ebe64);
667dc9a163SRobert Mustacchi 
677dc9a163SRobert Mustacchi 	test16 = htole16(val16);
687dc9a163SRobert Mustacchi 	VERIFY3U(test16, ==, ele16);
697dc9a163SRobert Mustacchi 	test32 = htole32(val32);
707dc9a163SRobert Mustacchi 	VERIFY3U(test32, ==, ele32);
717dc9a163SRobert Mustacchi 	test64 = htole64(val64);
727dc9a163SRobert Mustacchi 	VERIFY3U(test64, ==, ele64);
737dc9a163SRobert Mustacchi }
747dc9a163SRobert Mustacchi 
757dc9a163SRobert Mustacchi static void
endian_frombig(void)767dc9a163SRobert Mustacchi endian_frombig(void)
777dc9a163SRobert Mustacchi {
787dc9a163SRobert Mustacchi 	uint16_t val16 = 0x1122;
797dc9a163SRobert Mustacchi 	uint32_t val32 = 0x11223344;
807dc9a163SRobert Mustacchi 	uint64_t val64 = 0x1122334455667788ULL;
817dc9a163SRobert Mustacchi 	uint16_t e16, test16;
827dc9a163SRobert Mustacchi 	uint32_t e32, test32;
837dc9a163SRobert Mustacchi 	uint64_t e64, test64;
847dc9a163SRobert Mustacchi 
85*cc366bfcSRobert Mustacchi #if	defined(_LITTLE_ENDIAN)
867dc9a163SRobert Mustacchi 	e16 = 0x2211;
877dc9a163SRobert Mustacchi 	e32 = 0x44332211UL;
887dc9a163SRobert Mustacchi 	e64 = 0x8877665544332211ULL;
89*cc366bfcSRobert Mustacchi #elif	defined(_BIG_ENDIAN)
907dc9a163SRobert Mustacchi 	e16 = 0x1122;
917dc9a163SRobert Mustacchi 	e32 = 0x11223344UL;
927dc9a163SRobert Mustacchi 	e64 = 0x1122334455667788ULL;
937dc9a163SRobert Mustacchi #else
947dc9a163SRobert Mustacchi #error	"Unknown byte order"
957dc9a163SRobert Mustacchi #endif	/* _LITTLE_ENDIAN */
967dc9a163SRobert Mustacchi 
977dc9a163SRobert Mustacchi 	test16 = be16toh(val16);
987dc9a163SRobert Mustacchi 	VERIFY3U(test16, ==, e16);
997dc9a163SRobert Mustacchi 	test16 = betoh16(val16);
1007dc9a163SRobert Mustacchi 	VERIFY3U(test16, ==, e16);
1017dc9a163SRobert Mustacchi 
1027dc9a163SRobert Mustacchi 	test32 = be32toh(val32);
1037dc9a163SRobert Mustacchi 	VERIFY3U(test32, ==, e32);
1047dc9a163SRobert Mustacchi 	test32 = betoh32(val32);
1057dc9a163SRobert Mustacchi 	VERIFY3U(test32, ==, e32);
1067dc9a163SRobert Mustacchi 
1077dc9a163SRobert Mustacchi 	test64 = be64toh(val64);
1087dc9a163SRobert Mustacchi 	VERIFY3U(test64, ==, e64);
1097dc9a163SRobert Mustacchi 	test64 = betoh64(val64);
1107dc9a163SRobert Mustacchi 	VERIFY3U(test64, ==, e64);
1117dc9a163SRobert Mustacchi }
1127dc9a163SRobert Mustacchi 
1137dc9a163SRobert Mustacchi static void
endian_fromlittle(void)1147dc9a163SRobert Mustacchi endian_fromlittle(void)
1157dc9a163SRobert Mustacchi {
1167dc9a163SRobert Mustacchi 	uint16_t val16 = 0x1122;
1177dc9a163SRobert Mustacchi 	uint32_t val32 = 0x11223344;
1187dc9a163SRobert Mustacchi 	uint64_t val64 = 0x1122334455667788ULL;
1197dc9a163SRobert Mustacchi 	uint16_t e16, test16;
1207dc9a163SRobert Mustacchi 	uint32_t e32, test32;
1217dc9a163SRobert Mustacchi 	uint64_t e64, test64;
1227dc9a163SRobert Mustacchi 
123*cc366bfcSRobert Mustacchi #if	defined(_LITTLE_ENDIAN)
1247dc9a163SRobert Mustacchi 	e16 = 0x1122;
1257dc9a163SRobert Mustacchi 	e32 = 0x11223344UL;
1267dc9a163SRobert Mustacchi 	e64 = 0x1122334455667788ULL;
127*cc366bfcSRobert Mustacchi #elif	defined(_BIG_ENDIAN)
1287dc9a163SRobert Mustacchi 	e16 = 0x2211;
1297dc9a163SRobert Mustacchi 	e32 = 0x44332211UL;
1307dc9a163SRobert Mustacchi 	e64 = 0x8877665544332211ULL;
1317dc9a163SRobert Mustacchi #else
1327dc9a163SRobert Mustacchi #error	"Unknown byte order"
1337dc9a163SRobert Mustacchi #endif	/* _LITTLE_ENDIAN */
1347dc9a163SRobert Mustacchi 
1357dc9a163SRobert Mustacchi 	test16 = le16toh(val16);
1367dc9a163SRobert Mustacchi 	VERIFY3U(test16, ==, e16);
1377dc9a163SRobert Mustacchi 	test16 = letoh16(val16);
1387dc9a163SRobert Mustacchi 	VERIFY3U(test16, ==, e16);
1397dc9a163SRobert Mustacchi 
1407dc9a163SRobert Mustacchi 	test32 = le32toh(val32);
1417dc9a163SRobert Mustacchi 	VERIFY3U(test32, ==, e32);
1427dc9a163SRobert Mustacchi 	test32 = letoh32(val32);
1437dc9a163SRobert Mustacchi 	VERIFY3U(test32, ==, e32);
1447dc9a163SRobert Mustacchi 
1457dc9a163SRobert Mustacchi 	test64 = le64toh(val64);
1467dc9a163SRobert Mustacchi 	VERIFY3U(test64, ==, e64);
1477dc9a163SRobert Mustacchi 	test64 = letoh64(val64);
1487dc9a163SRobert Mustacchi 	VERIFY3U(test64, ==, e64);
1497dc9a163SRobert Mustacchi }
1507dc9a163SRobert Mustacchi 
1517dc9a163SRobert Mustacchi int
main(void)1527dc9a163SRobert Mustacchi main(void)
1537dc9a163SRobert Mustacchi {
1547dc9a163SRobert Mustacchi 	endian_fromhost();
1557dc9a163SRobert Mustacchi 	endian_frombig();
1567dc9a163SRobert Mustacchi 	endian_fromlittle();
1577dc9a163SRobert Mustacchi 	return (0);
1587dc9a163SRobert Mustacchi }
159