aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpu-all.h1
-rw-r--r--exec.c21
-rw-r--r--linux-user/mmap.c2
3 files changed, 23 insertions, 1 deletions
diff --git a/cpu-all.h b/cpu-all.h
index 6b78435093..7876a470e6 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -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);
diff --git a/exec.c b/exec.c
index fd08ec9278..07d5de04ae 100644
--- a/exec.c
+++ b/exec.c
@@ -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)
{