Make sure we flush cached blocks from the tb-jmp-cache when we replace valid tlb entries.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4352 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
b5e19d4ce7
commit
5c751e99c3
28
exec.c
28
exec.c
@ -1366,6 +1366,21 @@ CPUState *cpu_copy(CPUState *env)
|
|||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
|
||||||
|
static inline void tlb_flush_jmp_cache(CPUState *env, target_ulong addr)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
/* Discard jump cache entries for any tb which might potentially
|
||||||
|
overlap the flushed page. */
|
||||||
|
i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
|
||||||
|
memset (&env->tb_jmp_cache[i], 0,
|
||||||
|
TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
|
||||||
|
|
||||||
|
i = tb_jmp_cache_hash_page(addr);
|
||||||
|
memset (&env->tb_jmp_cache[i], 0,
|
||||||
|
TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
|
||||||
|
}
|
||||||
|
|
||||||
/* NOTE: if flush_global is true, also flush global entries (not
|
/* NOTE: if flush_global is true, also flush global entries (not
|
||||||
implemented yet) */
|
implemented yet) */
|
||||||
void tlb_flush(CPUState *env, int flush_global)
|
void tlb_flush(CPUState *env, int flush_global)
|
||||||
@ -1428,7 +1443,6 @@ static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
|
|||||||
void tlb_flush_page(CPUState *env, target_ulong addr)
|
void tlb_flush_page(CPUState *env, target_ulong addr)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
TranslationBlock *tb;
|
|
||||||
|
|
||||||
#if defined(DEBUG_TLB)
|
#if defined(DEBUG_TLB)
|
||||||
printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr);
|
printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr);
|
||||||
@ -1448,13 +1462,7 @@ void tlb_flush_page(CPUState *env, target_ulong addr)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Discard jump cache entries for any tb which might potentially
|
tlb_flush_jmp_cache(env, addr);
|
||||||
overlap the flushed page. */
|
|
||||||
i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
|
|
||||||
memset (&env->tb_jmp_cache[i], 0, TB_JMP_PAGE_SIZE * sizeof(tb));
|
|
||||||
|
|
||||||
i = tb_jmp_cache_hash_page(addr);
|
|
||||||
memset (&env->tb_jmp_cache[i], 0, TB_JMP_PAGE_SIZE * sizeof(tb));
|
|
||||||
|
|
||||||
#if !defined(CONFIG_SOFTMMU)
|
#if !defined(CONFIG_SOFTMMU)
|
||||||
if (addr < MMAP_AREA_END)
|
if (addr < MMAP_AREA_END)
|
||||||
@ -1706,6 +1714,10 @@ int tlb_set_page_exec(CPUState *env, target_ulong vaddr,
|
|||||||
} else {
|
} else {
|
||||||
te->addr_read = -1;
|
te->addr_read = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (te->addr_code != -1) {
|
||||||
|
tlb_flush_jmp_cache(env, te->addr_code);
|
||||||
|
}
|
||||||
if (prot & PAGE_EXEC) {
|
if (prot & PAGE_EXEC) {
|
||||||
te->addr_code = address;
|
te->addr_code = address;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user