|
@@ -392,27 +392,18 @@ void tb_destroy(TranslationBlock *tb)
|
|
|
|
|
|
bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc, bool will_exit)
|
|
|
{
|
|
|
- TranslationBlock *tb;
|
|
|
- bool r = false;
|
|
|
- uintptr_t check_offset;
|
|
|
-
|
|
|
- /* The host_pc has to be in the region of current code buffer. If
|
|
|
- * it is not we will not be able to resolve it here. The two cases
|
|
|
- * where host_pc will not be correct are:
|
|
|
+ /*
|
|
|
+ * The host_pc has to be in the region of the code buffer.
|
|
|
+ * If it is not we will not be able to resolve it here.
|
|
|
+ * The two cases where host_pc will not be correct are:
|
|
|
*
|
|
|
* - fault during translation (instruction fetch)
|
|
|
* - fault from helper (not using GETPC() macro)
|
|
|
*
|
|
|
* Either way we need return early as we can't resolve it here.
|
|
|
- *
|
|
|
- * We are using unsigned arithmetic so if host_pc <
|
|
|
- * tcg_init_ctx.code_gen_buffer check_offset will wrap to way
|
|
|
- * above the code_gen_buffer_size
|
|
|
*/
|
|
|
- check_offset = host_pc - (uintptr_t) tcg_init_ctx.code_gen_buffer;
|
|
|
-
|
|
|
- if (check_offset < tcg_init_ctx.code_gen_buffer_size) {
|
|
|
- tb = tcg_tb_lookup(host_pc);
|
|
|
+ if (in_code_gen_buffer((const void *)host_pc)) {
|
|
|
+ TranslationBlock *tb = tcg_tb_lookup(host_pc);
|
|
|
if (tb) {
|
|
|
cpu_restore_state_from_tb(cpu, tb, host_pc, will_exit);
|
|
|
if (tb_cflags(tb) & CF_NOCACHE) {
|
|
@@ -421,11 +412,10 @@ bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc, bool will_exit)
|
|
|
tcg_tb_remove(tb);
|
|
|
tb_destroy(tb);
|
|
|
}
|
|
|
- r = true;
|
|
|
+ return true;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- return r;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
static void page_init(void)
|