Be more robust with malformed interrupt config data. Instead of crashing
or going into a near-infinite loop, warn and make potentially-reasonable assumptions.
This commit is contained in:
parent
52567c06be
commit
b4122742a6
@ -287,11 +287,23 @@ simplebus_setup_dinfo(device_t dev, phandle_t node)
|
||||
nintr = OF_getencprop_alloc(node, "interrupts", sizeof(*intr),
|
||||
(void **)&intr);
|
||||
if (nintr > 0) {
|
||||
iparent = 0;
|
||||
OF_searchencprop(node, "interrupt-parent", &iparent,
|
||||
sizeof(iparent));
|
||||
OF_searchencprop(OF_xref_phandle(iparent), "#interrupt-cells",
|
||||
&icells, sizeof(icells));
|
||||
if (OF_searchencprop(node, "interrupt-parent", &iparent,
|
||||
sizeof(iparent)) == -1) {
|
||||
device_printf(dev, "No interrupt-parent found, "
|
||||
"assuming direct parent\n");
|
||||
iparent = OF_parent(node);
|
||||
}
|
||||
if (OF_searchencprop(OF_xref_phandle(iparent),
|
||||
"#interrupt-cells", &icells, sizeof(icells)) == -1) {
|
||||
device_printf(dev, "Missing #interrupt-cells property, "
|
||||
"assuming <1>\n");
|
||||
icells = 1;
|
||||
}
|
||||
if (icells < 1 || icells > nintr) {
|
||||
device_printf(dev, "Invalid #interrupt-cells property "
|
||||
"value <%d>, assuming <1>\n", icells);
|
||||
icells = 1;
|
||||
}
|
||||
for (i = 0, k = 0; i < nintr; i += icells, k++) {
|
||||
intr[i] = ofw_bus_map_intr(dev, iparent, icells,
|
||||
&intr[i]);
|
||||
|
Loading…
x
Reference in New Issue
Block a user