blob: ff3ade609cf2cfa35fb6dce4c733df282eb2b62b [file] [log] [blame]
sewardj8eb8bab2015-07-21 14:44:28 +00001/* Test of correct simulation for active stack. */
2
3#include <assert.h>
4#include <signal.h>
5#include <stdio.h>
6#include <ucontext.h>
7
8static char altstack_map[8096];
9static volatile stack_t *sp;
10
11static void sighandler(int sig)
12{
13 /* Check that the alternate stack is active. */
14 assert(sp->ss_sp == altstack_map);
15 assert(sp->ss_size == sizeof(altstack_map));
16 assert(sp->ss_flags == SS_ONSTACK);
17}
18
19int main(void)
20{
21 stack_t mainstack;
22 stack_t altstack;
23 struct sigaction sa;
24 /* Obtain an address inside the stack using a dirty trick. */
25 void *local = &sa;
26
27 /* Get an address for stack definition. */
28 if (getustack((stack_t**)&sp)) {
29 perror("getustack");
30 return 1;
31 }
32
33 /* Check the current stack. */
34 assert(sp->ss_sp <= local);
35 assert(local < (void*)((char*)sp->ss_sp + sp->ss_size));
36 assert(sp->ss_flags == 0);
37
38 /* Backup the current stack. */
39 mainstack = *sp;
40
41 /* Setup a signal handler. */
42 sa.sa_handler = sighandler;
43 sa.sa_flags = SA_ONSTACK;
44 if (sigfillset(&sa.sa_mask)) {
45 perror("sigfillset");
46 return 1;
47 }
48 if (sigaction(SIGUSR1, &sa, NULL)) {
49 perror("sigaction");
50 return 1;
51 }
52
53 /* Setup an alternate stack. */
54 altstack.ss_sp = altstack_map;
55 altstack.ss_size = sizeof(altstack_map);
56 altstack.ss_flags = 0;
57 if (sigaltstack(&altstack, NULL)) {
58 perror("sigaltstack");
59 return 1;
60 }
61
62 /* Raise a signal. */
63 raise(SIGUSR1);
64
65 /* Check the current stack. */
66 assert(mainstack.ss_sp == sp->ss_sp);
67 assert(mainstack.ss_size == sp->ss_size);
68 assert(mainstack.ss_flags == sp->ss_flags);
69
70 return 0;
71}
72