diff --git a/executer/user/mcexec.c b/executer/user/mcexec.c index 7f84284..3d65118 100644 --- a/executer/user/mcexec.c +++ b/executer/user/mcexec.c @@ -200,6 +200,8 @@ static char *mpol_bind_nodes = NULL; static int uti_thread_rank = 0; static int uti_use_last_cpu = 0; static int enable_uti = 0; +static const char *signal_injection = ""; +static int injection_signo = 0; /* Partitioned execution (e.g., for MPI) */ static int nr_processes = 0; @@ -892,11 +894,20 @@ int transfer_image(int fd, struct program_load_desc *desc) /* No more left to upload.. */ if (lr == 0 && flen == 0) break; + if (strcmp(signal_injection, "MCEXEC_UP_TRANSFER:before") == 0) { + printf("raise\n"); + raise(injection_signo); + } + printf("ioctl(MCEXEC_UP_TRANSFER)\n"); if (ioctl(fd, MCEXEC_UP_TRANSFER, (unsigned long)&pt)) { perror("dma"); break; } + if (strcmp(signal_injection, "MCEXEC_UP_TRANSFER:after") == 0) { + printf("raise\n"); + raise(injection_signo); + } } } @@ -2092,6 +2103,8 @@ int main(int argc, char **argv) __glob_argv = argv; #endif + printf("signal_injection.patch is applied.\n"); + page_size = sysconf(_SC_PAGESIZE); page_mask = ~(page_size - 1); @@ -2237,6 +2250,21 @@ int main(int argc, char **argv) } } + while ((opt = getopt_long(argc, argv, "i:s:", + mcexec_options, NULL)) != -1) { + switch (opt) { + case 'i': + signal_injection = optarg; + break; + case 's': + injection_signo = strtol(optarg, NULL, 0); + break; + default: /* '?' */ + print_usage(argv); + exit(EXIT_FAILURE); + } + } + if (heap_extension == -1) { heap_extension = sysconf(_SC_PAGESIZE); } @@ -2653,11 +2681,20 @@ int main(int argc, char **argv) desc->thp_disable = get_thp_disable(); /* user_start and user_end are set by this call */ + if (strcmp(signal_injection, "MCEXEC_UP_PREPARE_IMAGE:before") == 0) { + printf("raise\n"); + raise(injection_signo); + } + printf("ioctl(MCEXEC_UP_PREPARE_IMAGE)\n"); if (ioctl(fd, MCEXEC_UP_PREPARE_IMAGE, (unsigned long)desc) != 0) { perror("prepare"); close(fd); return 1; } + if (strcmp(signal_injection, "MCEXEC_UP_PREPARE_IMAGE:after") == 0) { + printf("raise\n"); + raise(injection_signo); + } print_desc(desc); if (transfer_image(fd, desc) < 0) { @@ -2692,7 +2729,16 @@ int main(int argc, char **argv) __dprintf("mccmd server initialized\n"); #endif + if (strcmp(signal_injection, "init_sigaction:before") == 0) { + printf("raise\n"); + raise(injection_signo); + } + printf("init_sigaction\n"); init_sigaction(); + if (strcmp(signal_injection, "init_sigaction:after") == 0) { + printf("raise\n"); + raise(injection_signo); + } /* Initialize watchdog thread which detects hang of McKernel */ @@ -2721,11 +2767,20 @@ int main(int argc, char **argv) return 1; } + if (strcmp(signal_injection, "MCEXEC_UP_START_IMAGE:before") == 0) { + printf("raise\n"); + raise(injection_signo); + } + printf("ioctl(MCEXEC_UP_START_IMAGE)\n"); if (ioctl(fd, MCEXEC_UP_START_IMAGE, (unsigned long)desc) != 0) { perror("exec"); close(fd); return 1; } + if (strcmp(signal_injection, "MCEXEC_UP_START_IMAGE:after") == 0) { + printf("raise\n"); + raise(injection_signo); + } #if 1 /* debug : thread killed by exit_group() are still joinable? */ join_all_threads();