NetBSD-5.0.2/regress/sys/uvm/stack_exec/tramptest.c

Compare this file to the similar file:
Show the results in this format:

/* $NetBSD: tramptest.c,v 1.1 2003/12/10 13:24:59 drochner Exp $ */

#include <stdlib.h>
#include <pthread.h>
#include <signal.h>

/*
 * This test checks whether processes/threads get execute permission
 * on the stack if needed, in particular for multiple threads.
 * It depends on the fact that gcc puts trampoline code for
 * nested functions on the stack and requests execution permission
 * for that address internally, at least on some architectures.
 * (On the other architectures, the test is just insignificant.)
 * Actually, it would be better if gcc wouldn't use stack trampolines,
 * at all, but for now it allows for an easy portable check whether the
 * kernel handles permissions correctly.
 */

void
buserr(int s)
{

	exit(1);
}

int
main()
{
	pthread_t t1, t2;

	void *mist(void *p)
	{

		return (0);
	}

	signal(SIGBUS, buserr);

	pthread_create(&t1, 0, mist, 0);
	pthread_create(&t2, 0, mist, 0);
	pthread_join(t1, 0);
	pthread_join(t2, 0);
	exit(0);
}