@ -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. */
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user