1*4229f721Sisaki /* $NetBSD: t___sync_and.c,v 1.3 2019/03/01 05:39:01 isaki Exp $ */
28116c33cSisaki
38116c33cSisaki /*
48116c33cSisaki * Copyright (C) 2019 Tetsuya Isaki. All rights reserved.
58116c33cSisaki *
68116c33cSisaki * Redistribution and use in source and binary forms, with or without
78116c33cSisaki * modification, are permitted provided that the following conditions
88116c33cSisaki * are met:
98116c33cSisaki * 1. Redistributions of source code must retain the above copyright
108116c33cSisaki * notice, this list of conditions and the following disclaimer.
118116c33cSisaki * 2. Redistributions in binary form must reproduce the above copyright
128116c33cSisaki * notice, this list of conditions and the following disclaimer in the
138116c33cSisaki * documentation and/or other materials provided with the distribution.
148116c33cSisaki *
158116c33cSisaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
168116c33cSisaki * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
178116c33cSisaki * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
188116c33cSisaki * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
198116c33cSisaki * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
208116c33cSisaki * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
218116c33cSisaki * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
228116c33cSisaki * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
238116c33cSisaki * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
248116c33cSisaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
258116c33cSisaki * SUCH DAMAGE.
268116c33cSisaki */
278116c33cSisaki
288116c33cSisaki #include <sys/cdefs.h>
29*4229f721Sisaki __RCSID("$NetBSD: t___sync_and.c,v 1.3 2019/03/01 05:39:01 isaki Exp $");
308116c33cSisaki
318116c33cSisaki #include <atf-c.h>
328116c33cSisaki #include <inttypes.h>
338116c33cSisaki #include <machine/types.h> // for __HAVE_ATOMIC64_OPS
348116c33cSisaki
358116c33cSisaki /*
368116c33cSisaki * These tests don't examine the atomicity.
378116c33cSisaki */
388116c33cSisaki
398116c33cSisaki /* XXX
408116c33cSisaki * Depending on a combination of arch and compiler, __sync_* is
418116c33cSisaki * implemented as compiler's builtin function. In that case, even
428116c33cSisaki * if libc exports the function symbol, it is not used. As a result
438116c33cSisaki * this tests will examine compiler's builtin functions.
448116c33cSisaki * It's better to run only when target is actually in libc.
458116c33cSisaki */
468116c33cSisaki
478116c33cSisaki #define DST (0x1122334455667788UL)
488116c33cSisaki #define SRC (0xf0f0f0f0f0f0f0f0UL)
498116c33cSisaki #define EXPECT (0x1020304050607080UL)
508116c33cSisaki
518116c33cSisaki #define atf_sync_prefetch(NAME, TYPE, FMT) \
528116c33cSisaki ATF_TC(NAME); \
538116c33cSisaki ATF_TC_HEAD(NAME, tc) \
548116c33cSisaki { \
558116c33cSisaki atf_tc_set_md_var(tc, "descr", #NAME); \
568116c33cSisaki } \
578116c33cSisaki ATF_TC_BODY(NAME, tc) \
588116c33cSisaki { \
598116c33cSisaki volatile TYPE val; \
608116c33cSisaki TYPE src; \
618116c33cSisaki TYPE res; \
628116c33cSisaki TYPE expval; \
638116c33cSisaki TYPE expres; \
648116c33cSisaki val = (TYPE)DST; \
658116c33cSisaki src = (TYPE)SRC; \
668116c33cSisaki expval = (TYPE)EXPECT; \
678116c33cSisaki expres = (TYPE)DST; \
688116c33cSisaki res = NAME(&val, src); \
698116c33cSisaki ATF_REQUIRE_MSG(val == expval, \
708116c33cSisaki "val expects 0x%" FMT " but 0x%" FMT, expval, val); \
718116c33cSisaki ATF_REQUIRE_MSG(res == expres, \
728116c33cSisaki "res expects 0x%" FMT " but 0x%" FMT, expres, res); \
738116c33cSisaki }
748116c33cSisaki
758116c33cSisaki atf_sync_prefetch(__sync_fetch_and_and_1, uint8_t, PRIx8);
768116c33cSisaki atf_sync_prefetch(__sync_fetch_and_and_2, uint16_t, PRIx16);
778116c33cSisaki atf_sync_prefetch(__sync_fetch_and_and_4, uint32_t, PRIx32);
788116c33cSisaki #if defined(__HAVE_ATOMIC64_OPS)
798116c33cSisaki atf_sync_prefetch(__sync_fetch_and_and_8, uint64_t, PRIx64);
808116c33cSisaki #endif
818116c33cSisaki
828116c33cSisaki #define atf_sync_postfetch(NAME, TYPE, FMT) \
838116c33cSisaki ATF_TC(NAME); \
848116c33cSisaki ATF_TC_HEAD(NAME, tc) \
858116c33cSisaki { \
868116c33cSisaki atf_tc_set_md_var(tc, "descr", #NAME); \
878116c33cSisaki } \
888116c33cSisaki ATF_TC_BODY(NAME, tc) \
898116c33cSisaki { \
908116c33cSisaki volatile TYPE val; \
918116c33cSisaki TYPE src; \
928116c33cSisaki TYPE res; \
938116c33cSisaki TYPE exp; \
948116c33cSisaki val = (TYPE)DST; \
958116c33cSisaki src = (TYPE)SRC; \
968116c33cSisaki exp = (TYPE)EXPECT; \
978116c33cSisaki res = NAME(&val, src); \
988116c33cSisaki ATF_REQUIRE_MSG(val == exp, \
998116c33cSisaki "val expects 0x%" FMT " but 0x%" FMT, exp, val); \
1008116c33cSisaki ATF_REQUIRE_MSG(res == exp, \
1018116c33cSisaki "res expects 0x%" FMT " but 0x%" FMT, exp, res); \
1028116c33cSisaki }
1038116c33cSisaki
1048116c33cSisaki atf_sync_postfetch(__sync_and_and_fetch_1, uint8_t, PRIx8);
1058116c33cSisaki atf_sync_postfetch(__sync_and_and_fetch_2, uint16_t, PRIx16);
1068116c33cSisaki atf_sync_postfetch(__sync_and_and_fetch_4, uint32_t, PRIx32);
1078116c33cSisaki #ifdef __HAVE_ATOMIC64_OPS
1088116c33cSisaki atf_sync_postfetch(__sync_and_and_fetch_8, uint64_t, PRIx64);
1098116c33cSisaki #endif
1108116c33cSisaki
ATF_TP_ADD_TCS(tp)1118116c33cSisaki ATF_TP_ADD_TCS(tp)
1128116c33cSisaki {
1138116c33cSisaki ATF_TP_ADD_TC(tp, __sync_fetch_and_and_1);
1148116c33cSisaki ATF_TP_ADD_TC(tp, __sync_fetch_and_and_2);
1158116c33cSisaki ATF_TP_ADD_TC(tp, __sync_fetch_and_and_4);
1168116c33cSisaki #ifdef __HAVE_ATOMIC64_OPS
1178116c33cSisaki ATF_TP_ADD_TC(tp, __sync_fetch_and_and_8);
1188116c33cSisaki #endif
1198116c33cSisaki
1208116c33cSisaki ATF_TP_ADD_TC(tp, __sync_and_and_fetch_1);
1218116c33cSisaki ATF_TP_ADD_TC(tp, __sync_and_and_fetch_2);
1228116c33cSisaki ATF_TP_ADD_TC(tp, __sync_and_and_fetch_4);
1238116c33cSisaki #ifdef __HAVE_ATOMIC64_OPS
1248116c33cSisaki ATF_TP_ADD_TC(tp, __sync_and_and_fetch_8);
1258116c33cSisaki #endif
1268116c33cSisaki
1278116c33cSisaki return atf_no_error();
1288116c33cSisaki }
129