Commit 50a9569b591a83071052614f2ff497ff2f2aa2ef

Authored by balrog
1 parent 703243a0

Mark host pages as reserved (Magnus Damm).


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3813 c046a42c-6fe2-441c-8c8c-71466251a162
cpu-all.h
... ... @@ -716,6 +716,7 @@ extern unsigned long qemu_host_page_mask;
716 716 /* original state of the write flag (used when tracking self-modifying
717 717 code */
718 718 #define PAGE_WRITE_ORG 0x0010
  719 +#define PAGE_RESERVED 0x0020
719 720  
720 721 void page_dump(FILE *f);
721 722 int page_get_flags(target_ulong address);
... ...
... ... @@ -209,6 +209,27 @@ static void page_init(void)
209 209 qemu_host_page_mask = ~(qemu_host_page_size - 1);
210 210 l1_phys_map = qemu_vmalloc(L1_SIZE * sizeof(void *));
211 211 memset(l1_phys_map, 0, L1_SIZE * sizeof(void *));
  212 +
  213 +#if !defined(_WIN32) && defined(CONFIG_USER_ONLY)
  214 + {
  215 + long long startaddr, endaddr;
  216 + FILE *f;
  217 + int n;
  218 +
  219 + f = fopen("/proc/self/maps", "r");
  220 + if (f) {
  221 + do {
  222 + n = fscanf (f, "%llx-%llx %*[^\n]\n", &startaddr, &endaddr);
  223 + if (n == 2) {
  224 + page_set_flags(TARGET_PAGE_ALIGN(startaddr),
  225 + TARGET_PAGE_ALIGN(endaddr),
  226 + PAGE_RESERVED);
  227 + }
  228 + } while (!feof(f));
  229 + fclose(f);
  230 + }
  231 + }
  232 +#endif
212 233 }
213 234  
214 235 static inline PageDesc *page_find_alloc(unsigned int index)
... ...
linux-user/mmap.c
... ... @@ -162,7 +162,7 @@ static abi_ulong mmap_next_start = 0x40000000;
162 162 'start'. If 'start' == 0, then a default start address is used.
163 163 Return -1 if error.
164 164 */
165   -/* XXX: should mark pages used by the host as reserved to be sure not
  165 +/* page_init() marks pages used by the host as reserved to be sure not
166 166 to use them. */
167 167 static abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size)
168 168 {
... ...