Commit 1565b7bcd79c5253fd400cc0ef8b398da788e965

Authored by bellard
1 parent b409186b

fixed page_unprotect() if host_page_size > TARGET_PAGE_SIZE


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@179 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 18 additions and 15 deletions
... ... @@ -394,26 +394,29 @@ TranslationBlock *tb_alloc(unsigned long pc,
394 394 page. Return TRUE if the fault was succesfully handled. */
395 395 int page_unprotect(unsigned long address)
396 396 {
397   - unsigned int page_index, prot;
398   - PageDesc *p;
  397 + unsigned int page_index, prot, pindex;
  398 + PageDesc *p, *p1;
399 399 unsigned long host_start, host_end, addr;
400 400  
401   - page_index = address >> TARGET_PAGE_BITS;
402   - p = page_find(page_index);
403   - if (!p)
  401 + host_start = address & host_page_mask;
  402 + page_index = host_start >> TARGET_PAGE_BITS;
  403 + p1 = page_find(page_index);
  404 + if (!p1)
404 405 return 0;
405   - if ((p->flags & (PAGE_WRITE_ORG | PAGE_WRITE)) == PAGE_WRITE_ORG) {
406   - /* if the page was really writable, then we change its
407   - protection back to writable */
408   - host_start = address & host_page_mask;
409   - host_end = host_start + host_page_size;
410   - prot = 0;
411   - for(addr = host_start; addr < host_end; addr += TARGET_PAGE_SIZE)
412   - prot |= page_get_flags(addr);
  406 + host_end = host_start + host_page_size;
  407 + p = p1;
  408 + prot = 0;
  409 + for(addr = host_start;addr < host_end; addr += TARGET_PAGE_SIZE) {
  410 + prot |= p->flags;
  411 + p++;
  412 + }
  413 + /* if the page was really writable, then we change its
  414 + protection back to writable */
  415 + if (prot & PAGE_WRITE_ORG) {
413 416 mprotect((void *)host_start, host_page_size,
414 417 (prot & PAGE_BITS) | PAGE_WRITE);
415   - p->flags |= PAGE_WRITE;
416   -
  418 + pindex = (address - host_start) >> TARGET_PAGE_BITS;
  419 + p1[pindex].flags |= PAGE_WRITE;
417 420 /* and since the content will be modified, we must invalidate
418 421 the corresponding translated code. */
419 422 tb_invalidate_page(address);
... ...