[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