qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Laurent Desnogues <laurent.desnogues@gmail.com>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] Precise guest instruction count.
Date: Mon, 9 Mar 2009 22:56:32 +0100	[thread overview]
Message-ID: <761ea48b0903091456r319a017dlda891b6eca800520@mail.gmail.com> (raw)
In-Reply-To: <gp2o2g$k18$1@ger.gmane.org>

On Mon, Mar 9, 2009 at 10:38 AM, Steffen Liebergeld <usenet@gmx.eu> wrote:
>
> I have difficulties getting to know the number of guest instructions. I tried
> to use the -icount switch, but this leads to timeout errors whenever the guest
> tries to use the network. So I inserted a line into gen_icount_end, which
> ,regardless of the value use_icount, increments qemu_icount by num_insns. I
> assume, that the code of gen_icount_end is appended to all TBs and run
> whenever the TB is run (please correct me if I'm wrong).

That's almost correct:  icount code is inserted at the beginning not appended.
You should not try to play with icount code but create your own set of code
that replicates it.

Something like this:

static inline void gen_icount_start(TCGContext *s, TCGv_ptr cpu_env)
{
    TCGv_i64 count;

    if (!iprofiler.enable_icount)
        return;

    count = tcg_temp_new_i64(s);
    tcg_gen_ld_i64(s, count, cpu_env, offsetof(CPUState, instr_count));
    /* This is a horrid hack to allow fixing up the value later.  */
    iprofiler_tcg.icount_arg = s->gen_opparam_ptr + 1;
    // LD NOTE this may not work!  cf tcg_gen_addi_i64 implementation
    tcg_gen_addi_i64(s, count, count, 0xdeadbeef);
    tcg_gen_st_i64(s, count, cpu_env, offsetof(CPUState, instr_count));
    tcg_temp_free_i64(s, count);
}

static void gen_icount_end(int num_insns)
{
    if (iprofiler.enable_icount) {
        *iprofiler_tcg.icount_arg = (int64_t)num_insns;
    }
}

Note the function names I chose are confusing...

> I have some code in the guest, which does some calculations. I let it do the
> calculations several times in a row, always discarding the results of the
> previous run. I trigger the NOP always before the calculation and Qemu gives
> me the following as values of qemu_icount:
> First run:  835032
> Second run: 837176
> Third run:  837179
> Fourth and subsequent runs: 837180
>
> I guess that the behaviour is caused by chaining of TBs. The execution flow
> jumps directly to the next TB without running the code of gen_icount_end at
> the end of the TB.

gen_icount_end is not at the end of the TB, it only patches code that was
inserted at the beginning of the TB by gen_icount_start.

The variations you see are probably due to timing variations. Even in user
mode you can have slightly different results for code that for instance
prints elapsed time.

HTH,

Laurent

  reply	other threads:[~2009-03-09 21:56 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-09  9:38 [Qemu-devel] Precise guest instruction count Steffen Liebergeld
2009-03-09 21:56 ` Laurent Desnogues [this message]
2009-03-11 10:33   ` [Qemu-devel] " Steffen Liebergeld
2009-03-11 10:42     ` Laurent Desnogues
2009-03-11 12:53       ` Steffen Liebergeld
2009-03-11 13:13         ` Paul Brook
2009-03-10  1:55 ` [Qemu-devel] " Paul Brook
2009-03-11 11:45   ` [Qemu-devel] " Steffen Liebergeld

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=761ea48b0903091456r319a017dlda891b6eca800520@mail.gmail.com \
    --to=laurent.desnogues@gmail.com \
    --cc=qemu-devel@nongnu.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).