[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