Commit 1565b7bcd79c5253fd400cc0ef8b398da788e965
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
exec.c
... | ... | @@ -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); | ... | ... |