diff --git a/arch/x86/kernel/gencore.c b/arch/x86/kernel/gencore.c index 2ddf8c68..ee9d5ca6 100644 --- a/arch/x86/kernel/gencore.c +++ b/arch/x86/kernel/gencore.c @@ -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. */ diff --git a/kernel/include/process.h b/kernel/include/process.h index 067e51b7..349827ed 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -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) diff --git a/kernel/syscall.c b/kernel/syscall.c index c84ec0eb..6ef6fc52 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -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);