mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
Refactor translation block CPU state handling (Jan Kiszka)
This patch refactors the way the CPU state is handled that is associated with a TB. The basic motivation is to move more arch specific code out of generic files. Specifically the long #ifdef clutter in tb_find_fast() has to be overcome in order to avoid duplicating it for the gdb watchpoint fixes (patch "Restore pc on watchpoint hits"). Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5736 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
622ed3605b
commit
6b9175478e
11 changed files with 115 additions and 95 deletions
56
exec.c
56
exec.c
|
@ -886,12 +886,19 @@ TranslationBlock *tb_gen_code(CPUState *env,
|
|||
void tb_invalidate_phys_page_range(target_phys_addr_t start, target_phys_addr_t end,
|
||||
int is_cpu_write_access)
|
||||
{
|
||||
int n, current_tb_modified, current_tb_not_found, current_flags;
|
||||
TranslationBlock *tb, *tb_next, *saved_tb;
|
||||
CPUState *env = cpu_single_env;
|
||||
PageDesc *p;
|
||||
TranslationBlock *tb, *tb_next, *current_tb, *saved_tb;
|
||||
target_ulong tb_start, tb_end;
|
||||
target_ulong current_pc, current_cs_base;
|
||||
PageDesc *p;
|
||||
int n;
|
||||
#ifdef TARGET_HAS_PRECISE_SMC
|
||||
int current_tb_not_found = is_cpu_write_access;
|
||||
TranslationBlock *current_tb = NULL;
|
||||
int current_tb_modified = 0;
|
||||
target_ulong current_pc = 0;
|
||||
target_ulong current_cs_base = 0;
|
||||
int current_flags = 0;
|
||||
#endif /* TARGET_HAS_PRECISE_SMC */
|
||||
|
||||
p = page_find(start >> TARGET_PAGE_BITS);
|
||||
if (!p)
|
||||
|
@ -905,12 +912,6 @@ void tb_invalidate_phys_page_range(target_phys_addr_t start, target_phys_addr_t
|
|||
|
||||
/* we remove all the TBs in the range [start, end[ */
|
||||
/* XXX: see if in some cases it could be faster to invalidate all the code */
|
||||
current_tb_not_found = is_cpu_write_access;
|
||||
current_tb_modified = 0;
|
||||
current_tb = NULL; /* avoid warning */
|
||||
current_pc = 0; /* avoid warning */
|
||||
current_cs_base = 0; /* avoid warning */
|
||||
current_flags = 0; /* avoid warning */
|
||||
tb = p->first_tb;
|
||||
while (tb != NULL) {
|
||||
n = (long)tb & 3;
|
||||
|
@ -947,14 +948,8 @@ void tb_invalidate_phys_page_range(target_phys_addr_t start, target_phys_addr_t
|
|||
current_tb_modified = 1;
|
||||
cpu_restore_state(current_tb, env,
|
||||
env->mem_io_pc, NULL);
|
||||
#if defined(TARGET_I386)
|
||||
current_flags = env->hflags;
|
||||
current_flags |= (env->eflags & (IOPL_MASK | TF_MASK | VM_MASK));
|
||||
current_cs_base = (target_ulong)env->segs[R_CS].base;
|
||||
current_pc = current_cs_base + env->eip;
|
||||
#else
|
||||
#error unsupported CPU
|
||||
#endif
|
||||
cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base,
|
||||
¤t_flags);
|
||||
}
|
||||
#endif /* TARGET_HAS_PRECISE_SMC */
|
||||
/* we need to do that to handle the case where a signal
|
||||
|
@ -1027,12 +1022,16 @@ static inline void tb_invalidate_phys_page_fast(target_phys_addr_t start, int le
|
|||
static void tb_invalidate_phys_page(target_phys_addr_t addr,
|
||||
unsigned long pc, void *puc)
|
||||
{
|
||||
int n, current_flags, current_tb_modified;
|
||||
target_ulong current_pc, current_cs_base;
|
||||
TranslationBlock *tb;
|
||||
PageDesc *p;
|
||||
TranslationBlock *tb, *current_tb;
|
||||
int n;
|
||||
#ifdef TARGET_HAS_PRECISE_SMC
|
||||
TranslationBlock *current_tb = NULL;
|
||||
CPUState *env = cpu_single_env;
|
||||
int current_tb_modified = 0;
|
||||
target_ulong current_pc = 0;
|
||||
target_ulong current_cs_base = 0;
|
||||
int current_flags = 0;
|
||||
#endif
|
||||
|
||||
addr &= TARGET_PAGE_MASK;
|
||||
|
@ -1040,11 +1039,6 @@ static void tb_invalidate_phys_page(target_phys_addr_t addr,
|
|||
if (!p)
|
||||
return;
|
||||
tb = p->first_tb;
|
||||
current_tb_modified = 0;
|
||||
current_tb = NULL;
|
||||
current_pc = 0; /* avoid warning */
|
||||
current_cs_base = 0; /* avoid warning */
|
||||
current_flags = 0; /* avoid warning */
|
||||
#ifdef TARGET_HAS_PRECISE_SMC
|
||||
if (tb && pc != 0) {
|
||||
current_tb = tb_find_pc(pc);
|
||||
|
@ -1064,14 +1058,8 @@ static void tb_invalidate_phys_page(target_phys_addr_t addr,
|
|||
|
||||
current_tb_modified = 1;
|
||||
cpu_restore_state(current_tb, env, pc, puc);
|
||||
#if defined(TARGET_I386)
|
||||
current_flags = env->hflags;
|
||||
current_flags |= (env->eflags & (IOPL_MASK | TF_MASK | VM_MASK));
|
||||
current_cs_base = (target_ulong)env->segs[R_CS].base;
|
||||
current_pc = current_cs_base + env->eip;
|
||||
#else
|
||||
#error unsupported CPU
|
||||
#endif
|
||||
cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base,
|
||||
¤t_flags);
|
||||
}
|
||||
#endif /* TARGET_HAS_PRECISE_SMC */
|
||||
tb_phys_invalidate(tb, addr);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue