t_siginfo.c revision 276478
1353141Sphilip/* $NetBSD: t_siginfo.c,v 1.24 2014/11/04 00:20:19 justin Exp $ */ 2353141Sphilip 3353141Sphilip/*- 4353141Sphilip * Copyright (c) 2010 The NetBSD Foundation, Inc. 5353141Sphilip * All rights reserved. 6353141Sphilip * 7353141Sphilip * Redistribution and use in source and binary forms, with or without 8353141Sphilip * modification, are permitted provided that the following conditions 9353141Sphilip * are met: 10353141Sphilip * 1. Redistributions of source code must retain the above copyright 11353141Sphilip * notice, this list of conditions and the following disclaimer. 12353141Sphilip * 2. Redistributions in binary form must reproduce the above copyright 13353141Sphilip * notice, this list of conditions and the following disclaimer in the 14353141Sphilip * documentation and/or other materials provided with the distribution. 15353141Sphilip * 16353141Sphilip * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17353141Sphilip * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18353141Sphilip * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19353141Sphilip * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20353141Sphilip * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21353141Sphilip * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22353141Sphilip * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23353141Sphilip * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24353141Sphilip * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25353141Sphilip * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26353141Sphilip * POSSIBILITY OF SUCH DAMAGE. 27353141Sphilip */ 28353141Sphilip 29353141Sphilip#include <atf-c.h> 30353141Sphilip 31353141Sphilip#ifdef __NetBSD__ 32353141Sphilip#include <sys/inttypes.h> 33353141Sphilip#endif 34353141Sphilip#include <sys/resource.h> 35353141Sphilip#include <sys/sysctl.h> 36353141Sphilip#include <sys/time.h> 37353141Sphilip#include <sys/ucontext.h> 38353141Sphilip#include <sys/wait.h> 39353141Sphilip 40353141Sphilip#include <assert.h> 41353141Sphilip#include <signal.h> 42353141Sphilip#include <stdio.h> 43353141Sphilip#include <stdlib.h> 44353141Sphilip#include <string.h> 45353141Sphilip#include <unistd.h> 46353141Sphilip#include <setjmp.h> 47353141Sphilip#include <float.h> 48353141Sphilip 49353141Sphilip#ifdef HAVE_FENV 50353141Sphilip#include <fenv.h> 51353141Sphilip#elif defined(_FLOAT_IEEE754) 52353141Sphilip#include <ieeefp.h> 53353141Sphilip#endif 54353141Sphilip 55353141Sphilip#include "isqemu.h" 56353141Sphilip 57353141Sphilip/* for sigbus */ 58353141Sphilipvolatile char *addr; 59353141Sphilip 60353141Sphilip/* for sigchild */ 61353141Sphilippid_t child; 62353141Sphilipint code; 63353141Sphilipint status; 64353141Sphilip 65353141Sphilip/* for sigfpe */ 66353141Sphilipsig_atomic_t fltdiv_signalled = 0; 67353141Sphilipsig_atomic_t intdiv_signalled = 0; 68353141Sphilip 69353141Sphilipstatic void 70353141Sphilipsig_debug(int signo, siginfo_t *info, ucontext_t *ctx) 71353141Sphilip{ 72353141Sphilip unsigned int i; 73353141Sphilip 74353141Sphilip printf("%d %p %p\n", signo, info, ctx); 75353141Sphilip if (info != NULL) { 76353141Sphilip printf("si_signo=%d\n", info->si_signo); 77353141Sphilip printf("si_errno=%d\n", info->si_errno); 78353141Sphilip printf("si_code=%d\n", info->si_code); 79353141Sphilip printf("si_value.sival_int=%d\n", info->si_value.sival_int); 80353141Sphilip } 81353141Sphilip if (ctx != NULL) { 82353141Sphilip printf("uc_flags 0x%x\n", ctx->uc_flags); 83353141Sphilip printf("uc_link %p\n", ctx->uc_link); 84353141Sphilip for (i = 0; i < __arraycount(ctx->uc_sigmask.__bits); i++) 85353141Sphilip printf("uc_sigmask[%d] 0x%x\n", i, 86353141Sphilip ctx->uc_sigmask.__bits[i]); 87353141Sphilip printf("uc_stack %p %lu 0x%x\n", ctx->uc_stack.ss_sp, 88353141Sphilip (unsigned long)ctx->uc_stack.ss_size, 89353141Sphilip ctx->uc_stack.ss_flags); 90353141Sphilip#ifdef __NetBSD__ 91353141Sphilip for (i = 0; i < __arraycount(ctx->uc_mcontext.__gregs); i++) 92353141Sphilip printf("uc_mcontext.greg[%d] 0x%lx\n", i, 93353141Sphilip (long)ctx->uc_mcontext.__gregs[i]); 94353141Sphilip#endif 95353141Sphilip } 96353141Sphilip} 97353141Sphilip 98353141Sphilipstatic void 99353141Sphilipsigalrm_action(int signo, siginfo_t *info, void *ptr) 100353141Sphilip{ 101353141Sphilip 102353141Sphilip sig_debug(signo, info, (ucontext_t *)ptr); 103353141Sphilip 104353141Sphilip ATF_REQUIRE_EQ(info->si_signo, SIGALRM); 105353141Sphilip ATF_REQUIRE_EQ(info->si_code, SI_TIMER); 106353141Sphilip ATF_REQUIRE_EQ(info->si_value.sival_int, ITIMER_REAL); 107353141Sphilip 108353141Sphilip atf_tc_pass(); 109353141Sphilip /* NOTREACHED */ 110353141Sphilip} 111353141Sphilip 112353141SphilipATF_TC(sigalarm); 113353141Sphilip 114353141SphilipATF_TC_HEAD(sigalarm, tc) 115353141Sphilip{ 116353141Sphilip 117353141Sphilip atf_tc_set_md_var(tc, "descr", 118353141Sphilip "Checks that signal trampoline correctly calls SIGALRM handler"); 119353141Sphilip} 120353141Sphilip 121353141SphilipATF_TC_BODY(sigalarm, tc) 122353141Sphilip{ 123353141Sphilip struct sigaction sa; 124353141Sphilip sa.sa_flags = SA_SIGINFO; 125353141Sphilip sa.sa_sigaction = sigalrm_action; 126353141Sphilip sigemptyset(&sa.sa_mask); 127353141Sphilip sigaction(SIGALRM, &sa, NULL); 128353141Sphilip for (;;) { 129353141Sphilip alarm(1); 130353141Sphilip sleep(1); 131353141Sphilip } 132353141Sphilip atf_tc_fail("SIGALRM handler wasn't called"); 133353141Sphilip} 134353141Sphilip 135353141Sphilipstatic void 136353141Sphilipsigchild_action(int signo, siginfo_t *info, void *ptr) 137353141Sphilip{ 138353141Sphilip if (info != NULL) { 139353141Sphilip printf("info=%p\n", info); 140353141Sphilip printf("ptr=%p\n", ptr); 141353141Sphilip printf("si_signo=%d\n", info->si_signo); 142353141Sphilip printf("si_errno=%d\n", info->si_errno); 143353141Sphilip printf("si_code=%d\n", info->si_code); 144353141Sphilip printf("si_uid=%d\n", info->si_uid); 145353141Sphilip printf("si_pid=%d\n", info->si_pid); 146353141Sphilip printf("si_status=%d\n", info->si_status); 147353141Sphilip#ifdef __NetBSD__ 148353141Sphilip printf("si_utime=%lu\n", (unsigned long int)info->si_utime); 149353141Sphilip printf("si_stime=%lu\n", (unsigned long int)info->si_stime); 150353141Sphilip#endif 151353141Sphilip } 152353141Sphilip ATF_REQUIRE_EQ(info->si_code, code); 153353141Sphilip ATF_REQUIRE_EQ(info->si_signo, SIGCHLD); 154353141Sphilip ATF_REQUIRE_EQ(info->si_uid, getuid()); 155353141Sphilip ATF_REQUIRE_EQ(info->si_pid, child); 156353141Sphilip if (WIFEXITED(info->si_status)) 157353141Sphilip ATF_REQUIRE_EQ(WEXITSTATUS(info->si_status), status); 158353141Sphilip else if (WIFSTOPPED(info->si_status)) 159353141Sphilip ATF_REQUIRE_EQ(WSTOPSIG(info->si_status), status); 160353141Sphilip else if (WIFSIGNALED(info->si_status)) 161353141Sphilip ATF_REQUIRE_EQ(WTERMSIG(info->si_status), status); 162353141Sphilip} 163353141Sphilip 164353141Sphilipstatic void 165353141Sphilipsetchildhandler(void (*action)(int, siginfo_t *, void *)) 166353141Sphilip{ 167353141Sphilip struct sigaction sa; 168353141Sphilip sa.sa_flags = SA_SIGINFO; 169353141Sphilip sa.sa_sigaction = action; 170353141Sphilip sigemptyset(&sa.sa_mask); 171353141Sphilip sigaction(SIGCHLD, &sa, NULL); 172353141Sphilip} 173353141Sphilip 174353141Sphilipstatic void 175353141Sphilipsigchild_setup(void) 176353141Sphilip{ 177353141Sphilip sigset_t set; 178353141Sphilip struct rlimit rlim; 179353141Sphilip 180353141Sphilip (void)getrlimit(RLIMIT_CORE, &rlim); 181353141Sphilip rlim.rlim_cur = rlim.rlim_max; 182353141Sphilip (void)setrlimit(RLIMIT_CORE, &rlim); 183353141Sphilip 184353141Sphilip setchildhandler(sigchild_action); 185353141Sphilip sigemptyset(&set); 186353141Sphilip sigaddset(&set, SIGCHLD); 187353141Sphilip sigprocmask(SIG_BLOCK, &set, NULL); 188353141Sphilip} 189353141Sphilip 190353141SphilipATF_TC(sigchild_normal); 191353141SphilipATF_TC_HEAD(sigchild_normal, tc) 192353141Sphilip{ 193353141Sphilip 194353141Sphilip atf_tc_set_md_var(tc, "descr", 195353141Sphilip "Checks that signal trampoline correctly calls SIGCHLD handler " 196353141Sphilip "when child exits normally"); 197353141Sphilip} 198353141Sphilip 199353141SphilipATF_TC_BODY(sigchild_normal, tc) 200353141Sphilip{ 201353141Sphilip sigset_t set; 202353141Sphilip 203353141Sphilip sigchild_setup(); 204353141Sphilip 205353141Sphilip status = 25; 206353141Sphilip code = CLD_EXITED; 207353141Sphilip 208353141Sphilip switch ((child = fork())) { 209353141Sphilip case 0: 210353141Sphilip sleep(1); 211353141Sphilip exit(status); 212353141Sphilip case -1: 213353141Sphilip atf_tc_fail("fork failed"); 214353141Sphilip default: 215353141Sphilip sigemptyset(&set); 216353141Sphilip sigsuspend(&set); 217353141Sphilip } 218353141Sphilip} 219353141Sphilip 220353141SphilipATF_TC(sigchild_dump); 221353141SphilipATF_TC_HEAD(sigchild_dump, tc) 222353141Sphilip{ 223353141Sphilip 224353141Sphilip atf_tc_set_md_var(tc, "descr", 225353141Sphilip "Checks that signal trampoline correctly calls SIGCHLD handler " 226353141Sphilip "when child segfaults"); 227353141Sphilip} 228353141Sphilip 229353141SphilipATF_TC_BODY(sigchild_dump, tc) 230353141Sphilip{ 231353141Sphilip sigset_t set; 232353141Sphilip 233353141Sphilip sigchild_setup(); 234353141Sphilip 235353141Sphilip status = SIGSEGV; 236353141Sphilip code = CLD_DUMPED; 237353141Sphilip 238353141Sphilip switch ((child = fork())) { 239353141Sphilip case 0: 240353141Sphilip sleep(1); 241353141Sphilip *(volatile long *)0 = 0; 242353141Sphilip atf_tc_fail("Child did not segfault"); 243353141Sphilip /* NOTREACHED */ 244353141Sphilip case -1: 245353141Sphilip atf_tc_fail("fork failed"); 246353141Sphilip default: 247353141Sphilip sigemptyset(&set); 248353141Sphilip sigsuspend(&set); 249353141Sphilip } 250353141Sphilip} 251353141Sphilip 252353141SphilipATF_TC(sigchild_kill); 253353141SphilipATF_TC_HEAD(sigchild_kill, tc) 254353141Sphilip{ 255353141Sphilip 256353141Sphilip atf_tc_set_md_var(tc, "descr", 257353141Sphilip "Checks that signal trampoline correctly calls SIGCHLD handler " 258353141Sphilip "when child is killed"); 259353141Sphilip} 260353141Sphilip 261353141SphilipATF_TC_BODY(sigchild_kill, tc) 262353141Sphilip{ 263353141Sphilip sigset_t set; 264353141Sphilip 265353141Sphilip sigchild_setup(); 266353141Sphilip 267353141Sphilip status = SIGPIPE; 268353141Sphilip code = CLD_KILLED; 269353141Sphilip 270353141Sphilip switch ((child = fork())) { 271353141Sphilip case 0: 272353141Sphilip sigemptyset(&set); 273353141Sphilip sigsuspend(&set); 274353141Sphilip break; 275353141Sphilip case -1: 276353141Sphilip atf_tc_fail("fork failed"); 277353141Sphilip default: 278353141Sphilip kill(child, SIGPIPE); 279353141Sphilip sigemptyset(&set); 280353141Sphilip sigsuspend(&set); 281353141Sphilip } 282353141Sphilip} 283353141Sphilip 284353141Sphilipstatic sigjmp_buf sigfpe_flt_env; 285353141Sphilipstatic void 286353141Sphilipsigfpe_flt_action(int signo, siginfo_t *info, void *ptr) 287353141Sphilip{ 288353141Sphilip 289353141Sphilip sig_debug(signo, info, (ucontext_t *)ptr); 290353141Sphilip 291353141Sphilip if (fltdiv_signalled++ != 0) 292353141Sphilip atf_tc_fail("FPE handler called more than once"); 293353141Sphilip 294353141Sphilip ATF_REQUIRE_EQ(info->si_signo, SIGFPE); 295353141Sphilip ATF_REQUIRE_EQ(info->si_code, FPE_FLTDIV); 296353141Sphilip ATF_REQUIRE_EQ(info->si_errno, 0); 297353141Sphilip 298353141Sphilip siglongjmp(sigfpe_flt_env, 1); 299353141Sphilip} 300353141Sphilip 301353141SphilipATF_TC(sigfpe_flt); 302353141SphilipATF_TC_HEAD(sigfpe_flt, tc) 303353141Sphilip{ 304353141Sphilip 305353141Sphilip atf_tc_set_md_var(tc, "descr", 306353141Sphilip "Checks that signal trampoline correctly calls SIGFPE handler " 307353141Sphilip "for floating div-by-zero"); 308353141Sphilip} 309353141Sphilip 310353141SphilipATF_TC_BODY(sigfpe_flt, tc) 311353141Sphilip{ 312353141Sphilip struct sigaction sa; 313353141Sphilip double d = strtod("0", NULL); 314353141Sphilip 315353141Sphilip if (isQEMU()) 316353141Sphilip atf_tc_skip("Test does not run correctly under QEMU"); 317353141Sphilip#if defined(__powerpc__) 318353141Sphilip atf_tc_skip("Test not valid on powerpc"); 319353141Sphilip#endif 320353141Sphilip if (sigsetjmp(sigfpe_flt_env, 0) == 0) { 321353141Sphilip sa.sa_flags = SA_SIGINFO; 322353141Sphilip sa.sa_sigaction = sigfpe_flt_action; 323353141Sphilip sigemptyset(&sa.sa_mask); 324353141Sphilip sigaction(SIGFPE, &sa, NULL); 325353141Sphilip#ifdef HAVE_FENV 326353141Sphilip feenableexcept(FE_ALL_EXCEPT); 327353141Sphilip#elif defined(_FLOAT_IEEE754) 328353141Sphilip fpsetmask(FP_X_INV|FP_X_DZ|FP_X_OFL|FP_X_UFL|FP_X_IMP); 329353141Sphilip#endif 330353141Sphilip printf("%g\n", 1 / d); 331353141Sphilip } 332353141Sphilip if (fltdiv_signalled == 0) 333353141Sphilip atf_tc_fail("FPE signal handler was not invoked"); 334353141Sphilip} 335353141Sphilip 336353141Sphilipstatic sigjmp_buf sigfpe_int_env; 337353141Sphilipstatic void 338353141Sphilipsigfpe_int_action(int signo, siginfo_t *info, void *ptr) 339353141Sphilip{ 340353141Sphilip 341353141Sphilip sig_debug(signo, info, (ucontext_t *)ptr); 342353141Sphilip 343353141Sphilip if (intdiv_signalled++ != 0) 344353141Sphilip atf_tc_fail("INTDIV handler called more than once"); 345353141Sphilip 346353141Sphilip ATF_REQUIRE_EQ(info->si_signo, SIGFPE); 347353141Sphilip ATF_REQUIRE_EQ(info->si_code, FPE_INTDIV); 348353141Sphilip atf_tc_expect_pass(); 349353141Sphilip ATF_REQUIRE_EQ(info->si_errno, 0); 350353141Sphilip 351353141Sphilip siglongjmp(sigfpe_int_env, 1); 352353141Sphilip} 353353141Sphilip 354353141SphilipATF_TC(sigfpe_int); 355353141SphilipATF_TC_HEAD(sigfpe_int, tc) 356353141Sphilip{ 357353141Sphilip 358353141Sphilip atf_tc_set_md_var(tc, "descr", 359353141Sphilip "Checks that signal trampoline correctly calls SIGFPE handler " 360353141Sphilip "for integer div-by-zero (PR port-i386/43655)"); 361353141Sphilip} 362353141Sphilip 363353141SphilipATF_TC_BODY(sigfpe_int, tc) 364353141Sphilip{ 365353141Sphilip struct sigaction sa; 366353141Sphilip long l = strtol("0", NULL, 10); 367353141Sphilip 368353141Sphilip#if defined(__powerpc__) 369353141Sphilip atf_tc_skip("Test not valid on powerpc"); 370353141Sphilip#endif 371353141Sphilip if (sigsetjmp(sigfpe_int_env, 0) == 0) { 372353141Sphilip sa.sa_flags = SA_SIGINFO; 373353141Sphilip sa.sa_sigaction = sigfpe_int_action; 374353141Sphilip sigemptyset(&sa.sa_mask); 375353141Sphilip sigaction(SIGFPE, &sa, NULL); 376353141Sphilip#ifdef HAVE_FENV 377353141Sphilip feenableexcept(FE_ALL_EXCEPT); 378353141Sphilip#elif defined(_FLOAT_IEEE754) 379353141Sphilip fpsetmask(FP_X_INV|FP_X_DZ|FP_X_OFL|FP_X_UFL|FP_X_IMP); 380353141Sphilip#endif 381353141Sphilip printf("%ld\n", 1 / l); 382353141Sphilip } 383353141Sphilip if (intdiv_signalled == 0) 384353141Sphilip atf_tc_fail("FPE signal handler was not invoked"); 385353141Sphilip} 386353141Sphilip 387353141Sphilipstatic void 388353141Sphilipsigsegv_action(int signo, siginfo_t *info, void *ptr) 389353141Sphilip{ 390353141Sphilip 391353141Sphilip sig_debug(signo, info, (ucontext_t *)ptr); 392353141Sphilip 393353141Sphilip ATF_REQUIRE_EQ(info->si_signo, SIGSEGV); 394353141Sphilip ATF_REQUIRE_EQ(info->si_errno, 0); 395353141Sphilip ATF_REQUIRE_EQ(info->si_code, SEGV_MAPERR); 396353141Sphilip ATF_REQUIRE_EQ(info->si_addr, (void *)0); 397353141Sphilip 398353141Sphilip atf_tc_pass(); 399353141Sphilip /* NOTREACHED */ 400353141Sphilip} 401353141Sphilip 402353141SphilipATF_TC(sigsegv); 403353141SphilipATF_TC_HEAD(sigsegv, tc) 404353141Sphilip{ 405353141Sphilip 406353141Sphilip atf_tc_set_md_var(tc, "descr", 407353141Sphilip "Checks that signal trampoline correctly calls SIGSEGV handler"); 408353141Sphilip} 409353141Sphilip 410353141SphilipATF_TC_BODY(sigsegv, tc) 411353141Sphilip{ 412353141Sphilip struct sigaction sa; 413353141Sphilip 414353141Sphilip sa.sa_flags = SA_SIGINFO; 415353141Sphilip sa.sa_sigaction = sigsegv_action; 416353141Sphilip sigemptyset(&sa.sa_mask); 417353141Sphilip sigaction(SIGSEGV, &sa, NULL); 418353141Sphilip 419353141Sphilip *(volatile long *)0 = 0; 420353141Sphilip atf_tc_fail("Test did not fault as expected"); 421353141Sphilip} 422353141Sphilip 423353141Sphilipstatic void 424353141Sphilipsigbus_action(int signo, siginfo_t *info, void *ptr) 425353141Sphilip{ 426353141Sphilip 427353141Sphilip printf("si_addr = %p\n", info->si_addr); 428353141Sphilip sig_debug(signo, info, (ucontext_t *)ptr); 429353141Sphilip 430353141Sphilip ATF_REQUIRE_EQ(info->si_signo, SIGBUS); 431353141Sphilip ATF_REQUIRE_EQ(info->si_errno, 0); 432353141Sphilip ATF_REQUIRE_EQ(info->si_code, BUS_ADRALN); 433353141Sphilip 434353141Sphilip#if defined(__i386__) || defined(__x86_64__) 435353141Sphilip atf_tc_expect_fail("x86 architecture does not correctly " 436353141Sphilip "report the address where the unaligned access occured"); 437353141Sphilip#endif 438353141Sphilip ATF_REQUIRE_EQ(info->si_addr, (volatile void *)addr); 439353141Sphilip 440353141Sphilip atf_tc_pass(); 441353141Sphilip /* NOTREACHED */ 442353141Sphilip} 443353141Sphilip 444353141SphilipATF_TC(sigbus_adraln); 445353141SphilipATF_TC_HEAD(sigbus_adraln, tc) 446353141Sphilip{ 447353141Sphilip 448353141Sphilip atf_tc_set_md_var(tc, "descr", 449353141Sphilip "Checks that signal trampoline correctly calls SIGBUS handler " 450353141Sphilip "for invalid address alignment"); 451353141Sphilip} 452353141Sphilip 453353141SphilipATF_TC_BODY(sigbus_adraln, tc) 454353141Sphilip{ 455353141Sphilip struct sigaction sa; 456353141Sphilip 457353141Sphilip#if defined(__alpha__) 458353141Sphilip int rv, val; 459353141Sphilip size_t len = sizeof(val); 460353141Sphilip rv = sysctlbyname("machdep.unaligned_sigbus", &val, &len, NULL, 0); 461353141Sphilip ATF_REQUIRE(rv == 0); 462353141Sphilip if (val == 0) 463353141Sphilip atf_tc_skip("SIGBUS signal not enabled for unaligned accesses"); 464353141Sphilip#endif 465353141Sphilip 466353141Sphilip sa.sa_flags = SA_SIGINFO; 467353141Sphilip sa.sa_sigaction = sigbus_action; 468353141Sphilip sigemptyset(&sa.sa_mask); 469353141Sphilip sigaction(SIGBUS, &sa, NULL); 470353141Sphilip 471353141Sphilip /* Enable alignment checks for x86. 0x40000 is PSL_AC. */ 472353141Sphilip#if defined(__i386__) 473353141Sphilip __asm__("pushf; orl $0x40000, (%esp); popf"); 474353141Sphilip#elif defined(__amd64__) 475353141Sphilip __asm__("pushf; orl $0x40000, (%rsp); popf"); 476353141Sphilip#endif 477353141Sphilip 478353141Sphilip addr = calloc(2, sizeof(int)); 479353141Sphilip ATF_REQUIRE(addr != NULL); 480353141Sphilip 481353141Sphilip if (isQEMU()) 482353141Sphilip atf_tc_expect_fail("QEMU fails to trap unaligned accesses"); 483353141Sphilip 484353141Sphilip /* Force an unaligned access */ 485353141Sphilip addr++; 486353141Sphilip printf("now trying to access unaligned address %p\n", addr); 487353141Sphilip ATF_REQUIRE_EQ(*(volatile int *)addr, 0); 488353141Sphilip 489353141Sphilip atf_tc_fail("Test did not fault as expected"); 490353141Sphilip} 491353141Sphilip 492353141SphilipATF_TP_ADD_TCS(tp) 493353141Sphilip{ 494353141Sphilip 495353141Sphilip ATF_TP_ADD_TC(tp, sigalarm); 496353141Sphilip ATF_TP_ADD_TC(tp, sigchild_normal); 497353141Sphilip ATF_TP_ADD_TC(tp, sigchild_dump); 498353141Sphilip ATF_TP_ADD_TC(tp, sigchild_kill); 499353141Sphilip ATF_TP_ADD_TC(tp, sigfpe_flt); 500353141Sphilip ATF_TP_ADD_TC(tp, sigfpe_int); 501353141Sphilip ATF_TP_ADD_TC(tp, sigsegv); 502353141Sphilip ATF_TP_ADD_TC(tp, sigbus_adraln); 503353141Sphilip 504353141Sphilip return atf_no_error(); 505353141Sphilip} 506353141Sphilip