Message ID | 20240416040609.1313605-4-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | plugins: Use unwind info for special gdb registers | expand |
On 4/15/24 21:06, Richard Henderson wrote: > Fix the i386 get_memio_eip function to use tb->cflags > instead of cs->tcg_cflags. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > include/exec/cpu-common.h | 9 +++++---- > accel/tcg/translate-all.c | 9 +++++---- > target/i386/helper.c | 6 ++++-- > 3 files changed, 14 insertions(+), 10 deletions(-) > > diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h > index 6346df17ce..f056132cab 100644 > --- a/include/exec/cpu-common.h > +++ b/include/exec/cpu-common.h > @@ -176,12 +176,13 @@ void list_cpus(void); > * @host_pc: the host pc within the translation > * @data: output data > * > - * Attempt to load the the unwind state for a host pc occurring in > - * translated code. If @host_pc is not in translated code, the > - * function returns false; otherwise @data is loaded. > + * Attempt to load the the unwind state for a host pc occurring in translated > + * code. If @host_pc is not in translated code, the function returns NULL; > + * otherwise @data is loaded and the TranslationBlock is returned. > * This is the same unwind info as given to restore_state_to_opc. > */ > -bool cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, uint64_t *data); > +const TranslationBlock *cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, > + uint64_t *data); > > /** > * cpu_restore_state: > diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c > index 83cc14fbde..c745bc5b6c 100644 > --- a/accel/tcg/translate-all.c > +++ b/accel/tcg/translate-all.c > @@ -243,15 +243,16 @@ bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc) > return false; > } > > -bool cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, uint64_t *data) > +const TranslationBlock * > +cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, uint64_t *data) > { > if (in_code_gen_buffer((const void *)(host_pc - tcg_splitwx_diff))) { > TranslationBlock *tb = tcg_tb_lookup(host_pc); > - if (tb) { > - return cpu_unwind_data_from_tb(tb, host_pc, data) >= 0; > + if (tb && cpu_unwind_data_from_tb(tb, host_pc, data) >= 0) { > + return tb; > } > } > - return false; > + return NULL; > } > > void page_init(void) > diff --git a/target/i386/helper.c b/target/i386/helper.c > index 23ccb23a5b..eaa691a851 100644 > --- a/target/i386/helper.c > +++ b/target/i386/helper.c > @@ -517,13 +517,15 @@ static inline target_ulong get_memio_eip(CPUX86State *env) > #ifdef CONFIG_TCG > uint64_t data[TARGET_INSN_START_WORDS]; > CPUState *cs = env_cpu(env); > + const TranslationBlock *tb; > > - if (!cpu_unwind_state_data(cs, cs->mem_io_pc, data)) { > + tb = cpu_unwind_state_data(cs, cs->mem_io_pc, data); > + if (!tb) { > return env->eip; > } > > /* Per x86_restore_state_to_opc. */ > - if (cs->tcg_cflags & CF_PCREL) { > + if (tb->cflags & CF_PCREL) { > return (env->eip & TARGET_PAGE_MASK) | data[0]; > } else { > return data[0] - env->segs[R_CS].base; Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Richard Henderson <richard.henderson@linaro.org> writes: > Fix the i386 get_memio_eip function to use tb->cflags > instead of cs->tcg_cflags. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > include/exec/cpu-common.h | 9 +++++---- > accel/tcg/translate-all.c | 9 +++++---- > target/i386/helper.c | 6 ++++-- > 3 files changed, 14 insertions(+), 10 deletions(-) > <snip> > > /* Per x86_restore_state_to_opc. */ > - if (cs->tcg_cflags & CF_PCREL) { > + if (tb->cflags & CF_PCREL) { > return (env->eip & TARGET_PAGE_MASK) | data[0]; this has a merge conflict with subsequent changes. > } else { > return data[0] - env->segs[R_CS].base;
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h index 6346df17ce..f056132cab 100644 --- a/include/exec/cpu-common.h +++ b/include/exec/cpu-common.h @@ -176,12 +176,13 @@ void list_cpus(void); * @host_pc: the host pc within the translation * @data: output data * - * Attempt to load the the unwind state for a host pc occurring in - * translated code. If @host_pc is not in translated code, the - * function returns false; otherwise @data is loaded. + * Attempt to load the the unwind state for a host pc occurring in translated + * code. If @host_pc is not in translated code, the function returns NULL; + * otherwise @data is loaded and the TranslationBlock is returned. * This is the same unwind info as given to restore_state_to_opc. */ -bool cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, uint64_t *data); +const TranslationBlock *cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, + uint64_t *data); /** * cpu_restore_state: diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index 83cc14fbde..c745bc5b6c 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -243,15 +243,16 @@ bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc) return false; } -bool cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, uint64_t *data) +const TranslationBlock * +cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, uint64_t *data) { if (in_code_gen_buffer((const void *)(host_pc - tcg_splitwx_diff))) { TranslationBlock *tb = tcg_tb_lookup(host_pc); - if (tb) { - return cpu_unwind_data_from_tb(tb, host_pc, data) >= 0; + if (tb && cpu_unwind_data_from_tb(tb, host_pc, data) >= 0) { + return tb; } } - return false; + return NULL; } void page_init(void) diff --git a/target/i386/helper.c b/target/i386/helper.c index 23ccb23a5b..eaa691a851 100644 --- a/target/i386/helper.c +++ b/target/i386/helper.c @@ -517,13 +517,15 @@ static inline target_ulong get_memio_eip(CPUX86State *env) #ifdef CONFIG_TCG uint64_t data[TARGET_INSN_START_WORDS]; CPUState *cs = env_cpu(env); + const TranslationBlock *tb; - if (!cpu_unwind_state_data(cs, cs->mem_io_pc, data)) { + tb = cpu_unwind_state_data(cs, cs->mem_io_pc, data); + if (!tb) { return env->eip; } /* Per x86_restore_state_to_opc. */ - if (cs->tcg_cflags & CF_PCREL) { + if (tb->cflags & CF_PCREL) { return (env->eip & TARGET_PAGE_MASK) | data[0]; } else { return data[0] - env->segs[R_CS].base;
Fix the i386 get_memio_eip function to use tb->cflags instead of cs->tcg_cflags. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- include/exec/cpu-common.h | 9 +++++---- accel/tcg/translate-all.c | 9 +++++---- target/i386/helper.c | 6 ++++-- 3 files changed, 14 insertions(+), 10 deletions(-)