Message ID | 20240416040609.1313605-2-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | plugins: Use unwind info for special gdb registers | expand |
On 4/15/24 21:06, Richard Henderson wrote: > Add an opcode to find a code address within the current insn, > for later use with unwinding. Generate the code generically > using tcg_reg_alloc_do_movi. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > include/tcg/tcg-op-common.h | 1 + > include/tcg/tcg-opc.h | 1 + > tcg/tcg-op.c | 5 +++++ > tcg/tcg.c | 10 ++++++++++ > 4 files changed, 17 insertions(+) > > diff --git a/include/tcg/tcg-op-common.h b/include/tcg/tcg-op-common.h > index 009e2778c5..a32c88a182 100644 > --- a/include/tcg/tcg-op-common.h > +++ b/include/tcg/tcg-op-common.h > @@ -76,6 +76,7 @@ void tcg_gen_lookup_and_goto_ptr(void); > > void tcg_gen_plugin_cb(unsigned from); > void tcg_gen_plugin_mem_cb(TCGv_i64 addr, unsigned meminfo); > +void tcg_gen_plugin_pc(TCGv_ptr); > > /* 32 bit ops */ > > diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h > index 546eb49c11..087d1b82da 100644 > --- a/include/tcg/tcg-opc.h > +++ b/include/tcg/tcg-opc.h > @@ -199,6 +199,7 @@ DEF(goto_ptr, 0, 1, 0, TCG_OPF_BB_EXIT | TCG_OPF_BB_END) > > DEF(plugin_cb, 0, 0, 1, TCG_OPF_NOT_PRESENT) > DEF(plugin_mem_cb, 0, 1, 1, TCG_OPF_NOT_PRESENT) > +DEF(plugin_pc, 1, 0, 0, TCG_OPF_NOT_PRESENT) > > /* Replicate ld/st ops for 32 and 64-bit guest addresses. */ > DEF(qemu_ld_a32_i32, 1, 1, 1, > diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c > index eff3728622..b8ca78cbe4 100644 > --- a/tcg/tcg-op.c > +++ b/tcg/tcg-op.c > @@ -322,6 +322,11 @@ void tcg_gen_plugin_mem_cb(TCGv_i64 addr, unsigned meminfo) > tcg_gen_op2(INDEX_op_plugin_mem_cb, tcgv_i64_arg(addr), meminfo); > } > > +void tcg_gen_plugin_pc(TCGv_ptr arg) > +{ > + tcg_gen_op1(INDEX_op_plugin_pc, tcgv_ptr_arg(arg)); > +} > + > /* 32 bit ops */ > > void tcg_gen_discard_i32(TCGv_i32 arg) > diff --git a/tcg/tcg.c b/tcg/tcg.c > index d248c52e96..42e2b53729 100644 > --- a/tcg/tcg.c > +++ b/tcg/tcg.c > @@ -4701,6 +4701,13 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOp *op) > } > } > > +static void tcg_reg_alloc_plugin_pc(TCGContext *s, const TCGOp *op) > +{ > + tcg_reg_alloc_do_movi(s, arg_temp(op->args[0]), > + (uintptr_t)tcg_splitwx_to_rx(s->code_ptr), > + op->life, output_pref(op, 0)); > +} > + > /* > * Specialized code generation for INDEX_op_dup_vec. > */ > @@ -6208,6 +6215,9 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start) > case INDEX_op_mov_vec: > tcg_reg_alloc_mov(s, op); > break; > + case INDEX_op_plugin_pc: > + tcg_reg_alloc_plugin_pc(s, op); > + break; > case INDEX_op_dup_vec: > tcg_reg_alloc_dup(s, op); > break; Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
diff --git a/include/tcg/tcg-op-common.h b/include/tcg/tcg-op-common.h index 009e2778c5..a32c88a182 100644 --- a/include/tcg/tcg-op-common.h +++ b/include/tcg/tcg-op-common.h @@ -76,6 +76,7 @@ void tcg_gen_lookup_and_goto_ptr(void); void tcg_gen_plugin_cb(unsigned from); void tcg_gen_plugin_mem_cb(TCGv_i64 addr, unsigned meminfo); +void tcg_gen_plugin_pc(TCGv_ptr); /* 32 bit ops */ diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h index 546eb49c11..087d1b82da 100644 --- a/include/tcg/tcg-opc.h +++ b/include/tcg/tcg-opc.h @@ -199,6 +199,7 @@ DEF(goto_ptr, 0, 1, 0, TCG_OPF_BB_EXIT | TCG_OPF_BB_END) DEF(plugin_cb, 0, 0, 1, TCG_OPF_NOT_PRESENT) DEF(plugin_mem_cb, 0, 1, 1, TCG_OPF_NOT_PRESENT) +DEF(plugin_pc, 1, 0, 0, TCG_OPF_NOT_PRESENT) /* Replicate ld/st ops for 32 and 64-bit guest addresses. */ DEF(qemu_ld_a32_i32, 1, 1, 1, diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index eff3728622..b8ca78cbe4 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -322,6 +322,11 @@ void tcg_gen_plugin_mem_cb(TCGv_i64 addr, unsigned meminfo) tcg_gen_op2(INDEX_op_plugin_mem_cb, tcgv_i64_arg(addr), meminfo); } +void tcg_gen_plugin_pc(TCGv_ptr arg) +{ + tcg_gen_op1(INDEX_op_plugin_pc, tcgv_ptr_arg(arg)); +} + /* 32 bit ops */ void tcg_gen_discard_i32(TCGv_i32 arg) diff --git a/tcg/tcg.c b/tcg/tcg.c index d248c52e96..42e2b53729 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -4701,6 +4701,13 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOp *op) } } +static void tcg_reg_alloc_plugin_pc(TCGContext *s, const TCGOp *op) +{ + tcg_reg_alloc_do_movi(s, arg_temp(op->args[0]), + (uintptr_t)tcg_splitwx_to_rx(s->code_ptr), + op->life, output_pref(op, 0)); +} + /* * Specialized code generation for INDEX_op_dup_vec. */ @@ -6208,6 +6215,9 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start) case INDEX_op_mov_vec: tcg_reg_alloc_mov(s, op); break; + case INDEX_op_plugin_pc: + tcg_reg_alloc_plugin_pc(s, op); + break; case INDEX_op_dup_vec: tcg_reg_alloc_dup(s, op); break;
Add an opcode to find a code address within the current insn, for later use with unwinding. Generate the code generically using tcg_reg_alloc_do_movi. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- include/tcg/tcg-op-common.h | 1 + include/tcg/tcg-opc.h | 1 + tcg/tcg-op.c | 5 +++++ tcg/tcg.c | 10 ++++++++++ 4 files changed, 17 insertions(+)