diff options
Diffstat (limited to 'exec.c')
-rw-r--r-- | exec.c | 30 |
1 files changed, 12 insertions, 18 deletions
@@ -1894,10 +1894,19 @@ int page_check_range(target_ulong start, target_ulong len, int flags) if( !(p->flags & PAGE_VALID) ) return -1; - if (!(p->flags & PAGE_READ) && (flags & PAGE_READ) ) - return -1; - if (!(p->flags & PAGE_WRITE) && (flags & PAGE_WRITE) ) + if ((flags & PAGE_READ) && !(p->flags & PAGE_READ)) return -1; + if (flags & PAGE_WRITE) { + if (!(p->flags & PAGE_WRITE_ORG)) + return -1; + /* unprotect the page if it was put read-only because it + contains translated code */ + if (!(p->flags & PAGE_WRITE)) { + if (!page_unprotect(addr, 0, NULL)) + return -1; + } + return 0; + } } return 0; } @@ -1942,21 +1951,6 @@ int page_unprotect(target_ulong address, unsigned long pc, void *puc) return 0; } -/* call this function when system calls directly modify a memory area */ -/* ??? This should be redundant now we have lock_user. */ -void page_unprotect_range(target_ulong data, target_ulong data_size) -{ - target_ulong start, end, addr; - - start = data; - end = start + data_size; - start &= TARGET_PAGE_MASK; - end = TARGET_PAGE_ALIGN(end); - for(addr = start; addr < end; addr += TARGET_PAGE_SIZE) { - page_unprotect(addr, 0, NULL); - } -} - static inline void tlb_set_dirty(CPUState *env, unsigned long addr, target_ulong vaddr) { |