accel/tcg: re-factor non-RAM execution code
There is no real need to use CF_NOCACHE here. As long as the TB isn't linked to other TBs or included in the QHT or jump cache then it will only get executed once. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20210213130325.14781-19-alex.bennee@linaro.org>
This commit is contained in:
parent
a11bbb6a23
commit
873d64ac30
|
@ -1779,7 +1779,8 @@ static inline void tb_page_add(PageDesc *p, TranslationBlock *tb,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add a new TB and link it to the physical page tables. phys_page2 is
|
/*
|
||||||
|
* Add a new TB and link it to the physical page tables. phys_page2 is
|
||||||
* (-1) to indicate that only one page contains the TB.
|
* (-1) to indicate that only one page contains the TB.
|
||||||
*
|
*
|
||||||
* Called with mmap_lock held for user-mode emulation.
|
* Called with mmap_lock held for user-mode emulation.
|
||||||
|
@ -1798,17 +1799,6 @@ tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc,
|
||||||
|
|
||||||
assert_memory_lock();
|
assert_memory_lock();
|
||||||
|
|
||||||
if (phys_pc == -1) {
|
|
||||||
/*
|
|
||||||
* If the TB is not associated with a physical RAM page then
|
|
||||||
* it must be a temporary one-insn TB, and we have nothing to do
|
|
||||||
* except fill in the page_addr[] fields.
|
|
||||||
*/
|
|
||||||
assert(tb->cflags & CF_NOCACHE);
|
|
||||||
tb->page_addr[0] = tb->page_addr[1] = -1;
|
|
||||||
return tb;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add the TB to the page list, acquiring first the pages's locks.
|
* Add the TB to the page list, acquiring first the pages's locks.
|
||||||
* We keep the locks held until after inserting the TB in the hash table,
|
* We keep the locks held until after inserting the TB in the hash table,
|
||||||
|
@ -1881,9 +1871,8 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
||||||
phys_pc = get_page_addr_code(env, pc);
|
phys_pc = get_page_addr_code(env, pc);
|
||||||
|
|
||||||
if (phys_pc == -1) {
|
if (phys_pc == -1) {
|
||||||
/* Generate a temporary TB with 1 insn in it */
|
/* Generate a one-shot TB with 1 insn in it */
|
||||||
cflags &= ~CF_COUNT_MASK;
|
cflags = (cflags & ~CF_COUNT_MASK) | 1;
|
||||||
cflags |= CF_NOCACHE | 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cflags &= ~CF_CLUSTER_MASK;
|
cflags &= ~CF_CLUSTER_MASK;
|
||||||
|
@ -2097,6 +2086,17 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
||||||
tb_reset_jump(tb, 1);
|
tb_reset_jump(tb, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the TB is not associated with a physical RAM page then
|
||||||
|
* it must be a temporary one-insn TB, and we have nothing to do
|
||||||
|
* except fill in the page_addr[] fields. Return early before
|
||||||
|
* attempting to link to other TBs or add to the lookup table.
|
||||||
|
*/
|
||||||
|
if (phys_pc == -1) {
|
||||||
|
tb->page_addr[0] = tb->page_addr[1] = -1;
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
/* check next page if needed */
|
/* check next page if needed */
|
||||||
virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
|
virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
|
||||||
phys_page2 = -1;
|
phys_page2 = -1;
|
||||||
|
|
Loading…
Reference in New Issue