qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Maydell <peter.maydell@linaro.org>
To: P J P <ppandit@redhat.com>
Cc: Qemu Developers <qemu-devel@nongnu.org>,
	Li Qiang <liqiang6-s@360.cn>, qemu-arm <qemu-arm@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH v2] timer: a9gtimer: check auto-increment register value
Date: Sun, 2 Oct 2016 07:58:55 -0700	[thread overview]
Message-ID: <CAFEAcA85-XdSaOYTWr2=JQVt+EBsmrSq-5QcbWe8hrSW0qZ7xA@mail.gmail.com> (raw)
In-Reply-To: <alpine.LFD.2.20.1610021122450.32504@wniryva>

On 1 October 2016 at 23:15, P J P <ppandit@redhat.com> wrote:
>   Hello Peter,
>
> +-- On Fri, 30 Sep 2016, Peter Maydell wrote --+

> | Since the gtb->compare field is 64 bit your inc variable should
> | probably be uint64_t.
>
>   Okay. I was wondering about its values, as gtb->inc is 'uint32_t' type.

The timer can't autoincrement by more than a 32 bit value, but
the timer value is 64 bits, and since this code may be doing more than
one autoincrement it's better to use 64 bits.

> | > +            DB_PRINT("Compare event happened for CPU %d\n", i);
> |
> | This is wrong -- this debug print should only happen when the
> | comparator matches (ie when gtb->compare is less than update.new),
> | not every time.
> |
> | > +            gtb->status = 1;
> |
> | Similarly the status flag should only be set when the comparator
> | matches.
> |
> | > +            if (gtb->control & R_CONTROL_AUTO_INCREMENT
> | > +                && gtb->compare < update.new) {
> | > +                inc = ((update.new - gtb->compare - 1) / gtb->inc) * gtb->inc;
> |
> | I suggest using either QEMU_ALIGN_UP or QEMU_ALIGN_DOWN here,
> | depending on which way round you're trying for.
>
>   Okay.
>
> | Also this will divide by zero if gtb->inc is 0 (as for instance
> | it will be on reset).
> |
> | > +        gtb->inc = value ? value : 1;
> |
> | Where has this change come from ??
>
>   This was to avoid the possible divide by zero. Couldn't find if zero could
> be valid value for 'gtb->inc' and a non-zero default value if not.

If in doubt, you need to check the datasheet/technical reference
manual for the hardware, in this case
http://infocenter.arm.com/help/topic/com.arm.doc.100486_0401_10_en/ada1443777319205.html
Zero is a valid value for the auto-increment register,
and in fact it is the documented reset value.

> If
> 'gtb->inc' could be zero, should the 'gtb->compare += inc'
> only happen when
> it's non-zero ? Ie gtb->status would be set if gtb->inc > 0.

If gtb->inc is zero, then when the timer fires
the compare register should increment by the increment value
(which will be zero, so it won't change). This is not a
particularly useful setting for the guest to put the timer
into, but the behaviour is well-defined. (Effectively, setting
the increment to 0 is equivalent to disabling auto-increment.)

gtb->status should be set whenever the timer comparator
fires, whether we are auto-incrementing or not, and
whatever the value of the auto-increment register is.
It is the "timer matched" interrupt output. (Your current
patch is wrong in that it has moved setting gtb->status
into the wrong place, as I mentioned above.)

thanks
-- PMM

  reply	other threads:[~2016-10-02 14:59 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-28  9:16 [Qemu-devel] [PATCH v2] timer: a9gtimer: check auto-increment register value P J P
2016-09-30 17:30 ` Peter Maydell
2016-10-02  6:15   ` P J P
2016-10-02 14:58     ` Peter Maydell [this message]
2016-10-03  9:13       ` P J P

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='CAFEAcA85-XdSaOYTWr2=JQVt+EBsmrSq-5QcbWe8hrSW0qZ7xA@mail.gmail.com' \
    --to=peter.maydell@linaro.org \
    --cc=liqiang6-s@360.cn \
    --cc=ppandit@redhat.com \
    --cc=qemu-arm@nongnu.org \
    --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).