Bug 206035 - gpiobus causes panic when attached to gpio with a single pin
Summary: gpiobus causes panic when attached to gpio with a single pin
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: kern (show other bugs)
Version: CURRENT
Hardware: Any Any
: --- Affects Only Me
Assignee: freebsd-bugs mailing list
URL:
Keywords: patch
Depends on:
Blocks:
 
Reported: 2016-01-08 14:47 UTC by Stanislav Galabov
Modified: 2016-03-01 12:37 UTC (History)
2 users (show)

See Also:


Attachments
Suggested fix for the problem (please see comments for details) (449 bytes, patch)
2016-01-08 14:47 UTC, Stanislav Galabov
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Stanislav Galabov 2016-01-08 14:47:35 UTC
Created attachment 165265 [details]
Suggested fix for the problem (please see comments for details)

While attaching a gpiobus to a GPIO controller with a single pin, the system panics due to a failed KASSERT in gpiobus_init_softc().

This is due to the fact that gpiobus obtains the maximum pin number from the GPIO controller (via GPIO_PIN_MAX) and immediately does a KASSERT, expecting that the obtained value is != 0.

In the case of a GPIO controller which controls a single pin, the returned value will be 0 (0 is the maximum pin number), which is absolutely valid.

Moreover, right after the KASSERT the code in gpiobus_init_softc() actually adjusts the number of pins to the right value.

The suggestion is to change the KASSERT like so:
-       KASSERT(sc->sc_npins != 0, ("GPIO device with no pins"));
+       KASSERT(sc->sc_npins >= 0, ("GPIO device with no pins"));

This, I believe, is a better approach than, say, simply postponing the KASSERT until after gpiobus has adjusted the number of pins, since if a broken GPIO controller driver returns a < 0 value we'll be in even more trouble.

I've attached a patch with the suggested fix.
Comment 1 commit-hook freebsd_committer 2016-01-14 02:58:50 UTC
A commit references this bug:

Author: adrian
Date: Thu Jan 14 02:58:29 UTC 2016
New revision: 293872
URL: https://svnweb.freebsd.org/changeset/base/293872

Log:
  [gpiobus] handle the case of there being a single GPIO pin available.

  PR:		kern/206035
  Submitted by:	Stanislav Galabov <sgalabov@gmail.com>

Changes:
  head/sys/dev/gpio/gpiobus.c