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