diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2005-11-28 21:19:04 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2005-11-28 21:19:04 +0000 |
commit | 84b7b8e778937f1ec3cbdb8914261a2fe0067ef2 (patch) | |
tree | e72030ed083977fca23c33bef2f047e055e3fea8 /exec-all.h | |
parent | 5cf3839607a6883a16fe65124d2f8f244de0f8ac (diff) |
PAGE_EXEC support in TLBs
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1676 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'exec-all.h')
-rw-r--r-- | exec-all.h | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/exec-all.h b/exec-all.h index 9034ce869d..08351354ed 100644 --- a/exec-all.h +++ b/exec-all.h @@ -98,9 +98,17 @@ void tb_invalidate_phys_page_range(target_ulong start, target_ulong end, void tb_invalidate_page_range(target_ulong start, target_ulong end); void tlb_flush_page(CPUState *env, target_ulong addr); void tlb_flush(CPUState *env, int flush_global); -int tlb_set_page(CPUState *env, target_ulong vaddr, - target_phys_addr_t paddr, int prot, - int is_user, int is_softmmu); +int tlb_set_page_exec(CPUState *env, target_ulong vaddr, + target_phys_addr_t paddr, int prot, + int is_user, int is_softmmu); +static inline int tlb_set_page(CPUState *env, target_ulong vaddr, + target_phys_addr_t paddr, int prot, + int is_user, int is_softmmu) +{ + if (prot & PAGE_READ) + prot |= PAGE_EXEC; + return tlb_set_page_exec(env, vaddr, paddr, prot, is_user, is_softmmu); +} #define CODE_GEN_MAX_SIZE 65536 #define CODE_GEN_ALIGN 16 /* must be >= of the size of a icache line */ @@ -554,15 +562,15 @@ static inline target_ulong get_phys_addr_code(CPUState *env, target_ulong addr) #else #error unimplemented CPU #endif - if (__builtin_expect(env->tlb_read[is_user][index].address != + if (__builtin_expect(env->tlb_table[is_user][index].addr_code != (addr & TARGET_PAGE_MASK), 0)) { ldub_code(addr); } - pd = env->tlb_read[is_user][index].address & ~TARGET_PAGE_MASK; + pd = env->tlb_table[is_user][index].addr_code & ~TARGET_PAGE_MASK; if (pd > IO_MEM_ROM) { cpu_abort(env, "Trying to execute code outside RAM or ROM at 0x%08lx\n", addr); } - return addr + env->tlb_read[is_user][index].addend - (unsigned long)phys_ram_base; + return addr + env->tlb_table[is_user][index].addend - (unsigned long)phys_ram_base; } #endif |