|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 09/10] hvm/hpet: Prevent master clock equal to comparator while enabled
>>> On 02.05.14 at 22:18, <dslutz@xxxxxxxxxxx> wrote:
> Based on the software-developers-hpet-spec-1-0a.pdf, the comparator
> for a periodic timer will change to the new value when it matches
> the master clock. The current code here uses a very standard
> rounding formula of "((x + y - 1) / y) * y". This is wrong because
> in this case you need to go to the next comparator value when "x"
> equals "y". Not when "x + 1" equals "y". In this case "y" is the
> period and "x" is the master clock.
>
> The code lines:
>
> elapsed = hpet_read_maincounter(h, guest_time) +
> period - 1 - comparator;
> comparator += (elapsed / period) * period;
>
> are what matter here.
>
> Using some numbers to help show the issue:
>
> hpet_read_maincounter(h, guest_time) = 130252
> period = 62500
>
> comparator : 130252
> elapsed : 62499
> elapsed/period : 0
> comparator_delta : 0
> new comparator : 130252
>
> Signed-off-by: Don Slutz <dslutz@xxxxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> xen/arch/x86/hvm/hpet.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/xen/arch/x86/hvm/hpet.c b/xen/arch/x86/hvm/hpet.c
> index f938da9..2a99fed 100644
> --- a/xen/arch/x86/hvm/hpet.c
> +++ b/xen/arch/x86/hvm/hpet.c
> @@ -99,7 +99,7 @@ static uint64_t hpet_get_comparator(HPETState *h, unsigned
> int tn,
> if (period)
> {
> elapsed = hpet_read_maincounter(h, guest_time) +
> - period - 1 - comparator;
> + period - comparator;
> comparator += (elapsed / period) * period;
> h->hpet.comparator64[tn] = comparator;
> }
> --
> 1.8.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |