From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
To: Richard Henderson <richard.henderson@linaro.org>, qemu-devel@nongnu.org
Cc: alex.bennee@linaro.org
Subject: Re: [PATCH 08/22] plugins: Use emit_before_op for PLUGIN_GEN_FROM_TB
Date: Tue, 19 Mar 2024 17:22:33 +0400 [thread overview]
Message-ID: <199426d0-deea-4bfc-b2cd-8150fc5f21d2@linaro.org> (raw)
In-Reply-To: <20240316015720.3661236-9-richard.henderson@linaro.org>
On 3/16/24 05:57, Richard Henderson wrote:
> By having the qemu_plugin_cb_flags be recorded in the TCGHelperInfo,
> we no longer need to distinguish PLUGIN_CB_REGULAR from
> PLUGIN_CB_REGULAR_R, so place all TB callbacks in the same queue.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> accel/tcg/plugin-gen.c | 96 +++++++++++++++++++++++++-----------------
> plugins/api.c | 6 +--
> 2 files changed, 58 insertions(+), 44 deletions(-)
>
> diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
> index 8fa342b425..f92aa80510 100644
> --- a/accel/tcg/plugin-gen.c
> +++ b/accel/tcg/plugin-gen.c
> @@ -207,6 +207,7 @@ static void plugin_gen_empty_callback(enum plugin_gen_from from)
> {
> switch (from) {
> case PLUGIN_GEN_AFTER_INSN:
> + case PLUGIN_GEN_FROM_TB:
> tcg_gen_plugin_cb(from);
> break;
> case PLUGIN_GEN_FROM_INSN:
> @@ -216,8 +217,6 @@ static void plugin_gen_empty_callback(enum plugin_gen_from from)
> */
> gen_wrapped(from, PLUGIN_GEN_ENABLE_MEM_HELPER,
> gen_empty_mem_helper);
> - /* fall through */
> - case PLUGIN_GEN_FROM_TB:
> gen_wrapped(from, PLUGIN_GEN_CB_UDATA, gen_empty_udata_cb_no_rwg);
> gen_wrapped(from, PLUGIN_GEN_CB_UDATA_R, gen_empty_udata_cb_no_wg);
> gen_wrapped(from, PLUGIN_GEN_CB_INLINE, gen_empty_inline_cb);
> @@ -632,24 +631,6 @@ void plugin_gen_disable_mem_helpers(void)
> offsetof(CPUState, plugin_mem_cbs) - offsetof(ArchCPU, env));
> }
>
> -static void plugin_gen_tb_udata(const struct qemu_plugin_tb *ptb,
> - TCGOp *begin_op)
> -{
> - inject_udata_cb(ptb->cbs[PLUGIN_CB_REGULAR], begin_op);
> -}
> -
> -static void plugin_gen_tb_udata_r(const struct qemu_plugin_tb *ptb,
> - TCGOp *begin_op)
> -{
> - inject_udata_cb(ptb->cbs[PLUGIN_CB_REGULAR_R], begin_op);
> -}
> -
> -static void plugin_gen_tb_inline(const struct qemu_plugin_tb *ptb,
> - TCGOp *begin_op)
> -{
> - inject_inline_cb(ptb->cbs[PLUGIN_CB_INLINE], begin_op, op_ok);
> -}
> -
> static void plugin_gen_insn_udata(const struct qemu_plugin_tb *ptb,
> TCGOp *begin_op, int insn_idx)
> {
> @@ -708,6 +689,41 @@ static void gen_disable_mem_helper(struct qemu_plugin_tb *ptb,
> }
> }
>
> +static void gen_udata_cb(struct qemu_plugin_dyn_cb *cb)
> +{
> + TCGv_i32 cpu_index = tcg_temp_ebb_new_i32();
> +
> + tcg_gen_ld_i32(cpu_index, tcg_env,
> + -offsetof(ArchCPU, env) + offsetof(CPUState, cpu_index));
> + tcg_gen_call2(cb->regular.f.vcpu_udata, cb->regular.info, NULL,
> + tcgv_i32_temp(cpu_index),
> + tcgv_ptr_temp(tcg_constant_ptr(cb->userp)));
> + tcg_temp_free_i32(cpu_index);
> +}
> +
> +static void gen_inline_cb(struct qemu_plugin_dyn_cb *cb)
> +{
> + GArray *arr = cb->inline_insn.entry.score->data;
> + size_t offset = cb->inline_insn.entry.offset;
> + TCGv_i32 cpu_index = tcg_temp_ebb_new_i32();
> + TCGv_i64 val = tcg_temp_ebb_new_i64();
> + TCGv_ptr ptr = tcg_temp_ebb_new_ptr();
> +
> + tcg_gen_ld_i32(cpu_index, tcg_env,
> + -offsetof(ArchCPU, env) + offsetof(CPUState, cpu_index));
> + tcg_gen_muli_i32(cpu_index, cpu_index, g_array_get_element_size(arr));
> + tcg_gen_ext_i32_ptr(ptr, cpu_index);
> + tcg_temp_free_i32(cpu_index);
> +
> + tcg_gen_addi_ptr(ptr, ptr, (intptr_t)arr->data);
> + tcg_gen_ld_i64(val, ptr, offset);
> + tcg_gen_addi_i64(val, val, cb->inline_insn.imm);
> + tcg_gen_st_i64(val, ptr, offset);
> +
> + tcg_temp_free_i64(val);
> + tcg_temp_free_ptr(ptr);
> +}
> +
> /* #define DEBUG_PLUGIN_GEN_OPS */
> static void pr_ops(void)
> {
> @@ -786,6 +802,8 @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
> {
> enum plugin_gen_from from = op->args[0];
> struct qemu_plugin_insn *insn = NULL;
> + const GArray *cbs;
> + int i, n;
>
> if (insn_idx >= 0) {
> insn = g_ptr_array_index(plugin_tb->insns, insn_idx);
> @@ -798,6 +816,25 @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
> assert(insn != NULL);
> gen_disable_mem_helper(plugin_tb, insn);
> break;
> +
> + case PLUGIN_GEN_FROM_TB:
> + assert(insn == NULL);
> +
> + cbs = plugin_tb->cbs[PLUGIN_CB_REGULAR];
> + for (i = 0, n = (cbs ? cbs->len : 0); i < n; i++) {
> + struct qemu_plugin_dyn_cb *cb =
> + &g_array_index(cbs, struct qemu_plugin_dyn_cb, i);
> + gen_udata_cb(cb);
> + }
> +
> + cbs = plugin_tb->cbs[PLUGIN_CB_INLINE];
> + for (i = 0, n = (cbs ? cbs->len : 0); i < n; i++) {
> + struct qemu_plugin_dyn_cb *cb =
> + &g_array_index(cbs, struct qemu_plugin_dyn_cb, i);
> + gen_inline_cb(cb);
> + }
> + break;
> +
Maybe I am missing something, but couldn't we simply mix all cbs
possible. This way, the order mentioned by user when registering is the
only one that matters, and he can select to mix callbacks and inline ops
freely.
Just checking the type of callback would be needed to know which gen_*
fn should be used.
> default:
> g_assert_not_reached();
> }
> @@ -813,25 +850,6 @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
> enum plugin_gen_cb type = op->args[1];
>
> switch (from) {
> - case PLUGIN_GEN_FROM_TB:
> - {
> - g_assert(insn_idx == -1);
> -
> - switch (type) {
> - case PLUGIN_GEN_CB_UDATA:
> - plugin_gen_tb_udata(plugin_tb, op);
> - break;
> - case PLUGIN_GEN_CB_UDATA_R:
> - plugin_gen_tb_udata_r(plugin_tb, op);
> - break;
> - case PLUGIN_GEN_CB_INLINE:
> - plugin_gen_tb_inline(plugin_tb, op);
> - break;
> - default:
> - g_assert_not_reached();
> - }
> - break;
> - }
> case PLUGIN_GEN_FROM_INSN:
> {
> g_assert(insn_idx >= 0);
> diff --git a/plugins/api.c b/plugins/api.c
> index 8fa5a600ac..5d119e8049 100644
> --- a/plugins/api.c
> +++ b/plugins/api.c
> @@ -92,11 +92,7 @@ void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_plugin_tb *tb,
> void *udata)
> {
> if (!tb->mem_only) {
> - int index = flags == QEMU_PLUGIN_CB_R_REGS ||
> - flags == QEMU_PLUGIN_CB_RW_REGS ?
> - PLUGIN_CB_REGULAR_R : PLUGIN_CB_REGULAR;
> -
> - plugin_register_dyn_cb__udata(&tb->cbs[index],
> + plugin_register_dyn_cb__udata(&tb->cbs[PLUGIN_CB_REGULAR],
> cb, flags, udata);
> }
> }
next prev parent reply other threads:[~2024-03-19 13:23 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-16 1:56 [PATCH 00/22] plugins: Rewrite plugin code generation Richard Henderson
2024-03-16 1:56 ` [PATCH 01/22] tcg: Add TCGContext.emit_before_op Richard Henderson
2024-03-19 10:55 ` Pierrick Bouvier
2024-03-19 14:04 ` Alex Bennée
2024-03-19 21:23 ` Richard Henderson
2024-03-16 1:57 ` [PATCH 02/22] tcg: Make tcg/helper-info.h self-contained Richard Henderson
2024-03-18 10:01 ` Alex Bennée
2024-03-18 10:03 ` Alex Bennée
2024-03-16 1:57 ` [PATCH 03/22] tcg: Pass function pointer to tcg_gen_call* Richard Henderson
2024-03-18 10:02 ` Alex Bennée
2024-03-16 1:57 ` [PATCH 04/22] plugins: Zero new qemu_plugin_dyn_cb entries Richard Henderson
2024-03-18 10:03 ` Alex Bennée
2024-03-16 1:57 ` [PATCH 05/22] plugins: Move function pointer in qemu_plugin_dyn_cb Richard Henderson
2024-03-18 10:04 ` Alex Bennée
2024-03-19 13:18 ` Pierrick Bouvier
2024-03-19 21:30 ` Richard Henderson
2024-03-20 5:31 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 06/22] plugins: Create TCGHelperInfo for all out-of-line callbacks Richard Henderson
2024-03-19 13:12 ` Pierrick Bouvier
2024-03-19 19:51 ` Richard Henderson
2024-03-20 5:22 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 07/22] plugins: Use emit_before_op for PLUGIN_GEN_AFTER_INSN Richard Henderson
2024-03-19 13:32 ` Pierrick Bouvier
2024-03-19 19:56 ` Richard Henderson
2024-03-20 5:36 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 08/22] plugins: Use emit_before_op for PLUGIN_GEN_FROM_TB Richard Henderson
2024-03-19 13:22 ` Pierrick Bouvier [this message]
2024-03-19 19:57 ` Richard Henderson
2024-03-16 1:57 ` [PATCH 09/22] plugins: Add PLUGIN_GEN_AFTER_TB Richard Henderson
2024-03-19 13:33 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 10/22] plugins: Use emit_before_op for PLUGIN_GEN_FROM_INSN Richard Henderson
2024-03-19 13:34 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 11/22] plugins: Use emit_before_op for PLUGIN_GEN_FROM_MEM Richard Henderson
2024-03-19 13:35 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 12/22] plugins: Remove plugin helpers Richard Henderson
2024-03-18 16:38 ` Alex Bennée
2024-03-16 1:57 ` [PATCH 13/22] tcg: Remove TCG_CALL_PLUGIN Richard Henderson
2024-03-19 13:06 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 14/22] tcg: Remove INDEX_op_plugin_cb_{start,end} Richard Henderson
2024-03-19 13:04 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 15/22] plugins: Simplify callback queues Richard Henderson
2024-03-19 13:28 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 16/22] plugins: Introduce PLUGIN_CB_MEM_REGULAR Richard Henderson
2024-03-19 13:28 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 17/22] plugins: Replace pr_ops with a proper debug dump flag Richard Henderson
2024-03-19 12:59 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 18/22] plugins: Split out common cb expanders Richard Henderson
2024-03-19 13:29 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 19/22] plugins: Merge qemu_plugin_tb_insn_get to plugin-gen.c Richard Henderson
2024-03-19 13:30 ` Pierrick Bouvier
2024-03-16 1:57 ` [PATCH 20/22] plugins: Move qemu_plugin_insn_cleanup_fn to tcg.c Richard Henderson
2024-03-18 17:44 ` Alex Bennée
2024-03-16 1:57 ` [PATCH 21/22] plugins: Inline plugin_gen_empty_callback Richard Henderson
2024-03-18 19:09 ` Alex Bennée
2024-03-16 1:57 ` [PATCH 22/22] plugins: Update the documentation block for plugin-gen.c Richard Henderson
2024-03-19 12:56 ` Pierrick Bouvier
2024-03-19 13:38 ` [PATCH 00/22] plugins: Rewrite plugin code generation Pierrick Bouvier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=199426d0-deea-4bfc-b2cd-8150fc5f21d2@linaro.org \
--to=pierrick.bouvier@linaro.org \
--cc=alex.bennee@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).