xref: /netbsd-src/regress/sys/arch/arm/sigstackalign/sigstackalign.c (revision 3b01aba77a7a698587faaae455bbfe740923c1f5)
1 /*	$NetBSD: sigstackalign.c,v 1.1 2001/08/06 22:29:59 bjh21 Exp $       */
2 
3 #include <sys/types.h>
4 
5 __RCSID("$NetBSD: sigstackalign.c,v 1.1 2001/08/06 22:29:59 bjh21 Exp $");
6 
7 #include <signal.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 
11 #define RANGE 16
12 #define STACKALIGN 8
13 #define BLOCKSIZE (MINSIGSTKSZ + RANGE)
14 
15 extern void getstackptr(int);
16 
17 void *stackptr;
18 
19 int
20 main(int argc, char **argv)
21 {
22 	char *stackblock;
23 	int i, ret;
24 	struct sigaction sa;
25 	stack_t ss;
26 
27 	ret = 0;
28 
29 	sa.sa_handler = getstackptr;
30 	sigemptyset(&sa.sa_mask);
31 	sa.sa_flags = SA_ONSTACK;
32 	if (sigaction(SIGUSR1, &sa, NULL) != 0)
33 		err(1, "sigaction");
34 
35 	stackblock = malloc(BLOCKSIZE);
36 	for (i = 0; i < RANGE; i++) {
37 		ss.ss_sp = stackblock;
38 		ss.ss_size = MINSIGSTKSZ + i;
39 		ss.ss_flags = 0;
40 		if (sigaltstack(&ss, NULL) != 0)
41 			err(1, "sigaltstack");
42 		kill(getpid(), SIGUSR1);
43 		if ((u_int)stackptr % STACKALIGN != 0) {
44 			fprintf(stderr, "Bad stack pointer %p\n", stackptr);
45 			ret = 1;
46 		}
47 #if 0
48 		printf("i = %d, stackptr = %p\n", i, stackptr);
49 #endif
50 	}
51 
52 	return ret;
53 }
54 
55