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