[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2] xen/arm: remove physical timer offset



On 12/5/2019 3:28 PM, Julien Grall wrote:
> Hi,
> 
> On 05/12/2019 19:17, Jeff Kubascik wrote:
>> On 12/3/2019 1:04 PM, Julien Grall wrote:
>>> Hi,
>>>
>>> On 26/11/2019 21:13, Jeff Kubascik wrote:
>>>> The physical timer traps apply an offset so that time starts at 0 for
>>>> the guest. However, this offset is not currently applied to the physical
>>>> counter. Per the ARMv8 Reference Manual (ARM DDI 0487E.a), section
>>>> D11.2.4 Timers, the "Offset" between the counter and timer should be
>>>> zero for a physical timer. This removes the offset to make the timer and
>>>> counter consistent.
>>>>
>>>> Furthermore, section D11.2.4 specifies that the values in the TimerValue
>>>> view of the timers are signed in standard two's complement form. When
>>>> writing to the TimerValue register, it should be signed extended as
>>>> described by the equation
>>>>
>>>>     CompareValue = (Counter[63:0] + SignExtend(TimerValue))[63:0]
>>>
>>> I am a bit confused, is it a new bug introduced by the change or
>>> previously existing? If the latter, then I think this should be modified
>>> in a separate patch.
>>
>> This would be a previously existing bug - a quirk in the timer design that
>> wasn't emulated correctly before. I can break this out into a separate patch.
> 
> It would be great if you can split it. Thank you!
> 
> [...]
> 
> 
>>>> @@ -185,7 +184,7 @@ static bool vtimer_cntp_ctl(struct cpu_user_regs 
>>>> *regs, uint32_t *r, bool read)
>>>>            if ( v->arch.phys_timer.ctl & CNTx_CTL_ENABLE )
>>>>            {
>>>>                set_timer(&v->arch.phys_timer.timer,
>>>> -                      v->arch.phys_timer.cval + 
>>>> v->domain->arch.phys_timer_base.offset);
>>>> +                      ticks_to_ns(v->arch.phys_timer.cval - boot_count));
>>>
>>> cval may be smaller than boot_count. In that case, we will set the timer
>>> to expire a very long time. This is not the expected behavior from the
>>> guest.
>>>
>>> Instead, we should either use 0 to create the timer or call
>>> phys_timer_expired directly.
>>
>> I disagree - if you set cval to a value smaller than boot_count, you are 
>> setting
>> cval to a value less than the physical counter value. This would result in 
>> the
>> timer having a long expiration time.
> 
> boot_count refers to when Xen began to boot, not the start of the
> physical counter. If you look at the condition to fire the timer (see
> below), then it means the timer will fire right now because the physical
> counter is past CompareValue (cval).
> 
> TimerConditionMet = (((Counter[63:0] – Offset[63:0])[63:0] -
> CompareValue[63:0]) >= 0)

This makes sense now - I wasn't considering the greater than equals condition.

> We only subtract boot_count here as the timer subsystem expects a
> relative number of nanoseconds from when Xen booted.

Makes sense.

>>
>> However, set_timer expects a signed 64 bit value in ns. The conversion of 
>> cval
>> (unsigned 64 bit) from ticks to ns is going to overflow this. I'm not sure 
>> what
>> would be the best way to work around this limitation. At the very least, I 
>> think
>> we should print a warning message.
> 
> A warning message in emulation is definitely not the right solution. If
> a user asks something that is valid from the spec PoV then we should
> implement it correctly. The more that I don't think boot_count store
> what you expect (see above).
> 
> But we definitely can't allow the caller of ticks_to_ns() to pass a
> negative value as argument because (cval - boot_count) may be over 2^63
> for instance if the user requests a timer to be set in a million of year
> (I didn't do the math!).

Assuming 100MHz timer frequency, the math works out to be about 5,850 years,
give or take. I'm assuming we don't need to worry about rollover conditions?

> Cheers,
> 
> --
> Julien Grall
> 

Sincerely,
Jeff Kubascik

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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