madvise: Support MADV_WIPEONFORK, MADV_KEEPONFORK and MADV_NORMAL
Change-Id: I1d4cf5affa580d7304dfdc34fa4f1707c0df617c refs: #1374
This commit is contained in:
@@ -54,6 +54,8 @@
|
||||
#define MADV_NOHUGEPAGE 15
|
||||
#define MADV_DONTDUMP 16
|
||||
#define MADV_DODUMP 17
|
||||
#define MADV_WIPEONFORK 18 /* Zero memory on fork, child only */
|
||||
#define MADV_KEEPONFORK 19 /* Undo MADV_WIPEONFORK */
|
||||
#define MADV_HWPOISON 100
|
||||
#define MADV_SOFT_OFFLINE 101
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#define VR_PAGEOUT 0x10000000
|
||||
#define VR_DONTDUMP 0x20000000
|
||||
#define VR_XPMEM 0x40000000
|
||||
#define VR_WIPEONFORK 0x80000000
|
||||
|
||||
#define PROT_TO_VR_FLAG(prot) (((unsigned long)(prot) << 16) & VR_PROT_MASK)
|
||||
#define VRFLAG_PROT_TO_MAXPROT(vrflag) (((vrflag) & VR_PROT_MASK) << 4)
|
||||
|
||||
@@ -750,8 +750,13 @@ static int copy_user_pte(void *arg0, page_table_t src_pt, pte_t *src_ptep, void
|
||||
src_kvirt = ihk_mc_map_virtual(src_lphys, 1, attr);
|
||||
}
|
||||
|
||||
memcpy(virt, src_kvirt, pgsize);
|
||||
dkprintf("copy_user_pte(): memcpy OK\n");
|
||||
if (args->new_vrflag & VR_WIPEONFORK) {
|
||||
memset(virt, 0, pgsize);
|
||||
dkprintf("%s(): memset OK\n", __func__);
|
||||
} else {
|
||||
memcpy(virt, src_kvirt, pgsize);
|
||||
dkprintf("%s(): memcpy OK\n", __func__);
|
||||
}
|
||||
|
||||
if (!is_mckernel) {
|
||||
ihk_mc_unmap_virtual(src_kvirt, 1);
|
||||
|
||||
@@ -5324,6 +5324,8 @@ SYSCALL_DECLARE(madvise)
|
||||
case MADV_REMOVE:
|
||||
case MADV_DONTDUMP:
|
||||
case MADV_DODUMP:
|
||||
case MADV_WIPEONFORK:
|
||||
case MADV_KEEPONFORK:
|
||||
break;
|
||||
|
||||
case MADV_HWPOISON:
|
||||
@@ -5376,6 +5378,27 @@ SYSCALL_DECLARE(madvise)
|
||||
}
|
||||
}
|
||||
else if(advice == MADV_DONTFORK || advice == MADV_DOFORK);
|
||||
else if (advice == MADV_NORMAL) {
|
||||
/*
|
||||
* Normally, the settings of MADV_RANDOM and
|
||||
* MADV_SEQUENTIAL are cleared.
|
||||
* MADV_RANDOM and MADV_SEQUENTIAL are not supported,
|
||||
* so do nothing.
|
||||
*/
|
||||
}
|
||||
else if (advice == MADV_WIPEONFORK
|
||||
|| advice == MADV_KEEPONFORK) {
|
||||
if (range->memobj && memobj_has_pager(range->memobj)) {
|
||||
/* device mapping, file mapping */
|
||||
error = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
if (!(range->flag & VR_PRIVATE)) {
|
||||
/* VR_SHARED */
|
||||
error = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
else if (!range->memobj || !memobj_has_pager(range->memobj)) {
|
||||
dkprintf("[%d]sys_madvise(%lx,%lx,%x):has not pager"
|
||||
"[%lx-%lx) %lx\n",
|
||||
@@ -5463,6 +5486,24 @@ SYSCALL_DECLARE(madvise)
|
||||
advice == MADV_DOFORK){
|
||||
error = syscall_generic_forwarding(__NR_madvise, ctx);
|
||||
}
|
||||
if (advice == MADV_WIPEONFORK) {
|
||||
error = change_attr_process_memory_range(
|
||||
thread->vm, start, end,
|
||||
set_memory_range_flag,
|
||||
VR_WIPEONFORK);
|
||||
if (error) {
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
if (advice == MADV_KEEPONFORK) {
|
||||
error = change_attr_process_memory_range(
|
||||
thread->vm, start, end,
|
||||
clear_memory_range_flag,
|
||||
VR_WIPEONFORK);
|
||||
if (error) {
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
error = 0;
|
||||
out:
|
||||
|
||||
Reference in New Issue
Block a user