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

Simon Glass sjg at chromium.org
Sat Jan 16 02:26:40 CET 2016


On 11 January 2016 at 09:56, Simon Glass <sjg at chromium.org> wrote:
> 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),
>>>  };
>>> --

Applied to u-boot-dm, thanks!


More information about the U-Boot mailing list