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