diff options
-rw-r--r-- | cpu-all.h | 1 | ||||
-rw-r--r-- | exec.c | 21 | ||||
-rw-r--r-- | linux-user/mmap.c | 2 |
3 files changed, 23 insertions, 1 deletions
@@ -716,6 +716,7 @@ extern unsigned long qemu_host_page_mask; /* original state of the write flag (used when tracking self-modifying code */ #define PAGE_WRITE_ORG 0x0010 +#define PAGE_RESERVED 0x0020 void page_dump(FILE *f); int page_get_flags(target_ulong address); @@ -209,6 +209,27 @@ static void page_init(void) qemu_host_page_mask = ~(qemu_host_page_size - 1); l1_phys_map = qemu_vmalloc(L1_SIZE * sizeof(void *)); memset(l1_phys_map, 0, L1_SIZE * sizeof(void *)); + +#if !defined(_WIN32) && defined(CONFIG_USER_ONLY) + { + long long startaddr, endaddr; + FILE *f; + int n; + + f = fopen("/proc/self/maps", "r"); + if (f) { + do { + n = fscanf (f, "%llx-%llx %*[^\n]\n", &startaddr, &endaddr); + if (n == 2) { + page_set_flags(TARGET_PAGE_ALIGN(startaddr), + TARGET_PAGE_ALIGN(endaddr), + PAGE_RESERVED); + } + } while (!feof(f)); + fclose(f); + } + } +#endif } static inline PageDesc *page_find_alloc(unsigned int index) diff --git a/linux-user/mmap.c b/linux-user/mmap.c index 3f2647f304..6292826b43 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -162,7 +162,7 @@ static abi_ulong mmap_next_start = 0x40000000; 'start'. If 'start' == 0, then a default start address is used. Return -1 if error. */ -/* XXX: should mark pages used by the host as reserved to be sure not +/* page_init() marks pages used by the host as reserved to be sure not to use them. */ static abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size) { |