Skip mm_cid tests when unavailable
[librseq.git] / tests / unit / arch-mo.c
1 // SPDX-License-Identifier: MIT
2
3 #include <stdint.h>
4 #include <rseq/rseq.h>
5 #include <rseq/compiler.h>
6
7 #include "tap.h"
8
9 struct {
10 uint8_t v_u8;
11 int8_t v_s8;
12 uint16_t v_u16;
13 int16_t v_s16;
14 uint32_t v_u32;
15 int32_t v_s32;
16 #if RSEQ_BITS_PER_LONG == 64
17 uint64_t v_u64;
18 int64_t v_s64;
19 #endif
20 void *p;
21 volatile int vol_int;
22 const int const_int;
23 } load_s = {
24 .v_u8 = 0x11,
25 .v_s8 = -(0x11),
26 .v_u16 = 0x1122,
27 .v_s16 = -(0x1122),
28 .v_u32 = (0x11223344),
29 .v_s32 = -(0x11223344),
30 #if RSEQ_BITS_PER_LONG == 64
31 .v_u64 = 0x1122334455667788ULL,
32 .v_s64 = -(0x1122334455667788LL),
33 .p = (void *)0x1122334455667788ULL,
34 #else
35 .p = (void *)0x11223344,
36 #endif
37 .vol_int = -(0x11223344),
38 .const_int = -(0x11223344),
39 };
40
41 static
42 void test_load_acquire(void)
43 {
44 ok(rseq_smp_load_acquire(&load_s.v_u8) == 0x11, "load-acquire u8");
45 ok(rseq_smp_load_acquire(&load_s.v_s8) == -(0x11), "load-acquire s8");
46 ok(rseq_smp_load_acquire(&load_s.v_u16) == 0x1122, "load-acquire u16");
47 ok(rseq_smp_load_acquire(&load_s.v_s16) == -(0x1122), "load-acquire s16");
48 ok(rseq_smp_load_acquire(&load_s.v_u32) == 0x11223344, "load-acquire u32");
49 ok(rseq_smp_load_acquire(&load_s.v_s32) == -(0x11223344), "load-acquire s32");
50 #if RSEQ_BITS_PER_LONG == 64
51 ok(rseq_smp_load_acquire(&load_s.v_u64) == 0x1122334455667788ULL, "load-acquire u64");
52 ok(rseq_smp_load_acquire(&load_s.v_s64) == -(0x1122334455667788LL), "load-acquire s64");
53 ok(rseq_smp_load_acquire(&load_s.p) == (void *)0x1122334455667788ULL, "load-acquire pointer");
54 #else
55 ok(rseq_smp_load_acquire(&load_s.p) == (void *)0x11223344, "load-acquire pointer");
56 #endif
57 ok(rseq_smp_load_acquire(&load_s.vol_int) == -(0x11223344), "load-acquire volatile int");
58 ok(rseq_smp_load_acquire(&load_s.const_int) == -(0x11223344), "load-acquire const int");
59 }
60
61 struct {
62 uint8_t v_u8;
63 int8_t v_s8;
64 uint16_t v_u16;
65 int16_t v_s16;
66 uint32_t v_u32;
67 int32_t v_s32;
68 #if RSEQ_BITS_PER_LONG == 64
69 uint64_t v_u64;
70 int64_t v_s64;
71 #endif
72 void *p;
73 volatile int vol_int;
74 } store_s;
75
76 static
77 void test_store_release(void)
78 {
79 rseq_smp_store_release(&store_s.v_u8, 0x11);
80 ok(store_s.v_u8 == 0x11, "store-release u8");
81 rseq_smp_store_release(&store_s.v_s8, -(0x11));
82 ok(store_s.v_s8 == -(0x11), "store-release s8");
83 rseq_smp_store_release(&store_s.v_u16, 0x1122);
84 ok(store_s.v_u16 == 0x1122, "store-release u16");
85 rseq_smp_store_release(&store_s.v_s16, -(0x1122));
86 ok(store_s.v_s16 == -(0x1122), "store-release s16");
87 rseq_smp_store_release(&store_s.v_u32, 0x11223344);
88 ok(store_s.v_u32 == 0x11223344, "store-release u32");
89 rseq_smp_store_release(&store_s.v_s32, -(0x11223344));
90 ok(store_s.v_s32 == -(0x11223344), "store-release s32");
91 #if RSEQ_BITS_PER_LONG == 64
92 rseq_smp_store_release(&store_s.v_u64, 0x1122334455667788ULL);
93 ok(store_s.v_u64 == 0x1122334455667788ULL, "store-release u64");
94 rseq_smp_store_release(&store_s.v_s64, -(0x1122334455667788LL));
95 ok(store_s.v_s64 == -(0x1122334455667788LL), "store-release s64");
96 rseq_smp_store_release(&store_s.p, (void *)0x1122334455667788ULL);
97 ok(store_s.p == (void *)0x1122334455667788ULL, "store-release pointer");
98 #else
99 rseq_smp_store_release(&store_s.p, (void *)0x11223344);
100 ok(store_s.p == (void *)0x11223344, "store-release pointer");
101 #endif
102 rseq_smp_store_release(&store_s.vol_int, -(0x11223344));
103 ok(store_s.vol_int == -(0x11223344), "store-release volatile int");
104 }
105
106 int main(void)
107 {
108 plan_no_plan();
109 test_load_acquire();
110 test_store_release();
111 exit(exit_status());
112 }
This page took 0.031109 seconds and 4 git commands to generate.