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