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