1*ac77b262SWarner Losh /*-
2*ac77b262SWarner Losh * Copyright (c) 2021 M. Warner Losh <imp@FreeBSD.org>
3*ac77b262SWarner Losh *
4*ac77b262SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
5*ac77b262SWarner Losh */
6*ac77b262SWarner Losh
7*ac77b262SWarner Losh #include <endian.h>
8*ac77b262SWarner Losh
9*ac77b262SWarner Losh #include <atf-c.h>
10*ac77b262SWarner Losh
11*ac77b262SWarner Losh ATF_TC(endian);
ATF_TC_HEAD(endian,tc)12*ac77b262SWarner Losh ATF_TC_HEAD(endian, tc)
13*ac77b262SWarner Losh {
14*ac77b262SWarner Losh atf_tc_set_md_var(tc, "descr", "Test swapping macros in <byteswap.h>");
15*ac77b262SWarner Losh }
16*ac77b262SWarner Losh
ATF_TC_BODY(endian,tc)17*ac77b262SWarner Losh ATF_TC_BODY(endian, tc)
18*ac77b262SWarner Losh {
19*ac77b262SWarner Losh /* glibc doesn't define the {__,}bswap_{16,32,64} */
20*ac77b262SWarner Losh #ifdef __bswap_16
21*ac77b262SWarner Losh atf_tc_fail_nonfatal("__bswap_16 improperly defined");
22*ac77b262SWarner Losh #endif
23*ac77b262SWarner Losh #ifdef bswap_16
24*ac77b262SWarner Losh atf_tc_fail_nonfatal("bswap_16 improperly defined");
25*ac77b262SWarner Losh #endif
26*ac77b262SWarner Losh #ifdef __bswap_32
27*ac77b262SWarner Losh atf_tc_fail_nonfatal("__bswap_32 improperly defined");
28*ac77b262SWarner Losh #endif
29*ac77b262SWarner Losh #ifdef bswap_32
30*ac77b262SWarner Losh atf_tc_fail_nonfatal("bswap_32 improperly defined");
31*ac77b262SWarner Losh #endif
32*ac77b262SWarner Losh #ifdef __bswap_64
33*ac77b262SWarner Losh atf_tc_fail_nonfatal("__bswap_64 improperly defined");
34*ac77b262SWarner Losh #endif
35*ac77b262SWarner Losh #ifdef bswap_64
36*ac77b262SWarner Losh atf_tc_fail_nonfatal("bswap_64 improperly defined");
37*ac77b262SWarner Losh #endif
38*ac77b262SWarner Losh
39*ac77b262SWarner Losh /* glibc doesn't define bswap{16,32,64} */
40*ac77b262SWarner Losh #ifdef bswap16
41*ac77b262SWarner Losh atf_tc_fail_nonfatal("bswap16 improperly defined");
42*ac77b262SWarner Losh #endif
43*ac77b262SWarner Losh #ifdef bswap32
44*ac77b262SWarner Losh atf_tc_fail_nonfatal("bswap32 improperly defined");
45*ac77b262SWarner Losh #endif
46*ac77b262SWarner Losh #ifdef bswap64
47*ac77b262SWarner Losh atf_tc_fail_nonfatal("bswap64 improperly defined");
48*ac77b262SWarner Losh #endif
49*ac77b262SWarner Losh
50*ac77b262SWarner Losh /*
51*ac77b262SWarner Losh * glibc defines with two underscores. We don't test for only one since
52*ac77b262SWarner Losh * that doesn't interfere.
53*ac77b262SWarner Losh */
54*ac77b262SWarner Losh #ifndef __BIG_ENDIAN
55*ac77b262SWarner Losh atf_tc_fail_nonfatal("__BIG_ENDIAN not defined");
56*ac77b262SWarner Losh #endif
57*ac77b262SWarner Losh #ifndef __LITTLE_ENDIAN
58*ac77b262SWarner Losh atf_tc_fail_nonfatal("__LITTLE_ENDIAN not defined");
59*ac77b262SWarner Losh #endif
60*ac77b262SWarner Losh #ifndef __PDP_ENDIAN
61*ac77b262SWarner Losh atf_tc_fail_nonfatal("__PDP_ENDIAN not defined");
62*ac77b262SWarner Losh #endif
63*ac77b262SWarner Losh #ifndef __FLOAT_WORD_ORDER
64*ac77b262SWarner Losh atf_tc_fail_nonfatal("__FLOAT_WORD_ORDER not defined");
65*ac77b262SWarner Losh #endif
66*ac77b262SWarner Losh #ifndef __BYTE_ORDER
67*ac77b262SWarner Losh atf_tc_fail_nonfatal("__BYTE_ORDER not defined");
68*ac77b262SWarner Losh #endif
69*ac77b262SWarner Losh
70*ac77b262SWarner Losh /* order to host */
71*ac77b262SWarner Losh #ifdef __BYTE_ORDER
72*ac77b262SWarner Losh #if __BYTE_ORDER == __BIG_ENDIAN
73*ac77b262SWarner Losh #define H16(x) be16toh(x)
74*ac77b262SWarner Losh #define H32(x) be32toh(x)
75*ac77b262SWarner Losh #define H64(x) be64toh(x)
76*ac77b262SWarner Losh #define O16(x) le16toh(x)
77*ac77b262SWarner Losh #define O32(x) le32toh(x)
78*ac77b262SWarner Losh #define O64(x) le64toh(x)
79*ac77b262SWarner Losh #else
80*ac77b262SWarner Losh #define H16(x) le16toh(x)
81*ac77b262SWarner Losh #define H32(x) le32toh(x)
82*ac77b262SWarner Losh #define H64(x) le64toh(x)
83*ac77b262SWarner Losh #define O16(x) be16toh(x)
84*ac77b262SWarner Losh #define O32(x) be32toh(x)
85*ac77b262SWarner Losh #define O64(x) be64toh(x)
86*ac77b262SWarner Losh #endif
87*ac77b262SWarner Losh #endif
88*ac77b262SWarner Losh ATF_REQUIRE(H16(0x1234) == 0x1234);
89*ac77b262SWarner Losh ATF_REQUIRE(H32(0x12345678ul) == 0x12345678ul);
90*ac77b262SWarner Losh ATF_REQUIRE(H64(0x123456789abcdef0ull) == 0x123456789abcdef0ull);
91*ac77b262SWarner Losh ATF_REQUIRE(O16(0x1234) == __bswap16(0x1234));
92*ac77b262SWarner Losh ATF_REQUIRE(O32(0x12345678ul) == __bswap32(0x12345678ul));
93*ac77b262SWarner Losh ATF_REQUIRE(O64(0x123456789abcdef0ull) == __bswap64(0x123456789abcdef0ull));
94*ac77b262SWarner Losh #undef H16
95*ac77b262SWarner Losh #undef H32
96*ac77b262SWarner Losh #undef H64
97*ac77b262SWarner Losh #undef O16
98*ac77b262SWarner Losh #undef O32
99*ac77b262SWarner Losh #undef O64
100*ac77b262SWarner Losh
101*ac77b262SWarner Losh /* host to order */
102*ac77b262SWarner Losh #ifdef __BYTE_ORDER
103*ac77b262SWarner Losh #if __BYTE_ORDER == __BIG_ENDIAN
104*ac77b262SWarner Losh #define H16(x) htobe16(x)
105*ac77b262SWarner Losh #define H32(x) htobe32(x)
106*ac77b262SWarner Losh #define H64(x) htobe64(x)
107*ac77b262SWarner Losh #define O16(x) htole16(x)
108*ac77b262SWarner Losh #define O32(x) htole32(x)
109*ac77b262SWarner Losh #define O64(x) htole64(x)
110*ac77b262SWarner Losh #else
111*ac77b262SWarner Losh #define H16(x) htole16(x)
112*ac77b262SWarner Losh #define H32(x) htole32(x)
113*ac77b262SWarner Losh #define H64(x) htole64(x)
114*ac77b262SWarner Losh #define O16(x) htobe16(x)
115*ac77b262SWarner Losh #define O32(x) htobe32(x)
116*ac77b262SWarner Losh #define O64(x) htobe64(x)
117*ac77b262SWarner Losh #endif
118*ac77b262SWarner Losh #endif
119*ac77b262SWarner Losh ATF_REQUIRE(H16(0x1234) == 0x1234);
120*ac77b262SWarner Losh ATF_REQUIRE(H32(0x12345678ul) == 0x12345678ul);
121*ac77b262SWarner Losh ATF_REQUIRE(H64(0x123456789abcdef0ull) == 0x123456789abcdef0ull);
122*ac77b262SWarner Losh ATF_REQUIRE(O16(0x1234) == __bswap16(0x1234));
123*ac77b262SWarner Losh ATF_REQUIRE(O32(0x12345678ul) == __bswap32(0x12345678ul));
124*ac77b262SWarner Losh ATF_REQUIRE(O64(0x123456789abcdef0ull) == __bswap64(0x123456789abcdef0ull));
125*ac77b262SWarner Losh #undef H16
126*ac77b262SWarner Losh #undef H32
127*ac77b262SWarner Losh #undef H64
128*ac77b262SWarner Losh #undef O16
129*ac77b262SWarner Losh #undef O32
130*ac77b262SWarner Losh #undef O64
131*ac77b262SWarner Losh }
132*ac77b262SWarner Losh
ATF_TP_ADD_TCS(tp)133*ac77b262SWarner Losh ATF_TP_ADD_TCS(tp)
134*ac77b262SWarner Losh {
135*ac77b262SWarner Losh
136*ac77b262SWarner Losh ATF_TP_ADD_TC(tp, endian);
137*ac77b262SWarner Losh
138*ac77b262SWarner Losh return atf_no_error();
139*ac77b262SWarner Losh }
140