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