#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"); return 0; } 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); } void sigfault(int signo, siginfo_t *info, void *a) { fprintf(stderr,"%d %p %p\n", signo, info, a); longjmp(buf, 1); } struct sigaction act = {}; act.sa_sigaction = sigfault; act.sa_flags = SA_SIGINFO; sigaction(SIGSEGV, &act, NULL); 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; }