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