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