Home | History | Annotate | Line # | Download | only in sigstackalign
sigstackalign.c revision 1.1
      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