[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.