From: Peter Maydell <peter.maydell@linaro.org>
To: Richard Henderson <richard.henderson@linaro.org>
Cc: Marek Vasut <marex@denx.de>, Chris Wulff <crwulff@gmail.com>,
QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: [PATCH v2 5/7] target/nios2: Convert to TranslatorOps
Date: Mon, 28 Jun 2021 16:57:39 +0100 [thread overview]
Message-ID: <CAFEAcA8i+a9xOfvqn6U_8udEPR7rXpSp2-JNDguyqWp8YkF0MQ@mail.gmail.com> (raw)
In-Reply-To: <20210620221046.1526418-6-richard.henderson@linaro.org>
On Sun, 20 Jun 2021 at 23:18, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/nios2/translate.c | 130 ++++++++++++++++++++-------------------
> 1 file changed, 67 insertions(+), 63 deletions(-)
>
> diff --git a/target/nios2/translate.c b/target/nios2/translate.c
> index 31653b7912..06705c894d 100644
> --- a/target/nios2/translate.c
> +++ b/target/nios2/translate.c
> @@ -803,75 +803,72 @@ static void gen_exception(DisasContext *dc, uint32_t excp)
> }
>
> /* generate intermediate code for basic block 'tb'. */
> -void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
> +static void nios2_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
> {
> + DisasContext *dc = container_of(dcbase, DisasContext, base);
> CPUNios2State *env = cs->env_ptr;
> - DisasContext dc1, *dc = &dc1;
> - int num_insns;
> -
> - /* Initialize DC */
> -
> - dc->base.tb = tb;
> - dc->base.singlestep_enabled = cs->singlestep_enabled;
> - dc->base.is_jmp = DISAS_NEXT;
> - dc->base.pc_first = tb->pc;
> - dc->base.pc_next = tb->pc;
> + target_ulong pc = dc->base.pc_first;
The local variable doesn't really seem necessary -- you could just
write "dc->pc = dc->base.pc_first" and then use "dc->pc" in the
calculation of page_insns.
> + int page_insns;
>
> dc->zero = NULL;
> - dc->pc = tb->pc;
> + dc->pc = pc;
> dc->mem_idx = cpu_mmu_index(env, false);
>
> - /* Set up instruction counts */
> - num_insns = 0;
> - if (max_insns > 1) {
> - int page_insns = (TARGET_PAGE_SIZE - (tb->pc & ~TARGET_PAGE_MASK)) / 4;
> - if (max_insns > page_insns) {
> - max_insns = page_insns;
> - }
> - }
> + /* Bound the number of insns to execute to those left on the page. */
> + page_insns = -(pc | TARGET_PAGE_MASK) / 4;
> + dc->base.max_insns = MIN(page_insns, dc->base.max_insns);
> +}
>
> - gen_tb_start(tb);
> - do {
> - tcg_gen_insn_start(dc->pc);
> - num_insns++;
> +static void nios2_tr_tb_start(DisasContextBase *db, CPUState *cs)
> +{
> +}
>
> - if (unlikely(cpu_breakpoint_test(cs, dc->pc, BP_ANY))) {
> - gen_exception(dc, EXCP_DEBUG);
> - /* The address covered by the breakpoint must be included in
> - [tb->pc, tb->pc + tb->size) in order to for it to be
> - properly cleared -- thus we increment the PC here so that
> - the logic setting tb->size below does the right thing. */
> - dc->pc += 4;
> - break;
> - }
> +static void nios2_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
> +{
> + tcg_gen_insn_start(dcbase->pc_next);
> +}
>
> - if (num_insns == max_insns && (tb_cflags(tb) & CF_LAST_IO)) {
> - gen_io_start();
> - }
> +static bool nios2_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cs,
> + const CPUBreakpoint *bp)
> +{
> + DisasContext *dc = container_of(dcbase, DisasContext, base);
>
> - /* Decode an instruction */
> - handle_instruction(dc, env);
> + gen_exception(dc, EXCP_DEBUG);
> + /*
> + * The address covered by the breakpoint must be included in
> + * [tb->pc, tb->pc + tb->size) in order to for it to be
> + * properly cleared -- thus we increment the PC here so that
> + * the logic setting tb->size below does the right thing.
> + */
> + dc->pc += 4;
Don't we need to increment dc->base.pc_next here, not dc->pc? The
generic setting of tb->size in accel/tcg uses "db->pc_next - db->pc_first".
Side note: that comment about "setting tb->size below" seems to have
been copied-and-pasted into most of the front-ends, but it's wrong:
the setting of tb->size is no longer "below" but in the common code.
(More generally, some followup patches rationalizing the use of
dc->pc along the lines of the Arm dc->pc_curr vs dc->base.pc_next
might help. There seems to be a fair amount of code which uses
"dc->pc + 4" that could be using pc_next instead.)
> + return true;
The arm versions of the breakpoint_check hook also set dc->base.is_jmp
to DISAS_NORETURN.
Are they doing that unnecessarily, or do we need to do that here ?
> +}
>
> - dc->pc += 4;
> +static void nios2_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
> +{
> + DisasContext *dc = container_of(dcbase, DisasContext, base);
> + CPUNios2State *env = cs->env_ptr;
>
> - /* Translation stops when a conditional branch is encountered.
> - * Otherwise the subsequent code could get translated several times.
> - * Also stop translation when a page boundary is reached. This
> - * ensures prefetch aborts occur at the right place. */
> - } while (!dc->base.is_jmp &&
> - !tcg_op_buf_full() &&
> - num_insns < max_insns);
> + /* Decode an instruction */
> + handle_instruction(dc, env);
> +
> + dc->base.pc_next += 4;
> + dc->pc += 4;
This isn't wrong, but I think that a setup like the Arm translator
that does
dc->pc_curr = s->base.pc_next;
code = cpu_ldl_code(env, s->base.pc_next);
s->base.pc_next += 4;
/* dispatch to handler function here */
would be nicer (dunno whether clearer to do as a single thing or
first to do this conversion and then do a followup patch).
thanks
-- PMM
next prev parent reply other threads:[~2021-06-28 16:00 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-20 22:10 [PATCH v2 0/7] target/nios2: Convert to TranslatorOps Richard Henderson
2021-06-20 22:10 ` [PATCH v2 1/7] target/nios2: Replace DISAS_TB_JUMP with DISAS_NORETURN Richard Henderson
2021-06-28 15:14 ` Peter Maydell
2021-06-20 22:10 ` [PATCH v2 2/7] target/nios2: Use global cpu_env Richard Henderson
2021-06-28 15:15 ` Peter Maydell
2021-06-20 22:10 ` [PATCH v2 3/7] target/nios2: Use global cpu_R Richard Henderson
2021-06-28 15:16 ` Peter Maydell
2021-06-20 22:10 ` [PATCH v2 4/7] target/nios2: Add DisasContextBase to DisasContext Richard Henderson
2021-06-28 15:28 ` Peter Maydell
2021-06-20 22:10 ` [PATCH v2 5/7] target/nios2: Convert to TranslatorOps Richard Henderson
2021-06-28 15:57 ` Peter Maydell [this message]
2021-06-28 16:04 ` Richard Henderson
2021-06-20 22:10 ` [PATCH v2 6/7] target/nios2: Remove assignment to env in handle_instruction Richard Henderson
2021-06-28 15:31 ` Peter Maydell
2021-06-28 15:58 ` Richard Henderson
2021-06-20 22:10 ` [PATCH v2 7/7] target/nios2: Clean up goto " Richard Henderson
2021-06-28 15:33 ` Peter Maydell
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=CAFEAcA8i+a9xOfvqn6U_8udEPR7rXpSp2-JNDguyqWp8YkF0MQ@mail.gmail.com \
--to=peter.maydell@linaro.org \
--cc=crwulff@gmail.com \
--cc=marex@denx.de \
--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).