|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 03/11] hvm/hpet: Only set comparator or period not both.
>>> On 17.04.14 at 19:42, <dslutz@xxxxxxxxxxx> wrote:
> The current code sets both. If setting the comparator also set
> comparator64 (the hidden version).
>
> Based on:
>
> software-developers-hpet-spec-1-0a.pdf
>
> A write call should only change comparator or period, not both.
>
> Signed-off-by: Don Slutz <dslutz@xxxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
> v3:
> Only have 2 blocks of code.
> Set comparator64 before truncation
>
> xen/arch/x86/hvm/hpet.c | 36 +++++++++++++++++++++---------------
> 1 file changed, 21 insertions(+), 15 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/hpet.c b/xen/arch/x86/hvm/hpet.c
> index 4fd6470..910d87d 100644
> --- a/xen/arch/x86/hvm/hpet.c
> +++ b/xen/arch/x86/hvm/hpet.c
> @@ -401,20 +401,8 @@ static int hpet_write(
> case HPET_Tn_CMP(1):
> case HPET_Tn_CMP(2):
> tn = HPET_TN(CMP, addr);
> - if ( timer_is_32bit(h, tn) )
> - new_val = (uint32_t)new_val;
> - h->hpet.timers[tn].cmp = new_val;
> - if ( h->hpet.timers[tn].config & HPET_TN_SETVAL )
> - /*
> - * When SETVAL is one, software is able to "directly set a
> periodic
> - * timer's accumulator." That is, set the comparator without
> - * adjusting the period. Much the same as just setting the
> - * comparator on an enabled one-shot timer.
> - *
> - * This configuration bit clears when the comparator is written.
> - */
> - h->hpet.timers[tn].config &= ~HPET_TN_SETVAL;
> - else if ( timer_is_periodic(h, tn) )
> + if ( timer_is_periodic(h, tn) &&
> + !(h->hpet.timers[tn].config & HPET_TN_SETVAL) )
> {
> /*
> * Clamp period to reasonable min/max values:
> @@ -426,7 +414,25 @@ static int hpet_write(
> new_val &= (timer_is_32bit(h, tn) ? ~0u : ~0ull) >> 1;
> h->hpet.period[tn] = new_val;
> }
> - h->hpet.comparator64[tn] = new_val;
> + else
> + {
> + /*
> + * When SETVAL is one, software is able to "directly set
> + * a periodic timer's accumulator." That is, set the
> + * comparator without adjusting the period. Much the
> + * same as just setting the comparator on an enabled
> + * one-shot timer.
> + *
> + * This configuration bit clears when the comparator is
> + * written.
> + */
> + h->hpet.timers[tn].config &= ~HPET_TN_SETVAL;
> + h->hpet.comparator64[tn] = new_val;
> + /* truncate if timer is in 32 bit mode */
> + if ( timer_is_32bit(h, tn) )
> + new_val = (uint32_t)new_val;
> + h->hpet.timers[tn].cmp = new_val;
> + }
> if ( hpet_enabled(h) && timer_enabled(h, tn) )
> set_restart_timer(tn);
> break;
> --
> 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 |