aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/exec/page-protection.h6
-rw-r--r--linux-user/elfload.c4
-rw-r--r--linux-user/mmap.c6
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;