#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/resource.h>
#include <setjmp.h>
#include <signal.h>

#define PAGESIZE 4096

extern end;
extern etext;
extern edata;

static jmp_buf back;

void sighandler(int sig) {
	longjmp(back, 1);
}

void *find_limit(const void *start, int up) {
	char *limit = (char*) ((int) start & ~(PAGESIZE-1));
	char dummy;

	signal(SIGSEGV, sighandler);
	if(setjmp(back) == 0) {
		while(1) {
			dummy = *limit;
			if(up) limit += PAGESIZE;
			else limit -= PAGESIZE;
		}
	}
	signal(SIGSEGV, SIG_DFL);
	
	return (void*) limit;
}

int main(int argc, char **argv) {
	printf("lower bound: %x\n", find_limit(&argc, 0));
	printf("upper bound: %x\n", find_limit(&argc, 1));
	return 0;
}
