]>
git.saurik.com Git - apple/xnu.git/blob - tests/signal_stack.c
7 #include <darwintest.h>
9 static uint64_t stack_base
, stack_end
;
12 signal_handler(int __unused signum
, struct __siginfo
* __unused info
, void * __unused uap
)
14 T_LOG("In signal handler\n");
15 uint64_t signal_stack
= (uint64_t)__builtin_frame_address(0);
16 T_ASSERT_LE(stack_base
, signal_stack
, NULL
);
17 T_ASSERT_LE(signal_stack
, stack_end
, NULL
);
21 T_DECL(signalstack
, "Check that the signal stack is set up correctly", T_META_ASROOT(YES
))
23 void* stack_allocation
= malloc(SIGSTKSZ
);
25 stack_base
= (uint64_t)stack_allocation
;
26 stack_end
= stack_base
+ SIGSTKSZ
;
28 T_LOG("stack base = 0x%llx\n", stack_base
);
29 T_LOG("stack end = 0x%llx\n", stack_end
);
32 alt_stack
.ss_sp
= stack_allocation
;
33 alt_stack
.ss_size
= SIGSTKSZ
;
34 alt_stack
.ss_flags
= 0;
36 if (sigaltstack(&alt_stack
, NULL
) < 0) {
37 T_FAIL("error: sigaltstack failed\n");
41 sigemptyset(&signal_mask
);
43 struct sigaction sig_action
;
44 sig_action
.sa_sigaction
= signal_handler
;
45 sig_action
.sa_mask
= signal_mask
;
46 sig_action
.sa_flags
= SA_ONSTACK
;
48 if (sigaction(SIGUSR1
, &sig_action
, NULL
) != 0) {
49 T_FAIL("error: sigaction failed\n");
52 T_LOG("Sending a SIGUSR1\n");
53 kill(getpid(), SIGUSR1
);