qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] regression in timer code?


From: Max Filippov
Subject: Re: [Qemu-devel] regression in timer code?
Date: Wed, 14 Mar 2018 02:40:52 -0700

On Wed, Mar 14, 2018 at 2:07 AM, Pavel Dovgalyuk <address@hidden> wrote:
>> From: Max Filippov [mailto:address@hidden
>> the commit b39e3f34c9de7ead6a11a74aa2de78baf41d81a7
>> ("icount: fixed saving/restoring of icount warp timers") has changed
>> something that made timers test for target/xtensa unstable.
>> Specifically ccount_write case in the tests/tcg/xtensa/test_timer.S
>> now fails for me about half of the times it is run. Given that it is run
>> under -icount I guess this is a bug. Could you please take a look?
>>
>> The minimal test case is available here:
>>   http://jcmvbkbc.spb.ru/~dumb/tmp/201803131306/test_timer.tst
>> It is run as
>>   qemu-system-xtensa -M sim -cpu dc232b -nographic -semihosting
>> -icount 7  -kernel ./test_timer.tst
>
> I investigated your test and concluded the following.
> First, update_ccount is inaccurate opration because of the division
> with the remainder:
>     env->sregs[CCOUNT] = env->ccount_base +
>         (uint32_t)((now - env->time_base) *
>                    env->config->clock_freq_khz / 1000000);
>
> Therefore, the following sequence in the test may give different result 
> depending
> of the actual value of "now" variable.

But the expression above depends on the difference between the now
and env->time_base, both these values are read from
 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) and, most importantly,
the test is 100% deterministic, i.e. it runs under -icount and there's no
external factors involved, no waiting for anything, not even interrupts.
Thus the difference must be constant, i.e. I must see consistent results.
Am I wrong somewhere?

>     rsr     a3, ccount
>     rsr     a4, ccount
>     sub     a4, a4, a3
>
> Consider the code:
>
> test ccount_write
>     rsr     a3, ccount
>     rsr     a4, ccount
>     sub     a4, a4, a3 ; usually 1, but sometimes 2 because of rounding
>     movi    a2, 0x12345678
>     wsr     a2, ccount
>     esync
>     rsr     a3, ccount
>     sub     a3, a3, a2 ; usually 3 (esync + yield + rsr), but sometimes 4 
> because of rounding
>     slli    a4, a4, 2  ; 4 or 8
>     assert  ltu, a3, a4 ; (3 or 4) < (4 or 8) ?
> test_end
>
> Therefore in some cases we get a4=4 and a3=4 that forces the test to fail.

-- 
Thanks.
-- Max



reply via email to

[Prev in Thread] Current Thread [Next in Thread]