mirror of https://github.com/proxmox/mirror_qemu
cpu-exec: invalidate nocache translation if they are interrupted
In this case, QEMU might longjmp out of cpu-exec.c and miss the final cleanup in cpu_exec_nocache. Do this manually through a new compile flag. Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>master
parent
2a62914bd8
commit
d8a499f17e
|
@ -216,7 +216,7 @@ static void cpu_exec_nocache(CPUArchState *env, int max_cycles,
|
||||||
/* tb_gen_code can flush our orig_tb, invalidate it now */
|
/* tb_gen_code can flush our orig_tb, invalidate it now */
|
||||||
tb_phys_invalidate(orig_tb, -1);
|
tb_phys_invalidate(orig_tb, -1);
|
||||||
tb = tb_gen_code(cpu, pc, cs_base, flags,
|
tb = tb_gen_code(cpu, pc, cs_base, flags,
|
||||||
max_cycles);
|
max_cycles | CF_NOCACHE);
|
||||||
cpu->current_tb = tb;
|
cpu->current_tb = tb;
|
||||||
/* execute the generated code */
|
/* execute the generated code */
|
||||||
trace_exec_tb_nocache(tb, tb->pc);
|
trace_exec_tb_nocache(tb, tb->pc);
|
||||||
|
|
|
@ -145,6 +145,7 @@ struct TranslationBlock {
|
||||||
uint16_t cflags; /* compile flags */
|
uint16_t cflags; /* compile flags */
|
||||||
#define CF_COUNT_MASK 0x7fff
|
#define CF_COUNT_MASK 0x7fff
|
||||||
#define CF_LAST_IO 0x8000 /* Last insn may be an IO access. */
|
#define CF_LAST_IO 0x8000 /* Last insn may be an IO access. */
|
||||||
|
#define CF_NOCACHE 0x10000 /* To be freed after execution */
|
||||||
|
|
||||||
void *tc_ptr; /* pointer to the translated code */
|
void *tc_ptr; /* pointer to the translated code */
|
||||||
/* next matching tb for physical address. */
|
/* next matching tb for physical address. */
|
||||||
|
|
|
@ -264,6 +264,12 @@ bool cpu_restore_state(CPUState *cpu, uintptr_t retaddr)
|
||||||
tb = tb_find_pc(retaddr);
|
tb = tb_find_pc(retaddr);
|
||||||
if (tb) {
|
if (tb) {
|
||||||
cpu_restore_state_from_tb(cpu, tb, retaddr);
|
cpu_restore_state_from_tb(cpu, tb, retaddr);
|
||||||
|
if (tb->cflags & CF_NOCACHE) {
|
||||||
|
/* one-shot translation, invalidate it immediately */
|
||||||
|
cpu->current_tb = NULL;
|
||||||
|
tb_phys_invalidate(tb, -1);
|
||||||
|
tb_free(tb);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue