REQ-18
This commit is contained 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@
|
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 := 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
|
KBUILD_EXTRA_SYMBOLS = @abs_builddir@/../../../../ihk/linux/core/Module.symvers
|
||||||
|
|
||||||
|
|||||||
38
executer/kernel/mcctrl/arch/x86_64/archdeps.c
Normal file
38
executer/kernel/mcctrl/arch/x86_64/archdeps.c
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#include <linux/version.h>
|
||||||
|
#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;
|
||||||
|
}
|
||||||
@ -583,12 +583,10 @@ static struct file_operations rus_fops = {
|
|||||||
.mmap = &rus_mmap,
|
.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 file *file;
|
||||||
struct vm_area_struct *vma;
|
|
||||||
unsigned long start;
|
|
||||||
unsigned long end;
|
|
||||||
struct cred *promoted;
|
struct cred *promoted;
|
||||||
const struct cred *original;
|
const struct cred *original;
|
||||||
|
|
||||||
@ -609,24 +607,11 @@ int reserve_user_space(struct mcctrl_usrdata *usrdata, unsigned long *startp, un
|
|||||||
cap_raise(promoted->cap_effective, CAP_SYS_RAWIO);
|
cap_raise(promoted->cap_effective, CAP_SYS_RAWIO);
|
||||||
original = override_creds(promoted);
|
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)
|
#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);
|
PROT_READ|PROT_WRITE, MAP_FIXED|MAP_SHARED, 0);
|
||||||
#endif
|
#else
|
||||||
|
start = vm_mmap(file, start, end,
|
||||||
up_write(¤t->mm->mmap_sem);
|
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
|
|
||||||
start = vm_mmap(file, 0, end,
|
|
||||||
PROT_READ|PROT_WRITE, MAP_FIXED|MAP_SHARED, 0);
|
PROT_READ|PROT_WRITE, MAP_FIXED|MAP_SHARED, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -635,12 +620,9 @@ int reserve_user_space(struct mcctrl_usrdata *usrdata, unsigned long *startp, un
|
|||||||
fput(file);
|
fput(file);
|
||||||
if (IS_ERR_VALUE(start)) {
|
if (IS_ERR_VALUE(start)) {
|
||||||
printk("mcctrl:user space reservation failed.\n");
|
printk("mcctrl:user space reservation failed.\n");
|
||||||
return start;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*startp = start;
|
return start;
|
||||||
*endp = end;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//unsigned long last_thread_exec = 0;
|
//unsigned long last_thread_exec = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user