madvise: support MADV_DONTDUMP/DODUMP

refs #661
This commit is contained in:
Tomoki Shirasawa
2017-09-26 14:21:40 +09:00
parent 9c847c0a8f
commit a2fbe99b60
3 changed files with 21 additions and 2 deletions

View File

@ -310,6 +310,8 @@ int gencore(struct thread *thread, void *regs,
mckernel's internal use. */
if (range->flag & VR_RESERVED)
continue;
if (range->flag & VR_DONTDUMP)
continue;
/* We need a chunk for each page for a demand paging area.
This can be optimized for spacial complexity but we would
lose simplicity instead. */

View File

@ -52,6 +52,7 @@
#define VR_MEMTYPE_UC 0x01000000 /* uncachable */
#define VR_MEMTYPE_MASK 0x0f000000
#define VR_PAGEOUT 0x10000000
#define VR_DONTDUMP 0x20000000
#define PROT_TO_VR_FLAG(prot) (((unsigned long)(prot) << 16) & VR_PROT_MASK)
#define VRFLAG_PROT_TO_MAXPROT(vrflag) (((vrflag) & VR_PROT_MASK) << 4)

View File

@ -4386,8 +4386,6 @@ SYSCALL_DECLARE(madvise)
case MADV_UNMERGEABLE:
case MADV_HUGEPAGE:
case MADV_NOHUGEPAGE:
case MADV_DONTDUMP:
case MADV_DODUMP:
error = -EINVAL;
break;
@ -4399,6 +4397,8 @@ SYSCALL_DECLARE(madvise)
case MADV_DONTFORK:
case MADV_DOFORK:
case MADV_REMOVE:
case MADV_DONTDUMP:
case MADV_DODUMP:
break;
case MADV_HWPOISON:
@ -4511,6 +4511,22 @@ SYSCALL_DECLARE(madvise)
goto out;
}
}
if(advice == MADV_DONTDUMP){
error = change_attr_process_memory_range(thread->vm, start, end,
set_memory_range_flag,
VR_DONTDUMP);
if(error){
goto out;
}
}
if(advice == MADV_DODUMP){
error = change_attr_process_memory_range(thread->vm, start, end,
clear_memory_range_flag,
VR_DONTDUMP);
if(error){
goto out;
}
}
if(advice == MADV_DONTFORK ||
advice == MADV_DOFORK){
error = syscall_generic_forwarding(__NR_madvise, ctx);