diff --git a/executer/include/uprotocol.h b/executer/include/uprotocol.h index 8f9ae88e..ebfd8984 100644 --- a/executer/include/uprotocol.h +++ b/executer/include/uprotocol.h @@ -42,6 +42,8 @@ #define MCEXEC_UP_PREPARE_DMA 0x30a02910 #define MCEXEC_UP_FREE_DMA 0x30a02911 +#define MCEXEC_UP_TEST_OPEN_EXEC 0x30a02912 + #define MCEXEC_UP_TRANSFER_TO_REMOTE 0 #define MCEXEC_UP_TRANSFER_FROM_REMOTE 1 diff --git a/executer/kernel/control.c b/executer/kernel/control.c index 80603ba5..8aa94a38 100644 --- a/executer/kernel/control.c +++ b/executer/kernel/control.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include #include @@ -690,6 +692,24 @@ long mcexec_ret_syscall(ihk_os_t os, struct syscall_ret_desc *__user arg) return 0; } +int mcexec_test_open_exec(ihk_os_t os, char * __user filename) +{ + struct file *file; + int retval; + + file = open_exec(filename); + retval = PTR_ERR(file); + if (IS_ERR(file)) { + goto out_return; + } + + retval = 0; + fput(file); + +out_return: + return -retval; +} + long mcexec_strncpy_from_user(ihk_os_t os, struct strncpy_from_user_desc * __user arg) { struct strncpy_from_user_desc desc; @@ -770,7 +790,11 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg) return mcexec_get_cpu(os); case MCEXEC_UP_STRNCPY_FROM_USER: - return mcexec_strncpy_from_user(os, (struct strncpy_from_user_desc *)arg); + return mcexec_strncpy_from_user(os, + (struct strncpy_from_user_desc *)arg); + + case MCEXEC_UP_TEST_OPEN_EXEC: + return mcexec_test_open_exec(os, (char *)arg); case MCEXEC_UP_PREPARE_DMA: return mcexec_pin_region(os, (unsigned long *)arg); diff --git a/executer/kernel/driver.c b/executer/kernel/driver.c index 6b5ffdff..6707d340 100644 --- a/executer/kernel/driver.c +++ b/executer/kernel/driver.c @@ -57,6 +57,7 @@ static struct ihk_os_user_call_handler mcctrl_uchs[] = { { .request = MCEXEC_UP_STRNCPY_FROM_USER, .func = mcctrl_ioctl }, { .request = MCEXEC_UP_PREPARE_DMA, .func = mcctrl_ioctl }, { .request = MCEXEC_UP_FREE_DMA, .func = mcctrl_ioctl }, + { .request = MCEXEC_UP_TEST_OPEN_EXEC, .func = mcctrl_ioctl }, }; static struct ihk_os_user_call mcctrl_uc_proto = { diff --git a/executer/user/mcexec.c b/executer/user/mcexec.c index 2d85fcd2..eb1c7b6e 100644 --- a/executer/user/mcexec.c +++ b/executer/user/mcexec.c @@ -519,7 +519,13 @@ int load_elf_desc(char *filename, struct program_load_desc **desc_p, } rewind(fp); - + + if ((ret = ioctl(fd, MCEXEC_UP_TEST_OPEN_EXEC, filename)) != 0) { + fprintf(stderr, "Error: open_exec() fails for %s: %d (fd: %d)\n", + filename, ret, fd); + return ret; + } + desc = load_elf(fp, &interp_path); if (!desc) { fclose(fp); @@ -989,6 +995,13 @@ int main(int argc, char **argv) } __dprintf("%s", "\n"); + /* Open OS chardev for ioctl() */ + fd = open(dev, O_RDWR); + if (fd < 0) { + fprintf(stderr, "Error: Failed to open %s.\n", dev); + return 1; + } + if (lookup_exec_path(argv[optind], path, sizeof(path)) != 0) { fprintf(stderr, "error: finding file: %s\n", argv[optind]); return 1; @@ -1053,12 +1066,6 @@ int main(int argc, char **argv) desc->rlimit_stack_cur = rlim_stack.rlim_cur; desc->rlimit_stack_max = rlim_stack.rlim_max; - fd = open(dev, O_RDWR); - if (fd < 0) { - fprintf(stderr, "Error: Failed to open %s.\n", dev); - return 1; - } - ncpu = ioctl(fd, MCEXEC_UP_GET_CPU, 0); if(ncpu == -1){ fprintf(stderr, "No CPU found.\n");