diff options
-rw-r--r-- | include/exec/page-protection.h | 6 | ||||
-rw-r--r-- | linux-user/elfload.c | 4 | ||||
-rw-r--r-- | linux-user/mmap.c | 6 |
3 files changed, 13 insertions, 3 deletions
diff --git a/include/exec/page-protection.h b/include/exec/page-protection.h index 5a18f98..c50ce57 100644 --- a/include/exec/page-protection.h +++ b/include/exec/page-protection.h @@ -30,7 +30,11 @@ #define PAGE_PASSTHROUGH 0x40 /* For linux-user, indicates that the page is MAP_ANON. */ #define PAGE_ANON 0x0080 - +/* + * For linux-user, indicates that the page should not be + * included in a core dump. + */ +#define PAGE_DONTDUMP 0x0100 /* Target-specific bits that will be used via page_get_flags(). */ #define PAGE_TARGET_1 0x0200 #define PAGE_TARGET_2 0x0400 diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 1370ec5..0002d5b 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2127,8 +2127,8 @@ static void bswap_note(struct elf_note *en) */ static size_t vma_dump_size(vaddr start, vaddr end, int flags) { - /* The area must be readable. */ - if (!(flags & PAGE_READ)) { + /* The area must be readable and dumpable. */ + if (!(flags & PAGE_READ) || (flags & PAGE_DONTDUMP)) { return 0; } diff --git a/linux-user/mmap.c b/linux-user/mmap.c index 527ca5f..423c778 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -1248,6 +1248,12 @@ abi_long target_madvise(abi_ulong start, abi_ulong len_in, int advice) */ mmap_lock(); switch (advice) { + case MADV_DONTDUMP: + page_set_flags(start, start + len - 1, PAGE_DONTDUMP, 0); + break; + case MADV_DODUMP: + page_set_flags(start, start + len - 1, 0, PAGE_DONTDUMP); + break; case MADV_WIPEONFORK: case MADV_KEEPONFORK: ret = -EINVAL; |