On 05/07/2016 13:14, Alex Bennée wrote:
> /*
> * Patch the last TB with a jump to the current TB.
> *
> * Modification of the TB has to be protected with tb_lock which can
> * either be already held or taken here.
> */
> static inline void maybe_patch_last_tb(CPUState *cpu,
> TranslationBlock *tb,
> TranslationBlock **last_tb,
> int tb_exit,
> bool locked)
> {
> if (cpu->tb_flushed) {
> /* Ensure that no TB jump will be modified as the
> * translation buffer has been flushed.
> */
> *last_tb = NULL;
> cpu->tb_flushed = false;
> }
> #ifndef CONFIG_USER_ONLY
> /* We don't take care of direct jumps when address mapping changes in
> * system emulation. So it's not safe to make a direct jump to a TB
> * spanning two pages because the mapping for the second page can change.
> */
> if (tb->page_addr[1] != -1) {
> *last_tb = NULL;
> }
> #endif
> /* See if we can patch the calling TB. */
> if (*last_tb && !qemu_loglevel_mask(CPU_LOG_TB_NOCHAIN)) {
> if (!locked) {
> tb_lock();
> }
> tb_add_jump(*last_tb, tb_exit, tb);
> if (!locked) {
> tb_unlock();
> }
> }
> }
Why not add tb_lock_recursive() and tb_lock_reset()?
Paolo