[U-Boot] [PATCH 1/3] dm: timer: refuse timers with zero clock_rate

Simon Glass sjg at chromium.org
Mon Jan 11 17:56:13 CET 2016


Hi,

On 6 January 2016 at 22:29, Bin Meng <bmeng.cn at gmail.com> wrote:
> On Thu, Jan 7, 2016 at 1:33 AM, Stephen Warren <swarren at wwwdotorg.org> wrote:
>> From: Stephen Warren <swarren at nvidia.com>
>>
>> If a timer has a zero clock_rate, get_tbclk() will return zero for it,
>> which will cause tick_to_time() to perform a division-by-zero, which will
>> crash U-Boot.
>>
>> Signed-off-by: Stephen Warren <swarren at nvidia.com>
>> ---
>>  drivers/timer/timer-uclass.c | 11 +++++++++++
>>  1 file changed, 11 insertions(+)

Acked-by: Simon Glass <sjg at chromium.org>

>>
>> diff --git a/drivers/timer/timer-uclass.c b/drivers/timer/timer-uclass.c
>> index aca421bdea33..0771562c600d 100644
>> --- a/drivers/timer/timer-uclass.c
>> +++ b/drivers/timer/timer-uclass.c
>> @@ -47,6 +47,16 @@ static int timer_pre_probe(struct udevice *dev)
>>         return 0;
>>  }
>>
>> +static int timer_post_probe(struct udevice *dev)
>> +{
>> +       struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
>> +
>> +       if (!uc_priv->clock_rate)
>> +               return -EINVAL;
>
> Should we just panic here?

I don't think so - there may be multiple timers, and this error should
be reported. If you like you could use a strange error number so it is
more obvious (e.g. -ETIME).

>
>> +
>> +       return 0;
>> +}
>> +
>>  u64 timer_conv_64(u32 count)
>>  {
>>         /* increment tbh if tbl has rolled over */
>> @@ -60,5 +70,6 @@ UCLASS_DRIVER(timer) = {
>>         .id             = UCLASS_TIMER,
>>         .name           = "timer",
>>         .pre_probe      = timer_pre_probe,
>> +       .post_probe     = timer_post_probe,
>>         .per_device_auto_alloc_size = sizeof(struct timer_dev_priv),
>>  };
>> --
>
> Regards,
> Bin

Regards,
Simon


More information about the U-Boot mailing list