#define _GNU_SOURCE #include #include #include #include #include #include #include char *c = (char*) 0xa0000000; error_t do_copy (struct hurd_signal_preemptor *preemptor) { fprintf(stderr,"copying\n"); memcpy(c, c+1, 999999); fprintf(stderr,"copied\n"); } int main(int argc, char *argv[]) { jmp_buf buf; void fault(int signo, long int sigcode, struct sigcontext *scp) { fprintf(stderr,"%d %lx %p\n", signo, sigcode, scp); longjmp(buf, 1); } if (setjmp(buf) == 0) { hurd_catch_signal(sigmask(SIGSEGV) | sigmask(SIGBUS), (unsigned long) c, (unsigned long) c+1000000, &do_copy, (sighandler_t) &fault); } fprintf(stderr,"done\n"); return 0; }