From b0054643c01cdd620ce5e5de3069c44812cde10c Mon Sep 17 00:00:00 2001 From: Tomoki Shirasawa Date: Fri, 26 Feb 2016 16:17:23 +0900 Subject: [PATCH] REQ-18 --- executer/kernel/mcctrl/Makefile.in | 2 +- executer/kernel/mcctrl/arch/x86_64/archdeps.c | 38 +++++++++++++++++++ executer/kernel/mcctrl/syscall.c | 32 ++++------------ 3 files changed, 46 insertions(+), 26 deletions(-) create mode 100644 executer/kernel/mcctrl/arch/x86_64/archdeps.c diff --git a/executer/kernel/mcctrl/Makefile.in b/executer/kernel/mcctrl/Makefile.in index 2cbb4751..b5851465 100644 --- a/executer/kernel/mcctrl/Makefile.in +++ b/executer/kernel/mcctrl/Makefile.in @@ -10,7 +10,7 @@ obj-m += mcctrl.o ccflags-y := -I$(IHK_BASE)/linux/include -I$(IHK_BASE)/linux/include/ihk/arch/$(ARCH) -I$(IHK_BASE)/ikc/include -I$(IHK_BASE)/ikc/include/ikc/arch/$(ARCH) -I$(IHK_BASE)/include -I$(IHK_BASE)/include/arch/$(ARCH) -I$(src)/../../include -mcmodel=kernel -mno-red-zone -DMCEXEC_PATH=\"$(BINDIR)/mcexec\" -I@abs_builddir@ mcctrl-y := driver.o control.o ikc.o syscall.o procfs.o binfmt_mcexec.o -mcctrl-y += sysfs.o sysfs_files.o +mcctrl-y += sysfs.o sysfs_files.o arch/$(ARCH)/archdeps.o KBUILD_EXTRA_SYMBOLS = @abs_builddir@/../../../../ihk/linux/core/Module.symvers diff --git a/executer/kernel/mcctrl/arch/x86_64/archdeps.c b/executer/kernel/mcctrl/arch/x86_64/archdeps.c new file mode 100644 index 00000000..a993add2 --- /dev/null +++ b/executer/kernel/mcctrl/arch/x86_64/archdeps.c @@ -0,0 +1,38 @@ +#include +#include "config.h" +#include "mcctrl.h" + +unsigned long +reserve_user_space_common(struct mcctrl_usrdata *usrdata, unsigned long start, unsigned long end); + +int +reserve_user_space(struct mcctrl_usrdata *usrdata, unsigned long *startp, unsigned long *endp) +{ + struct vm_area_struct *vma; + unsigned long start = 0L; + unsigned long end; + +#define DESIRED_USER_END 0x800000000000 +#define GAP_FOR_MCEXEC 0x008000000000UL + end = DESIRED_USER_END; + down_write(¤t->mm->mmap_sem); + vma = find_vma(current->mm, 0); + if (vma) { + end = (vma->vm_start - GAP_FOR_MCEXEC) & ~(GAP_FOR_MCEXEC - 1); + } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) + up_write(¤t->mm->mmap_sem); +#endif + start = reserve_user_space_common(usrdata, start, end); +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) + up_write(¤t->mm->mmap_sem); +#endif + + if (IS_ERR_VALUE(start)) { + return start; + } + *startp = start; + *endp = end; + return 0; +} diff --git a/executer/kernel/mcctrl/syscall.c b/executer/kernel/mcctrl/syscall.c index 631b635d..42e5c805 100644 --- a/executer/kernel/mcctrl/syscall.c +++ b/executer/kernel/mcctrl/syscall.c @@ -583,12 +583,10 @@ static struct file_operations rus_fops = { .mmap = &rus_mmap, }; -int reserve_user_space(struct mcctrl_usrdata *usrdata, unsigned long *startp, unsigned long *endp) +unsigned long +reserve_user_space_common(struct mcctrl_usrdata *usrdata, unsigned long start, unsigned long end) { struct file *file; - struct vm_area_struct *vma; - unsigned long start; - unsigned long end; struct cred *promoted; const struct cred *original; @@ -609,38 +607,22 @@ int reserve_user_space(struct mcctrl_usrdata *usrdata, unsigned long *startp, un cap_raise(promoted->cap_effective, CAP_SYS_RAWIO); original = override_creds(promoted); -#define DESIRED_USER_END 0x800000000000 -#define GAP_FOR_MCEXEC 0x008000000000UL - end = DESIRED_USER_END; - down_write(¤t->mm->mmap_sem); - vma = find_vma(current->mm, 0); - if (vma) { - end = (vma->vm_start - GAP_FOR_MCEXEC) & ~(GAP_FOR_MCEXEC - 1); - } - #if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) - start = do_mmap_pgoff(file, 0, end, + start = vm_mmap_pgoff(file, start, end, PROT_READ|PROT_WRITE, MAP_FIXED|MAP_SHARED, 0); -#endif - - up_write(¤t->mm->mmap_sem); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) - start = vm_mmap(file, 0, end, +#else + start = vm_mmap(file, start, end, PROT_READ|PROT_WRITE, MAP_FIXED|MAP_SHARED, 0); -#endif +#endif revert_creds(original); put_cred(promoted); fput(file); if (IS_ERR_VALUE(start)) { printk("mcctrl:user space reservation failed.\n"); - return start; } - *startp = start; - *endp = end; - return 0; + return start; } //unsigned long last_thread_exec = 0;