t_ufetchstore.c revision 1.4 1 1.4 thorpej /* $NetBSD: t_ufetchstore.c,v 1.4 2019/04/07 15:50:12 thorpej Exp $ */
2 1.1 thorpej
3 1.1 thorpej /*
4 1.1 thorpej * Copyright (c) 2019 The NetBSD Foundation, Inc.
5 1.1 thorpej * All rights reserved.
6 1.1 thorpej *
7 1.1 thorpej * This code is derived from software contributed to The NetBSD Foundation
8 1.1 thorpej * by Jason R. Thorpe.
9 1.1 thorpej *
10 1.1 thorpej * Redistribution and use in source and binary forms, with or without
11 1.1 thorpej * modification, are permitted provided that the following conditions
12 1.1 thorpej * are met:
13 1.1 thorpej * 1. Redistributions of source code must retain the above copyright
14 1.1 thorpej * notice, this list of conditions and the following disclaimer.
15 1.1 thorpej * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 thorpej * notice, this list of conditions and the following disclaimer in the
17 1.1 thorpej * documentation and/or other materials provided with the distribution.
18 1.1 thorpej *
19 1.1 thorpej * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 thorpej * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 thorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 thorpej * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 thorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 thorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 thorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 thorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 thorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 thorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 thorpej * POSSIBILITY OF SUCH DAMAGE.
30 1.1 thorpej */
31 1.1 thorpej
32 1.1 thorpej #include <sys/cdefs.h>
33 1.1 thorpej __COPYRIGHT("@(#) Copyright (c) 2019\
34 1.1 thorpej The NetBSD Foundation, inc. All rights reserved.");
35 1.4 thorpej __RCSID("$NetBSD: t_ufetchstore.c,v 1.4 2019/04/07 15:50:12 thorpej Exp $");
36 1.1 thorpej
37 1.1 thorpej #include <sys/types.h>
38 1.1 thorpej #include <sys/endian.h>
39 1.1 thorpej #include <sys/module.h>
40 1.1 thorpej #include <sys/sysctl.h>
41 1.1 thorpej
42 1.1 thorpej #include <err.h>
43 1.1 thorpej #include <errno.h>
44 1.1 thorpej #include <limits.h>
45 1.1 thorpej
46 1.1 thorpej #include <atf-c.h>
47 1.1 thorpej
48 1.1 thorpej #include "common.h"
49 1.1 thorpej
50 1.1 thorpej #define mib_name "kern.ufetchstore_test.test"
51 1.1 thorpej
52 1.1 thorpej static bool module_loaded;
53 1.1 thorpej
54 1.1 thorpej #define MODULE_PATH \
55 1.1 thorpej "/usr/tests/modules/ufetchstore_tester/ufetchstore_tester.kmod"
56 1.1 thorpej #define MODULE_NAME "ufetchstore_tester"
57 1.1 thorpej
58 1.1 thorpej #define CHECK_MODULE() \
59 1.1 thorpej do { \
60 1.1 thorpej load_module(); \
61 1.1 thorpej if (! module_loaded) { \
62 1.1 thorpej atf_tc_skip("loading '%s' module failed.", MODULE_NAME);\
63 1.1 thorpej } \
64 1.1 thorpej } while (/*CONSTCOND*/0)
65 1.1 thorpej
66 1.1 thorpej static void
67 1.1 thorpej load_module(void)
68 1.1 thorpej {
69 1.1 thorpej #ifndef SKIP_MODULE
70 1.1 thorpej if (module_loaded)
71 1.1 thorpej return;
72 1.1 thorpej
73 1.1 thorpej modctl_load_t params = {
74 1.1 thorpej .ml_filename = MODULE_PATH,
75 1.1 thorpej .ml_flags = MODCTL_NO_PROP,
76 1.1 thorpej };
77 1.1 thorpej
78 1.1 thorpej if (modctl(MODCTL_LOAD, ¶ms) != 0) {
79 1.1 thorpej warn("failed to load module '%s'", MODULE_PATH);
80 1.1 thorpej } else {
81 1.1 thorpej module_loaded = true;
82 1.1 thorpej }
83 1.1 thorpej #else
84 1.1 thorpej module_loaded = true;
85 1.1 thorpej #endif /* ! SKIP_MODULE */
86 1.1 thorpej }
87 1.1 thorpej
88 1.3 rin #define UADDR(x) ((uintptr_t)(x))
89 1.1 thorpej
90 1.1 thorpej static void
91 1.1 thorpej unload_module(void)
92 1.1 thorpej {
93 1.1 thorpej #ifndef SKIP_MODULE
94 1.1 thorpej char module_name[] = MODULE_NAME;
95 1.1 thorpej
96 1.1 thorpej if (modctl(MODCTL_UNLOAD, module_name) != 0) {
97 1.1 thorpej warn("failed to unload module '%s'", MODULE_NAME);
98 1.1 thorpej } else {
99 1.1 thorpej module_loaded = false;
100 1.1 thorpej }
101 1.1 thorpej #endif /* ! SKIP_MODULE */
102 1.1 thorpej }
103 1.1 thorpej
104 1.4 thorpej static unsigned long
105 1.4 thorpej vm_max_address_raw(void)
106 1.1 thorpej {
107 1.1 thorpej static unsigned long max_addr = 0;
108 1.1 thorpej int rv;
109 1.1 thorpej
110 1.1 thorpej if (max_addr == 0) {
111 1.1 thorpej size_t max_addr_size = sizeof(max_addr);
112 1.1 thorpej rv = sysctlbyname("vm.maxaddress", &max_addr, &max_addr_size,
113 1.1 thorpej NULL, 0);
114 1.1 thorpej if (rv != 0)
115 1.1 thorpej err(1, "sysctlbyname('vm.maxaddress')");
116 1.1 thorpej }
117 1.4 thorpej return max_addr;
118 1.4 thorpej }
119 1.4 thorpej
120 1.4 thorpej static void *
121 1.4 thorpej vm_max_address(void)
122 1.4 thorpej {
123 1.4 thorpej return (void *)vm_max_address_raw();
124 1.4 thorpej }
125 1.4 thorpej
126 1.4 thorpej static void *
127 1.4 thorpej vm_max_address_minus(unsigned int adj)
128 1.4 thorpej {
129 1.4 thorpej return (void *)(vm_max_address_raw() - adj);
130 1.1 thorpej }
131 1.1 thorpej
132 1.1 thorpej static int
133 1.1 thorpej do_sysctl(struct ufetchstore_test_args *args)
134 1.1 thorpej {
135 1.1 thorpej uint64_t arg_addr64 = (uintptr_t)args;
136 1.1 thorpej int rv;
137 1.1 thorpej
138 1.1 thorpej args->fetchstore_error = EBADF; /* poison */
139 1.1 thorpej args->pointer_size = (int)sizeof(void *);
140 1.1 thorpej
141 1.1 thorpej /*
142 1.1 thorpej * Yes, the intent is to provide the pointer, not the structure,
143 1.1 thorpej * to the kernel side of the test harness.
144 1.1 thorpej */
145 1.1 thorpej rv = sysctlbyname(mib_name, NULL, NULL, &arg_addr64,
146 1.1 thorpej sizeof(arg_addr64));
147 1.1 thorpej if (rv != 0) {
148 1.1 thorpej rv = errno;
149 1.1 thorpej warn("sysctlbyname('%s') -> %d", mib_name, rv);
150 1.1 thorpej return rv;
151 1.1 thorpej }
152 1.1 thorpej return 0;
153 1.1 thorpej }
154 1.1 thorpej
155 1.1 thorpej static int
156 1.1 thorpej do_ufetch_8(const uint8_t *uaddr, uint8_t *res)
157 1.1 thorpej {
158 1.1 thorpej struct ufetchstore_test_args args = {
159 1.3 rin .uaddr64 = UADDR(uaddr),
160 1.1 thorpej .test_op = OP_LOAD,
161 1.1 thorpej .size = 8,
162 1.1 thorpej };
163 1.1 thorpej
164 1.1 thorpej ATF_REQUIRE_EQ(do_sysctl(&args), 0);
165 1.1 thorpej *res = args.val8;
166 1.1 thorpej return args.fetchstore_error;
167 1.1 thorpej }
168 1.1 thorpej
169 1.1 thorpej static int
170 1.1 thorpej do_ufetch_16(const uint16_t *uaddr, uint16_t *res)
171 1.1 thorpej {
172 1.1 thorpej struct ufetchstore_test_args args = {
173 1.3 rin .uaddr64 = UADDR(uaddr),
174 1.1 thorpej .test_op = OP_LOAD,
175 1.1 thorpej .size = 16,
176 1.1 thorpej };
177 1.1 thorpej
178 1.1 thorpej ATF_REQUIRE_EQ(do_sysctl(&args), 0);
179 1.1 thorpej *res = args.val16;
180 1.1 thorpej return args.fetchstore_error;
181 1.1 thorpej }
182 1.1 thorpej
183 1.1 thorpej static int
184 1.1 thorpej do_ufetch_32(const uint32_t *uaddr, uint32_t *res)
185 1.1 thorpej {
186 1.1 thorpej struct ufetchstore_test_args args = {
187 1.3 rin .uaddr64 = UADDR(uaddr),
188 1.1 thorpej .test_op = OP_LOAD,
189 1.1 thorpej .size = 32,
190 1.1 thorpej };
191 1.1 thorpej
192 1.1 thorpej ATF_REQUIRE_EQ(do_sysctl(&args), 0);
193 1.1 thorpej *res = args.val32;
194 1.1 thorpej return args.fetchstore_error;
195 1.1 thorpej }
196 1.1 thorpej
197 1.1 thorpej #ifdef _LP64
198 1.1 thorpej static int
199 1.1 thorpej do_ufetch_64(const uint64_t *uaddr, uint64_t *res)
200 1.1 thorpej {
201 1.1 thorpej struct ufetchstore_test_args args = {
202 1.3 rin .uaddr64 = UADDR(uaddr),
203 1.1 thorpej .test_op = OP_LOAD,
204 1.1 thorpej .size = 64,
205 1.1 thorpej };
206 1.1 thorpej
207 1.1 thorpej ATF_REQUIRE_EQ(do_sysctl(&args), 0);
208 1.1 thorpej *res = args.val64;
209 1.1 thorpej return args.fetchstore_error;
210 1.1 thorpej }
211 1.1 thorpej #endif /* _LP64 */
212 1.1 thorpej
213 1.1 thorpej static int
214 1.1 thorpej do_ustore_8(uint8_t *uaddr, uint8_t val)
215 1.1 thorpej {
216 1.1 thorpej struct ufetchstore_test_args args = {
217 1.3 rin .uaddr64 = UADDR(uaddr),
218 1.1 thorpej .test_op = OP_STORE,
219 1.1 thorpej .size = 8,
220 1.1 thorpej .val8 = val,
221 1.1 thorpej };
222 1.1 thorpej
223 1.1 thorpej ATF_REQUIRE_EQ(do_sysctl(&args), 0);
224 1.1 thorpej return args.fetchstore_error;
225 1.1 thorpej }
226 1.1 thorpej
227 1.1 thorpej static int
228 1.1 thorpej do_ustore_16(uint16_t *uaddr, uint16_t val)
229 1.1 thorpej {
230 1.1 thorpej struct ufetchstore_test_args args = {
231 1.3 rin .uaddr64 = UADDR(uaddr),
232 1.1 thorpej .test_op = OP_STORE,
233 1.1 thorpej .size = 16,
234 1.1 thorpej .val16 = val,
235 1.1 thorpej };
236 1.1 thorpej
237 1.1 thorpej ATF_REQUIRE_EQ(do_sysctl(&args), 0);
238 1.1 thorpej return args.fetchstore_error;
239 1.1 thorpej }
240 1.1 thorpej
241 1.1 thorpej static int
242 1.1 thorpej do_ustore_32(uint32_t *uaddr, uint32_t val)
243 1.1 thorpej {
244 1.1 thorpej struct ufetchstore_test_args args = {
245 1.3 rin .uaddr64 = UADDR(uaddr),
246 1.1 thorpej .test_op = OP_STORE,
247 1.1 thorpej .size = 32,
248 1.1 thorpej .val32 = val,
249 1.1 thorpej };
250 1.1 thorpej
251 1.1 thorpej ATF_REQUIRE_EQ(do_sysctl(&args), 0);
252 1.1 thorpej return args.fetchstore_error;
253 1.1 thorpej }
254 1.1 thorpej
255 1.1 thorpej #ifdef _LP64
256 1.1 thorpej static int
257 1.1 thorpej do_ustore_64(uint64_t *uaddr, uint64_t val)
258 1.1 thorpej {
259 1.1 thorpej struct ufetchstore_test_args args = {
260 1.3 rin .uaddr64 = UADDR(uaddr),
261 1.1 thorpej .test_op = OP_STORE,
262 1.1 thorpej .size = 64,
263 1.1 thorpej .val64 = val,
264 1.1 thorpej };
265 1.1 thorpej
266 1.1 thorpej ATF_REQUIRE_EQ(do_sysctl(&args), 0);
267 1.1 thorpej return args.fetchstore_error;
268 1.1 thorpej }
269 1.1 thorpej #endif /* _LP64 */
270 1.1 thorpej
271 1.1 thorpej static int
272 1.1 thorpej do_ucas_32(uint32_t *uaddr, uint32_t expected, uint32_t new, uint32_t *actualp)
273 1.1 thorpej {
274 1.1 thorpej struct ufetchstore_test_args args = {
275 1.3 rin .uaddr64 = UADDR(uaddr),
276 1.1 thorpej .test_op = OP_CAS,
277 1.1 thorpej .size = 32,
278 1.1 thorpej .val32 = new,
279 1.1 thorpej .ea_val32 = expected,
280 1.1 thorpej };
281 1.1 thorpej
282 1.1 thorpej ATF_REQUIRE_EQ(do_sysctl(&args), 0);
283 1.1 thorpej *actualp = args.ea_val32;
284 1.1 thorpej return args.fetchstore_error;
285 1.1 thorpej }
286 1.1 thorpej
287 1.1 thorpej #ifdef _LP64
288 1.1 thorpej static int
289 1.1 thorpej do_ucas_64(uint64_t *uaddr, uint64_t expected, uint64_t new, uint64_t *actualp)
290 1.1 thorpej {
291 1.1 thorpej struct ufetchstore_test_args args = {
292 1.3 rin .uaddr64 = UADDR(uaddr),
293 1.1 thorpej .test_op = OP_CAS,
294 1.1 thorpej .size = 64,
295 1.1 thorpej .val64 = new,
296 1.1 thorpej .ea_val64 = expected,
297 1.1 thorpej };
298 1.1 thorpej
299 1.1 thorpej ATF_REQUIRE_EQ(do_sysctl(&args), 0);
300 1.1 thorpej *actualp = args.ea_val64;
301 1.1 thorpej return args.fetchstore_error;
302 1.1 thorpej }
303 1.1 thorpej #endif /* _LP64 */
304 1.1 thorpej
305 1.1 thorpej struct memory_cell {
306 1.1 thorpej unsigned long guard0;
307 1.1 thorpej union {
308 1.1 thorpej unsigned long test_cell;
309 1.1 thorpej #ifdef _LP64
310 1.1 thorpej uint64_t val64;
311 1.1 thorpej #endif
312 1.1 thorpej uint32_t val32[sizeof(long) / 4];
313 1.1 thorpej uint16_t val16[sizeof(long) / 2];
314 1.1 thorpej uint8_t val8 [sizeof(long) ];
315 1.1 thorpej };
316 1.1 thorpej unsigned long guard1;
317 1.1 thorpej };
318 1.1 thorpej
319 1.1 thorpej #define index8 1
320 1.1 thorpej #define index16 1
321 1.1 thorpej #define index32 0
322 1.1 thorpej
323 1.1 thorpej #define test_pattern8 0xa5
324 1.1 thorpej #define test_pattern16 0x5a6b
325 1.1 thorpej #define test_pattern32 0xb01cafe1
326 1.1 thorpej #ifdef _LP64
327 1.1 thorpej #define test_pattern64 0xcafedeadfeedbabe
328 1.1 thorpej #endif
329 1.1 thorpej
330 1.1 thorpej #if _BYTE_ORDER == _LITTLE_ENDIAN
331 1.1 thorpej #define test_cell_val8 ((unsigned long)test_pattern8 << (index8 * NBBY))
332 1.1 thorpej #define test_cell_val16 ((unsigned long)test_pattern16 << (index16 * NBBY*2))
333 1.1 thorpej #define test_cell_val32 ((unsigned long)test_pattern32 << (index32 * NBBY*4))
334 1.1 thorpej #ifdef _LP64
335 1.1 thorpej #define test_cell_val64 ((unsigned long)test_pattern64)
336 1.1 thorpej #endif
337 1.1 thorpej #endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
338 1.1 thorpej
339 1.1 thorpej #if _BYTE_ORDER == _BIG_ENDIAN
340 1.1 thorpej #ifdef _LP64
341 1.1 thorpej #define test_cell_val8 ((unsigned long)test_pattern8 << (56-(index8 * NBBY)))
342 1.1 thorpej #define test_cell_val16 ((unsigned long)test_pattern16 << (48-(index16 * NBBY*2)))
343 1.1 thorpej #define test_cell_val32 ((unsigned long)test_pattern32 << (32-(index32 * NBBY*4)))
344 1.1 thorpej #define test_cell_val64 ((unsigned long)test_pattern64)
345 1.1 thorpej #else /* ! _LP64 */
346 1.1 thorpej #define test_cell_val8 ((unsigned long)test_pattern8 << (24-(index8 * NBBY)))
347 1.1 thorpej #define test_cell_val16 ((unsigned long)test_pattern16 << (16-(index16 * NBBY*2)))
348 1.1 thorpej #define test_cell_val32 ((unsigned long)test_pattern32)
349 1.1 thorpej #endif /* _LP64 */
350 1.1 thorpej #endif /* #if _BYTE_ORDER == _BIG_ENDIAN */
351 1.1 thorpej
352 1.1 thorpej #define read_test_cell(cell) (cell)->test_cell
353 1.1 thorpej #define write_test_cell(cell, v) (cell)->test_cell = (v)
354 1.1 thorpej
355 1.1 thorpej #define memory_cell_initializer \
356 1.1 thorpej { \
357 1.1 thorpej .guard0 = ULONG_MAX, \
358 1.1 thorpej .test_cell = 0, \
359 1.1 thorpej .guard1 = ULONG_MAX, \
360 1.1 thorpej }
361 1.1 thorpej
362 1.1 thorpej static bool
363 1.1 thorpej memory_cell_check_guard(const struct memory_cell * const cell)
364 1.1 thorpej {
365 1.1 thorpej return cell->guard0 == ULONG_MAX &&
366 1.1 thorpej cell->guard1 == ULONG_MAX;
367 1.1 thorpej }
368 1.1 thorpej
369 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_8);
370 1.1 thorpej ATF_TC_HEAD(ufetch_8, tc)
371 1.1 thorpej {
372 1.1 thorpej atf_tc_set_md_var(tc, "descr",
373 1.1 thorpej "test for correct ufetch_8 behavior");
374 1.1 thorpej }
375 1.1 thorpej ATF_TC_BODY(ufetch_8, tc)
376 1.1 thorpej {
377 1.1 thorpej struct memory_cell cell = memory_cell_initializer;
378 1.1 thorpej uint8_t res;
379 1.1 thorpej
380 1.1 thorpej CHECK_MODULE();
381 1.1 thorpej
382 1.1 thorpej write_test_cell(&cell, test_cell_val8);
383 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_8(&cell.val8[index8], &res), 0);
384 1.1 thorpej ATF_REQUIRE(memory_cell_check_guard(&cell));
385 1.1 thorpej ATF_REQUIRE(res == test_pattern8);
386 1.1 thorpej }
387 1.1 thorpej ATF_TC_CLEANUP(ufetch_8, tc)
388 1.1 thorpej {
389 1.1 thorpej unload_module();
390 1.1 thorpej }
391 1.1 thorpej
392 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_16);
393 1.1 thorpej ATF_TC_HEAD(ufetch_16, tc)
394 1.1 thorpej {
395 1.1 thorpej atf_tc_set_md_var(tc, "descr",
396 1.1 thorpej "test for correct ufetch_16 behavior");
397 1.1 thorpej }
398 1.1 thorpej ATF_TC_BODY(ufetch_16, tc)
399 1.1 thorpej {
400 1.1 thorpej struct memory_cell cell = memory_cell_initializer;
401 1.1 thorpej uint16_t res;
402 1.1 thorpej
403 1.1 thorpej CHECK_MODULE();
404 1.1 thorpej
405 1.1 thorpej write_test_cell(&cell, test_cell_val16);
406 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_16(&cell.val16[index16], &res), 0);
407 1.1 thorpej ATF_REQUIRE(memory_cell_check_guard(&cell));
408 1.1 thorpej ATF_REQUIRE(res == test_pattern16);
409 1.1 thorpej }
410 1.1 thorpej ATF_TC_CLEANUP(ufetch_16, tc)
411 1.1 thorpej {
412 1.1 thorpej unload_module();
413 1.1 thorpej }
414 1.1 thorpej
415 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_32);
416 1.1 thorpej ATF_TC_HEAD(ufetch_32, tc)
417 1.1 thorpej {
418 1.1 thorpej atf_tc_set_md_var(tc, "descr",
419 1.1 thorpej "test for correct ufetch_32 behavior");
420 1.1 thorpej }
421 1.1 thorpej ATF_TC_BODY(ufetch_32, tc)
422 1.1 thorpej {
423 1.1 thorpej struct memory_cell cell = memory_cell_initializer;
424 1.1 thorpej uint32_t res;
425 1.1 thorpej
426 1.1 thorpej CHECK_MODULE();
427 1.1 thorpej
428 1.1 thorpej write_test_cell(&cell, test_cell_val32);
429 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_32(&cell.val32[index32], &res), 0);
430 1.1 thorpej ATF_REQUIRE(memory_cell_check_guard(&cell));
431 1.1 thorpej ATF_REQUIRE(res == test_pattern32);
432 1.1 thorpej }
433 1.1 thorpej ATF_TC_CLEANUP(ufetch_32, tc)
434 1.1 thorpej {
435 1.1 thorpej unload_module();
436 1.1 thorpej }
437 1.1 thorpej
438 1.1 thorpej #ifdef _LP64
439 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_64);
440 1.1 thorpej ATF_TC_HEAD(ufetch_64, tc)
441 1.1 thorpej {
442 1.1 thorpej atf_tc_set_md_var(tc, "descr",
443 1.1 thorpej "test for correct ufetch_64 behavior");
444 1.1 thorpej }
445 1.1 thorpej ATF_TC_BODY(ufetch_64, tc)
446 1.1 thorpej {
447 1.1 thorpej struct memory_cell cell = memory_cell_initializer;
448 1.1 thorpej uint64_t res;
449 1.1 thorpej
450 1.1 thorpej CHECK_MODULE();
451 1.1 thorpej
452 1.1 thorpej write_test_cell(&cell, test_cell_val64);
453 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_64(&cell.val64, &res), 0);
454 1.1 thorpej ATF_REQUIRE(memory_cell_check_guard(&cell));
455 1.1 thorpej ATF_REQUIRE(res == test_pattern64);
456 1.1 thorpej }
457 1.1 thorpej ATF_TC_CLEANUP(ufetch_64, tc)
458 1.1 thorpej {
459 1.1 thorpej unload_module();
460 1.1 thorpej }
461 1.1 thorpej #endif /* _LP64 */
462 1.1 thorpej
463 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_8_null);
464 1.1 thorpej ATF_TC_HEAD(ufetch_8_null, tc)
465 1.1 thorpej {
466 1.1 thorpej atf_tc_set_md_var(tc, "descr",
467 1.1 thorpej "test for correct ufetch_8 NULL pointer behavior");
468 1.1 thorpej }
469 1.1 thorpej ATF_TC_BODY(ufetch_8_null, tc)
470 1.1 thorpej {
471 1.1 thorpej uint8_t res;
472 1.1 thorpej
473 1.1 thorpej CHECK_MODULE();
474 1.1 thorpej
475 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_8(NULL, &res), EFAULT);
476 1.1 thorpej }
477 1.1 thorpej ATF_TC_CLEANUP(ufetch_8_null, tc)
478 1.1 thorpej {
479 1.1 thorpej unload_module();
480 1.1 thorpej }
481 1.1 thorpej
482 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_16_null);
483 1.1 thorpej ATF_TC_HEAD(ufetch_16_null, tc)
484 1.1 thorpej {
485 1.1 thorpej atf_tc_set_md_var(tc, "descr",
486 1.1 thorpej "test for correct ufetch_16 NULL pointer behavior");
487 1.1 thorpej }
488 1.1 thorpej ATF_TC_BODY(ufetch_16_null, tc)
489 1.1 thorpej {
490 1.1 thorpej uint16_t res;
491 1.1 thorpej
492 1.1 thorpej CHECK_MODULE();
493 1.1 thorpej
494 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_16(NULL, &res), EFAULT);
495 1.1 thorpej }
496 1.1 thorpej ATF_TC_CLEANUP(ufetch_16_null, tc)
497 1.1 thorpej {
498 1.1 thorpej unload_module();
499 1.1 thorpej }
500 1.1 thorpej
501 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_32_null);
502 1.1 thorpej ATF_TC_HEAD(ufetch_32_null, tc)
503 1.1 thorpej {
504 1.1 thorpej atf_tc_set_md_var(tc, "descr",
505 1.1 thorpej "test for correct ufetch_32 NULL pointer behavior");
506 1.1 thorpej }
507 1.1 thorpej ATF_TC_BODY(ufetch_32_null, tc)
508 1.1 thorpej {
509 1.1 thorpej uint32_t res;
510 1.1 thorpej
511 1.1 thorpej CHECK_MODULE();
512 1.1 thorpej
513 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_32(NULL, &res), EFAULT);
514 1.1 thorpej }
515 1.1 thorpej ATF_TC_CLEANUP(ufetch_32_null, tc)
516 1.1 thorpej {
517 1.1 thorpej unload_module();
518 1.1 thorpej }
519 1.1 thorpej
520 1.1 thorpej #ifdef _LP64
521 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_64_null);
522 1.1 thorpej ATF_TC_HEAD(ufetch_64_null, tc)
523 1.1 thorpej {
524 1.1 thorpej atf_tc_set_md_var(tc, "descr",
525 1.1 thorpej "test for correct ufetch_64 NULL pointer behavior");
526 1.1 thorpej }
527 1.1 thorpej ATF_TC_BODY(ufetch_64_null, tc)
528 1.1 thorpej {
529 1.1 thorpej uint64_t res;
530 1.1 thorpej
531 1.1 thorpej CHECK_MODULE();
532 1.1 thorpej
533 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_64(NULL, &res), EFAULT);
534 1.1 thorpej }
535 1.1 thorpej ATF_TC_CLEANUP(ufetch_64_null, tc)
536 1.1 thorpej {
537 1.1 thorpej unload_module();
538 1.1 thorpej }
539 1.1 thorpej #endif /* _LP64 */
540 1.1 thorpej
541 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_8_max);
542 1.1 thorpej ATF_TC_HEAD(ufetch_8_max, tc)
543 1.1 thorpej {
544 1.1 thorpej atf_tc_set_md_var(tc, "descr",
545 1.1 thorpej "test for correct ufetch_8 VM_MAX_ADDRESS pointer behavior");
546 1.1 thorpej }
547 1.1 thorpej ATF_TC_BODY(ufetch_8_max, tc)
548 1.1 thorpej {
549 1.1 thorpej uint8_t res;
550 1.1 thorpej
551 1.1 thorpej CHECK_MODULE();
552 1.1 thorpej
553 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_8(vm_max_address(), &res), EFAULT);
554 1.1 thorpej }
555 1.1 thorpej ATF_TC_CLEANUP(ufetch_8_max, tc)
556 1.1 thorpej {
557 1.1 thorpej unload_module();
558 1.1 thorpej }
559 1.1 thorpej
560 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_16_max);
561 1.1 thorpej ATF_TC_HEAD(ufetch_16_max, tc)
562 1.1 thorpej {
563 1.1 thorpej atf_tc_set_md_var(tc, "descr",
564 1.1 thorpej "test for correct ufetch_16 VM_MAX_ADDRESS pointer behavior");
565 1.1 thorpej }
566 1.1 thorpej ATF_TC_BODY(ufetch_16_max, tc)
567 1.1 thorpej {
568 1.1 thorpej uint16_t res;
569 1.1 thorpej
570 1.1 thorpej CHECK_MODULE();
571 1.1 thorpej
572 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_16(vm_max_address(), &res), EFAULT);
573 1.1 thorpej }
574 1.1 thorpej ATF_TC_CLEANUP(ufetch_16_max, tc)
575 1.1 thorpej {
576 1.1 thorpej unload_module();
577 1.1 thorpej }
578 1.1 thorpej
579 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_32_max);
580 1.1 thorpej ATF_TC_HEAD(ufetch_32_max, tc)
581 1.1 thorpej {
582 1.1 thorpej atf_tc_set_md_var(tc, "descr",
583 1.1 thorpej "test for correct ufetch_32 VM_MAX_ADDRESS pointer behavior");
584 1.1 thorpej }
585 1.1 thorpej ATF_TC_BODY(ufetch_32_max, tc)
586 1.1 thorpej {
587 1.1 thorpej uint32_t res;
588 1.1 thorpej
589 1.1 thorpej CHECK_MODULE();
590 1.1 thorpej
591 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_32(vm_max_address(), &res), EFAULT);
592 1.1 thorpej }
593 1.1 thorpej ATF_TC_CLEANUP(ufetch_32_max, tc)
594 1.1 thorpej {
595 1.1 thorpej unload_module();
596 1.1 thorpej }
597 1.1 thorpej
598 1.1 thorpej #ifdef _LP64
599 1.1 thorpej ATF_TC_WITH_CLEANUP(ufetch_64_max);
600 1.1 thorpej ATF_TC_HEAD(ufetch_64_max, tc)
601 1.1 thorpej {
602 1.1 thorpej atf_tc_set_md_var(tc, "descr",
603 1.1 thorpej "test for correct ufetch_64 VM_MAX_ADDRESS pointer behavior");
604 1.1 thorpej }
605 1.1 thorpej ATF_TC_BODY(ufetch_64_max, tc)
606 1.1 thorpej {
607 1.1 thorpej uint64_t res;
608 1.1 thorpej
609 1.1 thorpej CHECK_MODULE();
610 1.1 thorpej
611 1.1 thorpej ATF_REQUIRE_EQ(do_ufetch_64(vm_max_address(), &res), EFAULT);
612 1.1 thorpej }
613 1.1 thorpej ATF_TC_CLEANUP(ufetch_64_max, tc)
614 1.1 thorpej {
615 1.1 thorpej unload_module();
616 1.1 thorpej }
617 1.1 thorpej #endif /* _LP64 */
618 1.1 thorpej
619 1.4 thorpej ATF_TC_WITH_CLEANUP(ufetch_16_nearmax_overflow);
620 1.4 thorpej ATF_TC_HEAD(ufetch_16_nearmax_overflow, tc)
621 1.4 thorpej {
622 1.4 thorpej atf_tc_set_md_var(tc, "descr",
623 1.4 thorpej "test for correct ufetch_16 near-VM_MAX_ADDRESS pointer behavior");
624 1.4 thorpej }
625 1.4 thorpej ATF_TC_BODY(ufetch_16_nearmax_overflow, tc)
626 1.4 thorpej {
627 1.4 thorpej uint16_t res;
628 1.4 thorpej
629 1.4 thorpej CHECK_MODULE();
630 1.4 thorpej
631 1.4 thorpej /*
632 1.4 thorpej * For no-strict-alignment platforms: address checks must return
633 1.4 thorpej * EFAULT.
634 1.4 thorpej *
635 1.4 thorpej * For strict-alignment platforms: alignment checks must return
636 1.4 thorpej * EFAULT.
637 1.4 thorpej */
638 1.4 thorpej ATF_REQUIRE_EQ(do_ufetch_16(vm_max_address_minus(1), &res), EFAULT);
639 1.4 thorpej }
640 1.4 thorpej ATF_TC_CLEANUP(ufetch_16_nearmax_overflow, tc)
641 1.4 thorpej {
642 1.4 thorpej unload_module();
643 1.4 thorpej }
644 1.4 thorpej
645 1.4 thorpej ATF_TC_WITH_CLEANUP(ufetch_32_nearmax_overflow);
646 1.4 thorpej ATF_TC_HEAD(ufetch_32_nearmax_overflow, tc)
647 1.4 thorpej {
648 1.4 thorpej atf_tc_set_md_var(tc, "descr",
649 1.4 thorpej "test for correct ufetch_32 near-VM_MAX_ADDRESS pointer behavior");
650 1.4 thorpej }
651 1.4 thorpej ATF_TC_BODY(ufetch_32_nearmax_overflow, tc)
652 1.4 thorpej {
653 1.4 thorpej uint32_t res;
654 1.4 thorpej
655 1.4 thorpej CHECK_MODULE();
656 1.4 thorpej
657 1.4 thorpej /*
658 1.4 thorpej * For no-strict-alignment platforms: address checks must return
659 1.4 thorpej * EFAULT.
660 1.4 thorpej *
661 1.4 thorpej * For strict-alignment platforms: alignment checks must return
662 1.4 thorpej * EFAULT.
663 1.4 thorpej */
664 1.4 thorpej ATF_REQUIRE_EQ(do_ufetch_32(vm_max_address_minus(3), &res), EFAULT);
665 1.4 thorpej }
666 1.4 thorpej ATF_TC_CLEANUP(ufetch_32_nearmax_overflow, tc)
667 1.4 thorpej {
668 1.4 thorpej unload_module();
669 1.4 thorpej }
670 1.4 thorpej
671 1.4 thorpej #ifdef _LP64
672 1.4 thorpej ATF_TC_WITH_CLEANUP(ufetch_64_nearmax_overflow);
673 1.4 thorpej ATF_TC_HEAD(ufetch_64_nearmax_overflow, tc)
674 1.4 thorpej {
675 1.4 thorpej atf_tc_set_md_var(tc, "descr",
676 1.4 thorpej "test for correct ufetch_64 near-VM_MAX_ADDRESS pointer behavior");
677 1.4 thorpej }
678 1.4 thorpej ATF_TC_BODY(ufetch_64_nearmax_overflow, tc)
679 1.4 thorpej {
680 1.4 thorpej uint64_t res;
681 1.4 thorpej
682 1.4 thorpej CHECK_MODULE();
683 1.4 thorpej
684 1.4 thorpej /*
685 1.4 thorpej * For no-strict-alignment platforms: address checks must return
686 1.4 thorpej * EFAULT.
687 1.4 thorpej *
688 1.4 thorpej * For strict-alignment platforms: alignment checks must return
689 1.4 thorpej * EFAULT.
690 1.4 thorpej */
691 1.4 thorpej ATF_REQUIRE_EQ(do_ufetch_64(vm_max_address_minus(7), &res), EFAULT);
692 1.4 thorpej }
693 1.4 thorpej ATF_TC_CLEANUP(ufetch_64_nearmax_overflow, tc)
694 1.4 thorpej {
695 1.4 thorpej unload_module();
696 1.4 thorpej }
697 1.4 thorpej #endif /* _LP64 */
698 1.4 thorpej
699 1.4 thorpej
700 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_8);
701 1.1 thorpej ATF_TC_HEAD(ustore_8, tc)
702 1.1 thorpej {
703 1.1 thorpej atf_tc_set_md_var(tc, "descr",
704 1.1 thorpej "test for correct ustore_8 behavior");
705 1.1 thorpej }
706 1.1 thorpej ATF_TC_BODY(ustore_8, tc)
707 1.1 thorpej {
708 1.1 thorpej struct memory_cell cell = memory_cell_initializer;
709 1.1 thorpej
710 1.1 thorpej CHECK_MODULE();
711 1.1 thorpej
712 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_8(&cell.val8[index8], test_pattern8), 0);
713 1.1 thorpej ATF_REQUIRE(memory_cell_check_guard(&cell));
714 1.1 thorpej ATF_REQUIRE(read_test_cell(&cell) == test_cell_val8);
715 1.1 thorpej }
716 1.1 thorpej ATF_TC_CLEANUP(ustore_8, tc)
717 1.1 thorpej {
718 1.1 thorpej unload_module();
719 1.1 thorpej }
720 1.1 thorpej
721 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_16);
722 1.1 thorpej ATF_TC_HEAD(ustore_16, tc)
723 1.1 thorpej {
724 1.1 thorpej atf_tc_set_md_var(tc, "descr",
725 1.1 thorpej "test for correct ustore_16 behavior");
726 1.1 thorpej }
727 1.1 thorpej ATF_TC_BODY(ustore_16, tc)
728 1.1 thorpej {
729 1.1 thorpej struct memory_cell cell = memory_cell_initializer;
730 1.1 thorpej
731 1.1 thorpej CHECK_MODULE();
732 1.1 thorpej
733 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_16(&cell.val16[index16], test_pattern16), 0);
734 1.1 thorpej ATF_REQUIRE(memory_cell_check_guard(&cell));
735 1.1 thorpej ATF_REQUIRE(read_test_cell(&cell) == test_cell_val16);
736 1.1 thorpej }
737 1.1 thorpej ATF_TC_CLEANUP(ustore_16, tc)
738 1.1 thorpej {
739 1.1 thorpej unload_module();
740 1.1 thorpej }
741 1.1 thorpej
742 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_32);
743 1.1 thorpej ATF_TC_HEAD(ustore_32, tc)
744 1.1 thorpej {
745 1.1 thorpej atf_tc_set_md_var(tc, "descr",
746 1.1 thorpej "test for correct ustore_32 behavior");
747 1.1 thorpej }
748 1.1 thorpej ATF_TC_BODY(ustore_32, tc)
749 1.1 thorpej {
750 1.1 thorpej struct memory_cell cell = memory_cell_initializer;
751 1.1 thorpej
752 1.1 thorpej CHECK_MODULE();
753 1.1 thorpej
754 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_32(&cell.val32[index32], test_pattern32), 0);
755 1.1 thorpej ATF_REQUIRE(memory_cell_check_guard(&cell));
756 1.1 thorpej ATF_REQUIRE(read_test_cell(&cell) == test_cell_val32);
757 1.1 thorpej }
758 1.1 thorpej ATF_TC_CLEANUP(ustore_32, tc)
759 1.1 thorpej {
760 1.1 thorpej unload_module();
761 1.1 thorpej }
762 1.1 thorpej
763 1.1 thorpej #ifdef _LP64
764 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_64);
765 1.1 thorpej ATF_TC_HEAD(ustore_64, tc)
766 1.1 thorpej {
767 1.1 thorpej atf_tc_set_md_var(tc, "descr",
768 1.1 thorpej "test for correct ustore_64 behavior");
769 1.1 thorpej }
770 1.1 thorpej ATF_TC_BODY(ustore_64, tc)
771 1.1 thorpej {
772 1.1 thorpej struct memory_cell cell = memory_cell_initializer;
773 1.1 thorpej
774 1.1 thorpej CHECK_MODULE();
775 1.1 thorpej
776 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_64(&cell.val64, test_pattern64), 0);
777 1.1 thorpej ATF_REQUIRE(memory_cell_check_guard(&cell));
778 1.1 thorpej ATF_REQUIRE(read_test_cell(&cell) == test_cell_val64);
779 1.1 thorpej }
780 1.1 thorpej ATF_TC_CLEANUP(ustore_64, tc)
781 1.1 thorpej {
782 1.1 thorpej unload_module();
783 1.1 thorpej }
784 1.1 thorpej #endif /* _LP64 */
785 1.1 thorpej
786 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_8_null);
787 1.1 thorpej ATF_TC_HEAD(ustore_8_null, tc)
788 1.1 thorpej {
789 1.1 thorpej atf_tc_set_md_var(tc, "descr",
790 1.1 thorpej "test for correct ustore_8 NULL pointer behavior");
791 1.1 thorpej }
792 1.1 thorpej ATF_TC_BODY(ustore_8_null, tc)
793 1.1 thorpej {
794 1.1 thorpej CHECK_MODULE();
795 1.1 thorpej
796 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_8(NULL, 0), EFAULT);
797 1.1 thorpej }
798 1.1 thorpej ATF_TC_CLEANUP(ustore_8_null, tc)
799 1.1 thorpej {
800 1.1 thorpej unload_module();
801 1.1 thorpej }
802 1.1 thorpej
803 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_16_null);
804 1.1 thorpej ATF_TC_HEAD(ustore_16_null, tc)
805 1.1 thorpej {
806 1.1 thorpej atf_tc_set_md_var(tc, "descr",
807 1.1 thorpej "test for correct ustore_16 NULL pointer behavior");
808 1.1 thorpej }
809 1.1 thorpej ATF_TC_BODY(ustore_16_null, tc)
810 1.1 thorpej {
811 1.1 thorpej CHECK_MODULE();
812 1.1 thorpej
813 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_16(NULL, 0), EFAULT);
814 1.1 thorpej }
815 1.1 thorpej ATF_TC_CLEANUP(ustore_16_null, tc)
816 1.1 thorpej {
817 1.1 thorpej unload_module();
818 1.1 thorpej }
819 1.1 thorpej
820 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_32_null);
821 1.1 thorpej ATF_TC_HEAD(ustore_32_null, tc)
822 1.1 thorpej {
823 1.1 thorpej atf_tc_set_md_var(tc, "descr",
824 1.1 thorpej "test for correct ustore_32 NULL pointer behavior");
825 1.1 thorpej }
826 1.1 thorpej ATF_TC_BODY(ustore_32_null, tc)
827 1.1 thorpej {
828 1.1 thorpej CHECK_MODULE();
829 1.1 thorpej
830 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_32(NULL, 0), EFAULT);
831 1.1 thorpej }
832 1.1 thorpej ATF_TC_CLEANUP(ustore_32_null, tc)
833 1.1 thorpej {
834 1.1 thorpej unload_module();
835 1.1 thorpej }
836 1.1 thorpej
837 1.1 thorpej #ifdef _LP64
838 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_64_null);
839 1.1 thorpej ATF_TC_HEAD(ustore_64_null, tc)
840 1.1 thorpej {
841 1.1 thorpej atf_tc_set_md_var(tc, "descr",
842 1.1 thorpej "test for correct ustore_64 NULL pointer behavior");
843 1.1 thorpej }
844 1.1 thorpej ATF_TC_BODY(ustore_64_null, tc)
845 1.1 thorpej {
846 1.1 thorpej CHECK_MODULE();
847 1.1 thorpej
848 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_64(NULL, 0), EFAULT);
849 1.1 thorpej }
850 1.1 thorpej ATF_TC_CLEANUP(ustore_64_null, tc)
851 1.1 thorpej {
852 1.1 thorpej unload_module();
853 1.1 thorpej }
854 1.1 thorpej #endif /* _LP64 */
855 1.1 thorpej
856 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_8_max);
857 1.1 thorpej ATF_TC_HEAD(ustore_8_max, tc)
858 1.1 thorpej {
859 1.1 thorpej atf_tc_set_md_var(tc, "descr",
860 1.1 thorpej "test for correct ustore_8 VM_MAX_ADDRESS pointer behavior");
861 1.1 thorpej }
862 1.1 thorpej ATF_TC_BODY(ustore_8_max, tc)
863 1.1 thorpej {
864 1.1 thorpej CHECK_MODULE();
865 1.1 thorpej
866 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_8(vm_max_address(), 0), EFAULT);
867 1.1 thorpej }
868 1.1 thorpej ATF_TC_CLEANUP(ustore_8_max, tc)
869 1.1 thorpej {
870 1.1 thorpej unload_module();
871 1.1 thorpej }
872 1.1 thorpej
873 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_16_max);
874 1.1 thorpej ATF_TC_HEAD(ustore_16_max, tc)
875 1.1 thorpej {
876 1.1 thorpej atf_tc_set_md_var(tc, "descr",
877 1.1 thorpej "test for correct ustore_16 VM_MAX_ADDRESS pointer behavior");
878 1.1 thorpej }
879 1.1 thorpej ATF_TC_BODY(ustore_16_max, tc)
880 1.1 thorpej {
881 1.1 thorpej CHECK_MODULE();
882 1.1 thorpej
883 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_16(vm_max_address(), 0), EFAULT);
884 1.1 thorpej }
885 1.1 thorpej ATF_TC_CLEANUP(ustore_16_max, tc)
886 1.1 thorpej {
887 1.1 thorpej unload_module();
888 1.1 thorpej }
889 1.1 thorpej
890 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_32_max);
891 1.1 thorpej ATF_TC_HEAD(ustore_32_max, tc)
892 1.1 thorpej {
893 1.1 thorpej atf_tc_set_md_var(tc, "descr",
894 1.1 thorpej "test for correct ustore_32 VM_MAX_ADDRESS pointer behavior");
895 1.1 thorpej }
896 1.1 thorpej ATF_TC_BODY(ustore_32_max, tc)
897 1.1 thorpej {
898 1.1 thorpej CHECK_MODULE();
899 1.1 thorpej
900 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_32(vm_max_address(), 0), EFAULT);
901 1.1 thorpej }
902 1.1 thorpej ATF_TC_CLEANUP(ustore_32_max, tc)
903 1.1 thorpej {
904 1.1 thorpej unload_module();
905 1.1 thorpej }
906 1.1 thorpej
907 1.1 thorpej #ifdef _LP64
908 1.1 thorpej ATF_TC_WITH_CLEANUP(ustore_64_max);
909 1.1 thorpej ATF_TC_HEAD(ustore_64_max, tc)
910 1.1 thorpej {
911 1.1 thorpej atf_tc_set_md_var(tc, "descr",
912 1.1 thorpej "test for correct ustore_64 VM_MAX_ADDRESS pointer behavior");
913 1.1 thorpej }
914 1.1 thorpej ATF_TC_BODY(ustore_64_max, tc)
915 1.1 thorpej {
916 1.1 thorpej CHECK_MODULE();
917 1.1 thorpej
918 1.1 thorpej ATF_REQUIRE_EQ(do_ustore_64(vm_max_address(), 0), EFAULT);
919 1.1 thorpej }
920 1.1 thorpej ATF_TC_CLEANUP(ustore_64_max, tc)
921 1.1 thorpej {
922 1.1 thorpej unload_module();
923 1.1 thorpej }
924 1.1 thorpej #endif /* _LP64 */
925 1.1 thorpej
926 1.4 thorpej ATF_TC_WITH_CLEANUP(ustore_16_nearmax_overflow);
927 1.4 thorpej ATF_TC_HEAD(ustore_16_nearmax_overflow, tc)
928 1.4 thorpej {
929 1.4 thorpej atf_tc_set_md_var(tc, "descr",
930 1.4 thorpej "test for correct ustore_16 VM_MAX_ADDRESS pointer behavior");
931 1.4 thorpej }
932 1.4 thorpej ATF_TC_BODY(ustore_16_nearmax_overflow, tc)
933 1.4 thorpej {
934 1.4 thorpej CHECK_MODULE();
935 1.4 thorpej
936 1.4 thorpej /*
937 1.4 thorpej * For no-strict-alignment platforms: address checks must return
938 1.4 thorpej * EFAULT.
939 1.4 thorpej *
940 1.4 thorpej * For strict-alignment platforms: alignment checks must return
941 1.4 thorpej * EFAULT.
942 1.4 thorpej */
943 1.4 thorpej ATF_REQUIRE_EQ(do_ustore_16(vm_max_address_minus(1), 0), EFAULT);
944 1.4 thorpej }
945 1.4 thorpej ATF_TC_CLEANUP(ustore_16_nearmax_overflow, tc)
946 1.4 thorpej {
947 1.4 thorpej unload_module();
948 1.4 thorpej }
949 1.4 thorpej
950 1.4 thorpej ATF_TC_WITH_CLEANUP(ustore_32_nearmax_overflow);
951 1.4 thorpej ATF_TC_HEAD(ustore_32_nearmax_overflow, tc)
952 1.4 thorpej {
953 1.4 thorpej atf_tc_set_md_var(tc, "descr",
954 1.4 thorpej "test for correct ustore_32 VM_MAX_ADDRESS pointer behavior");
955 1.4 thorpej }
956 1.4 thorpej ATF_TC_BODY(ustore_32_nearmax_overflow, tc)
957 1.4 thorpej {
958 1.4 thorpej CHECK_MODULE();
959 1.4 thorpej
960 1.4 thorpej /*
961 1.4 thorpej * For no-strict-alignment platforms: address checks must return
962 1.4 thorpej * EFAULT.
963 1.4 thorpej *
964 1.4 thorpej * For strict-alignment platforms: alignment checks must return
965 1.4 thorpej * EFAULT.
966 1.4 thorpej */
967 1.4 thorpej ATF_REQUIRE_EQ(do_ustore_32(vm_max_address_minus(3), 0), EFAULT);
968 1.4 thorpej }
969 1.4 thorpej ATF_TC_CLEANUP(ustore_32_nearmax_overflow, tc)
970 1.4 thorpej {
971 1.4 thorpej unload_module();
972 1.4 thorpej }
973 1.4 thorpej
974 1.4 thorpej #ifdef _LP64
975 1.4 thorpej ATF_TC_WITH_CLEANUP(ustore_64_nearmax_overflow);
976 1.4 thorpej ATF_TC_HEAD(ustore_64_nearmax_overflow, tc)
977 1.4 thorpej {
978 1.4 thorpej atf_tc_set_md_var(tc, "descr",
979 1.4 thorpej "test for correct ustore_64 VM_MAX_ADDRESS pointer behavior");
980 1.4 thorpej }
981 1.4 thorpej ATF_TC_BODY(ustore_64_nearmax_overflow, tc)
982 1.4 thorpej {
983 1.4 thorpej CHECK_MODULE();
984 1.4 thorpej
985 1.4 thorpej /*
986 1.4 thorpej * For no-strict-alignment platforms: address checks must return
987 1.4 thorpej * EFAULT.
988 1.4 thorpej *
989 1.4 thorpej * For strict-alignment platforms: alignment checks must return
990 1.4 thorpej * EFAULT.
991 1.4 thorpej */
992 1.4 thorpej ATF_REQUIRE_EQ(do_ustore_64(vm_max_address_minus(7), 0), EFAULT);
993 1.4 thorpej }
994 1.4 thorpej ATF_TC_CLEANUP(ustore_64_nearmax_overflow, tc)
995 1.4 thorpej {
996 1.4 thorpej unload_module();
997 1.4 thorpej }
998 1.4 thorpej #endif /* _LP64 */
999 1.4 thorpej
1000 1.4 thorpej
1001 1.1 thorpej ATF_TC_WITH_CLEANUP(ucas_32);
1002 1.1 thorpej ATF_TC_HEAD(ucas_32, tc)
1003 1.1 thorpej {
1004 1.1 thorpej atf_tc_set_md_var(tc, "descr",
1005 1.1 thorpej "test for correct ucas_32 behavior");
1006 1.1 thorpej }
1007 1.1 thorpej ATF_TC_BODY(ucas_32, tc)
1008 1.1 thorpej {
1009 1.1 thorpej uint32_t cell = 0xdeadbeef;
1010 1.1 thorpej uint32_t actual = 0;
1011 1.1 thorpej
1012 1.1 thorpej CHECK_MODULE();
1013 1.1 thorpej
1014 1.1 thorpej ATF_REQUIRE_EQ(do_ucas_32(&cell, 0xdeadbeef, 0xbeefdead, &actual), 0);
1015 1.1 thorpej ATF_REQUIRE(actual == 0xdeadbeef);
1016 1.1 thorpej ATF_REQUIRE(cell == 0xbeefdead);
1017 1.1 thorpej }
1018 1.1 thorpej ATF_TC_CLEANUP(ucas_32, tc)
1019 1.1 thorpej {
1020 1.1 thorpej unload_module();
1021 1.1 thorpej }
1022 1.1 thorpej
1023 1.1 thorpej #ifdef _LP64
1024 1.1 thorpej ATF_TC_WITH_CLEANUP(ucas_64);
1025 1.1 thorpej ATF_TC_HEAD(ucas_64, tc)
1026 1.1 thorpej {
1027 1.1 thorpej atf_tc_set_md_var(tc, "descr",
1028 1.1 thorpej "test for correct ucas_64 behavior");
1029 1.1 thorpej }
1030 1.1 thorpej ATF_TC_BODY(ucas_64, tc)
1031 1.1 thorpej {
1032 1.1 thorpej uint64_t cell = 0xdeadbeef;
1033 1.1 thorpej uint64_t actual = 0;
1034 1.1 thorpej
1035 1.1 thorpej CHECK_MODULE();
1036 1.1 thorpej
1037 1.1 thorpej ATF_REQUIRE_EQ(do_ucas_64(&cell, 0xdeadbeef, 0xbeefdead, &actual), 0);
1038 1.1 thorpej ATF_REQUIRE(actual == 0xdeadbeef);
1039 1.1 thorpej ATF_REQUIRE(cell == 0xbeefdead);
1040 1.1 thorpej }
1041 1.1 thorpej ATF_TC_CLEANUP(ucas_64, tc)
1042 1.1 thorpej {
1043 1.1 thorpej unload_module();
1044 1.1 thorpej }
1045 1.1 thorpej #endif /* _LP64 */
1046 1.1 thorpej
1047 1.1 thorpej ATF_TC_WITH_CLEANUP(ucas_32_miscompare);
1048 1.1 thorpej ATF_TC_HEAD(ucas_32_miscompare, tc)
1049 1.1 thorpej {
1050 1.1 thorpej atf_tc_set_md_var(tc, "descr",
1051 1.1 thorpej "test for correct ucas_32 behavior with miscompare");
1052 1.1 thorpej }
1053 1.1 thorpej ATF_TC_BODY(ucas_32_miscompare, tc)
1054 1.1 thorpej {
1055 1.1 thorpej uint32_t cell = 0xa5a5a5a5;
1056 1.1 thorpej uint32_t actual = 0;
1057 1.1 thorpej
1058 1.1 thorpej CHECK_MODULE();
1059 1.1 thorpej
1060 1.1 thorpej ATF_REQUIRE_EQ(do_ucas_32(&cell, 0xdeadbeef, 0xbeefdead, &actual), 0);
1061 1.1 thorpej ATF_REQUIRE(actual == 0xa5a5a5a5);
1062 1.1 thorpej ATF_REQUIRE(cell == 0xa5a5a5a5);
1063 1.1 thorpej }
1064 1.1 thorpej ATF_TC_CLEANUP(ucas_32_miscompare, tc)
1065 1.1 thorpej {
1066 1.1 thorpej unload_module();
1067 1.1 thorpej }
1068 1.1 thorpej
1069 1.1 thorpej #ifdef _LP64
1070 1.1 thorpej ATF_TC_WITH_CLEANUP(ucas_64_miscompare);
1071 1.1 thorpej ATF_TC_HEAD(ucas_64_miscompare, tc)
1072 1.1 thorpej {
1073 1.1 thorpej atf_tc_set_md_var(tc, "descr",
1074 1.1 thorpej "test for correct ucas_64 behavior with miscompare");
1075 1.1 thorpej }
1076 1.1 thorpej ATF_TC_BODY(ucas_64_miscompare, tc)
1077 1.1 thorpej {
1078 1.1 thorpej uint64_t cell = 0xa5a5a5a5;
1079 1.1 thorpej uint64_t actual = 0;
1080 1.1 thorpej
1081 1.1 thorpej CHECK_MODULE();
1082 1.1 thorpej
1083 1.1 thorpej ATF_REQUIRE_EQ(do_ucas_64(&cell, 0xdeadbeef, 0xbeefdead, &actual), 0);
1084 1.1 thorpej ATF_REQUIRE(actual == 0xa5a5a5a5);
1085 1.1 thorpej ATF_REQUIRE(cell == 0xa5a5a5a5);
1086 1.1 thorpej }
1087 1.1 thorpej ATF_TC_CLEANUP(ucas_64_miscompare, tc)
1088 1.1 thorpej {
1089 1.1 thorpej unload_module();
1090 1.1 thorpej }
1091 1.1 thorpej #endif /* _LP64 */
1092 1.1 thorpej
1093 1.1 thorpej ATF_TC_WITH_CLEANUP(ucas_32_null);
1094 1.1 thorpej ATF_TC_HEAD(ucas_32_null, tc)
1095 1.1 thorpej {
1096 1.1 thorpej atf_tc_set_md_var(tc, "descr",
1097 1.1 thorpej "test for correct ucas_32 NULL pointer behavior");
1098 1.1 thorpej }
1099 1.1 thorpej ATF_TC_BODY(ucas_32_null, tc)
1100 1.1 thorpej {
1101 1.1 thorpej uint32_t actual = 0;
1102 1.1 thorpej
1103 1.1 thorpej CHECK_MODULE();
1104 1.1 thorpej
1105 1.1 thorpej ATF_REQUIRE_EQ(do_ucas_32(NULL, 0xdeadbeef, 0xbeefdead, &actual),
1106 1.1 thorpej EFAULT);
1107 1.1 thorpej }
1108 1.1 thorpej ATF_TC_CLEANUP(ucas_32_null, tc)
1109 1.1 thorpej {
1110 1.1 thorpej unload_module();
1111 1.1 thorpej }
1112 1.1 thorpej
1113 1.1 thorpej #ifdef _LP64
1114 1.1 thorpej ATF_TC_WITH_CLEANUP(ucas_64_null);
1115 1.1 thorpej ATF_TC_HEAD(ucas_64_null, tc)
1116 1.1 thorpej {
1117 1.1 thorpej atf_tc_set_md_var(tc, "descr",
1118 1.1 thorpej "test for correct ucas_64 NULL pointer behavior");
1119 1.1 thorpej }
1120 1.1 thorpej ATF_TC_BODY(ucas_64_null, tc)
1121 1.1 thorpej {
1122 1.1 thorpej uint64_t actual = 0;
1123 1.1 thorpej
1124 1.1 thorpej CHECK_MODULE();
1125 1.1 thorpej
1126 1.1 thorpej ATF_REQUIRE_EQ(do_ucas_64(NULL, 0xdeadbeef, 0xbeefdead, &actual),
1127 1.1 thorpej EFAULT);
1128 1.1 thorpej }
1129 1.1 thorpej ATF_TC_CLEANUP(ucas_64_null, tc)
1130 1.1 thorpej {
1131 1.1 thorpej unload_module();
1132 1.1 thorpej }
1133 1.1 thorpej #endif /* _LP64 */
1134 1.1 thorpej
1135 1.1 thorpej ATF_TC_WITH_CLEANUP(ucas_32_max);
1136 1.1 thorpej ATF_TC_HEAD(ucas_32_max, tc)
1137 1.1 thorpej {
1138 1.1 thorpej atf_tc_set_md_var(tc, "descr",
1139 1.1 thorpej "test for correct ucas_32 VM_MAX_ADDRESS pointer behavior");
1140 1.1 thorpej }
1141 1.1 thorpej ATF_TC_BODY(ucas_32_max, tc)
1142 1.1 thorpej {
1143 1.1 thorpej uint32_t actual = 0;
1144 1.1 thorpej
1145 1.1 thorpej CHECK_MODULE();
1146 1.1 thorpej
1147 1.1 thorpej ATF_REQUIRE_EQ(do_ucas_32(vm_max_address(), 0xdeadbeef, 0xbeefdead,
1148 1.1 thorpej &actual), EFAULT);
1149 1.1 thorpej }
1150 1.1 thorpej ATF_TC_CLEANUP(ucas_32_max, tc)
1151 1.1 thorpej {
1152 1.1 thorpej unload_module();
1153 1.1 thorpej }
1154 1.1 thorpej
1155 1.1 thorpej #ifdef _LP64
1156 1.1 thorpej ATF_TC_WITH_CLEANUP(ucas_64_max);
1157 1.1 thorpej ATF_TC_HEAD(ucas_64_max, tc)
1158 1.1 thorpej {
1159 1.1 thorpej atf_tc_set_md_var(tc, "descr",
1160 1.1 thorpej "test for correct ucas_64 VM_MAX_ADDRESS pointer behavior");
1161 1.1 thorpej }
1162 1.1 thorpej ATF_TC_BODY(ucas_64_max, tc)
1163 1.1 thorpej {
1164 1.1 thorpej uint64_t actual = 0;
1165 1.1 thorpej
1166 1.1 thorpej CHECK_MODULE();
1167 1.1 thorpej
1168 1.1 thorpej ATF_REQUIRE_EQ(do_ucas_64(vm_max_address(), 0xdeadbeef, 0xbeefdead,
1169 1.1 thorpej &actual), EFAULT);
1170 1.1 thorpej }
1171 1.1 thorpej ATF_TC_CLEANUP(ucas_64_max, tc)
1172 1.1 thorpej {
1173 1.1 thorpej unload_module();
1174 1.1 thorpej }
1175 1.1 thorpej #endif /* _LP64 */
1176 1.1 thorpej
1177 1.4 thorpej ATF_TC_WITH_CLEANUP(ucas_32_nearmax_overflow);
1178 1.4 thorpej ATF_TC_HEAD(ucas_32_nearmax_overflow, tc)
1179 1.4 thorpej {
1180 1.4 thorpej atf_tc_set_md_var(tc, "descr",
1181 1.4 thorpej "test for correct ucas_32 near-VM_MAX_ADDRESS pointer behavior");
1182 1.4 thorpej }
1183 1.4 thorpej ATF_TC_BODY(ucas_32_nearmax_overflow, tc)
1184 1.4 thorpej {
1185 1.4 thorpej uint32_t actual = 0;
1186 1.4 thorpej
1187 1.4 thorpej CHECK_MODULE();
1188 1.4 thorpej
1189 1.4 thorpej /*
1190 1.4 thorpej * For no-strict-alignment platforms: address checks must return
1191 1.4 thorpej * EFAULT.
1192 1.4 thorpej *
1193 1.4 thorpej * For strict-alignment platforms: alignment checks must return
1194 1.4 thorpej * EFAULT.
1195 1.4 thorpej */
1196 1.4 thorpej ATF_REQUIRE_EQ(do_ucas_32(vm_max_address_minus(3), 0xdeadbeef,
1197 1.4 thorpej 0xbeefdead, &actual), EFAULT);
1198 1.4 thorpej }
1199 1.4 thorpej ATF_TC_CLEANUP(ucas_32_nearmax_overflow, tc)
1200 1.4 thorpej {
1201 1.4 thorpej unload_module();
1202 1.4 thorpej }
1203 1.4 thorpej
1204 1.4 thorpej #ifdef _LP64
1205 1.4 thorpej ATF_TC_WITH_CLEANUP(ucas_64_nearmax_overflow);
1206 1.4 thorpej ATF_TC_HEAD(ucas_64_nearmax_overflow, tc)
1207 1.4 thorpej {
1208 1.4 thorpej atf_tc_set_md_var(tc, "descr",
1209 1.4 thorpej "test for correct ucas_64 near-VM_MAX_ADDRESS pointer behavior");
1210 1.4 thorpej }
1211 1.4 thorpej ATF_TC_BODY(ucas_64_nearmax_overflow, tc)
1212 1.4 thorpej {
1213 1.4 thorpej uint64_t actual = 0;
1214 1.4 thorpej
1215 1.4 thorpej CHECK_MODULE();
1216 1.4 thorpej
1217 1.4 thorpej /*
1218 1.4 thorpej * For no-strict-alignment platforms: address checks must return
1219 1.4 thorpej * EFAULT.
1220 1.4 thorpej *
1221 1.4 thorpej * For strict-alignment platforms: alignment checks must return
1222 1.4 thorpej * EFAULT.
1223 1.4 thorpej */
1224 1.4 thorpej ATF_REQUIRE_EQ(do_ucas_64(vm_max_address_minus(7), 0xdeadbeef,
1225 1.4 thorpej 0xbeefdead, &actual), EFAULT);
1226 1.4 thorpej }
1227 1.4 thorpej ATF_TC_CLEANUP(ucas_64_nearmax_overflow, tc)
1228 1.4 thorpej {
1229 1.4 thorpej unload_module();
1230 1.4 thorpej }
1231 1.4 thorpej #endif /* _LP64 */
1232 1.4 thorpej
1233 1.1 thorpej ATF_TP_ADD_TCS(tp)
1234 1.1 thorpej {
1235 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_8);
1236 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_16);
1237 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_32);
1238 1.1 thorpej #ifdef _LP64
1239 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_64);
1240 1.1 thorpej #endif
1241 1.1 thorpej
1242 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_8_null);
1243 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_16_null);
1244 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_32_null);
1245 1.1 thorpej #ifdef _LP64
1246 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_64_null);
1247 1.1 thorpej #endif
1248 1.1 thorpej
1249 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_8_max);
1250 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_16_max);
1251 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_32_max);
1252 1.1 thorpej #ifdef _LP64
1253 1.1 thorpej ATF_TP_ADD_TC(tp, ufetch_64_max);
1254 1.1 thorpej #endif
1255 1.1 thorpej
1256 1.4 thorpej ATF_TP_ADD_TC(tp, ufetch_16_nearmax_overflow);
1257 1.4 thorpej ATF_TP_ADD_TC(tp, ufetch_32_nearmax_overflow);
1258 1.4 thorpej #ifdef _LP64
1259 1.4 thorpej ATF_TP_ADD_TC(tp, ufetch_64_nearmax_overflow);
1260 1.4 thorpej #endif
1261 1.4 thorpej
1262 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_8);
1263 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_16);
1264 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_32);
1265 1.1 thorpej #ifdef _LP64
1266 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_64);
1267 1.1 thorpej #endif
1268 1.1 thorpej
1269 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_8_null);
1270 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_16_null);
1271 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_32_null);
1272 1.1 thorpej #ifdef _LP64
1273 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_64_null);
1274 1.1 thorpej #endif
1275 1.1 thorpej
1276 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_8_max);
1277 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_16_max);
1278 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_32_max);
1279 1.1 thorpej #ifdef _LP64
1280 1.1 thorpej ATF_TP_ADD_TC(tp, ustore_64_max);
1281 1.1 thorpej #endif
1282 1.1 thorpej
1283 1.4 thorpej ATF_TP_ADD_TC(tp, ustore_16_nearmax_overflow);
1284 1.4 thorpej ATF_TP_ADD_TC(tp, ustore_32_nearmax_overflow);
1285 1.4 thorpej #ifdef _LP64
1286 1.4 thorpej ATF_TP_ADD_TC(tp, ustore_64_nearmax_overflow);
1287 1.4 thorpej #endif
1288 1.4 thorpej
1289 1.1 thorpej ATF_TP_ADD_TC(tp, ucas_32);
1290 1.1 thorpej #ifdef _LP64
1291 1.1 thorpej ATF_TP_ADD_TC(tp, ucas_64);
1292 1.1 thorpej #endif
1293 1.1 thorpej
1294 1.1 thorpej ATF_TP_ADD_TC(tp, ucas_32_miscompare);
1295 1.1 thorpej #ifdef _LP64
1296 1.1 thorpej ATF_TP_ADD_TC(tp, ucas_64_miscompare);
1297 1.1 thorpej #endif
1298 1.1 thorpej
1299 1.1 thorpej ATF_TP_ADD_TC(tp, ucas_32_null);
1300 1.1 thorpej #ifdef _LP64
1301 1.1 thorpej ATF_TP_ADD_TC(tp, ucas_64_null);
1302 1.1 thorpej #endif
1303 1.1 thorpej
1304 1.1 thorpej ATF_TP_ADD_TC(tp, ucas_32_max);
1305 1.1 thorpej #ifdef _LP64
1306 1.1 thorpej ATF_TP_ADD_TC(tp, ucas_64_max);
1307 1.1 thorpej #endif
1308 1.1 thorpej
1309 1.4 thorpej ATF_TP_ADD_TC(tp, ucas_32_nearmax_overflow);
1310 1.4 thorpej #ifdef _LP64
1311 1.4 thorpej ATF_TP_ADD_TC(tp, ucas_64_nearmax_overflow);
1312 1.4 thorpej #endif
1313 1.4 thorpej
1314 1.1 thorpej return atf_no_error();
1315 1.1 thorpej }
1316