DF-5203 / guard_matrix.log
== IPMI frontend singleton-guard matrix (pass 2, GLM 5.3) ==
== global: sys/dev/misc/ipmi/ipmi.c:65 int ipmi_attached = 0;
== set: sys/dev/misc/ipmi/ipmi.c:864 ipmi_attached = 1; (inside ipmi_attach, NEVER checked there)
--- ipmi_pci.c probe/identify guards:
48:static int ipmi_pci_probe(device_t dev);
73:ipmi_pci_probe(device_t dev)
77: if (ipmi_attached)
78: return (ENXIO);
83: return (BUS_PROBE_DEFAULT);
86: return (ENXIO);
99: return (ENXIO);
112: return (ENXIO);
115: return (ENXIO);
135: return (ENXIO);
166: DEVMETHOD(device_probe, ipmi_pci_probe),
183:ipmi2_pci_probe(device_t dev)
--- ipmi_isa.c probe/identify guards:
59: device_find_child(parent, "ipmi", -1) == NULL) {
77:ipmi_isa_probe(device_t dev)
85: if (ipmi_attached)
86: return (ENXIO);
90: return (ENXIO);
93: return (BUS_PROBE_DEFAULT);
183: return (ENXIO);
196: return (ENXIO);
198: return (ENXIO);
221: return (ENXIO);
273: DEVMETHOD(device_probe, ipmi_isa_probe),
--- ipmi_acpi.c probe/identify guards:
54:static int ipmi_acpi_probe(device_t);
58:ipmi_acpi_probe(device_t dev)
62: if (ipmi_attached)
63: return (EBUSY);
67: return (ENXIO);
87: return (ENXIO);
90: return (ENXIO);
103: return (ENXIO);
106: return (ENXIO);
111: return (ENXIO);
120: return (ENXIO);
130: return (ENXIO);
--- ipmi_smbus.c probe/identify guards:
52:static int ipmi_smbus_probe(device_t dev);
61: device_find_child(parent, "ipmi", -1) == NULL)
66:ipmi_smbus_probe(device_t dev)
70: return (BUS_PROBE_DEFAULT);
82: return (ENXIO);
86: return (ENXIO);
117: DEVMETHOD(device_probe, ipmi_smbus_probe),
--- ipmi_pci.c SECOND probe (ipmi2_pci_probe, DF-5076 site):
static int
ipmi2_pci_probe(device_t dev)
{
if (pci_get_class(dev) == PCIC_SERIALBUS &&
pci_get_subclass(dev) == PCIS_SERIALBUS_IPMI) {
device_set_desc(dev, "IPMI System Interface");
return (BUS_PROBE_GENERIC);
}
return (ENXIO);
}
== RESULT: 'ipmi_attached' guard present at:
sys/dev/misc/ipmi/ipmi_pci.c
sys/dev/misc/ipmi/ipmi_isa.c
sys/dev/misc/ipmi/ipmi_acpi.c
sys/dev/misc/ipmi/ipmi.c
== 'ipmi_attached' NEVER appears in sys/dev/misc/ipmi/ipmi_smbus.c:
0
== child-creation guard is per-parent only (ipmi_smbus.c:55-63):
static void
ipmi_smbus_identify(driver_t *driver, device_t parent)
{
struct ipmi_get_info info;
if (ipmi_smbios_identify(&info) && info.iface_type == SSIF_MODE &&
device_find_child(parent, "ipmi", -1) == NULL)
BUS_ADD_CHILD(parent, parent, 0, "ipmi", -1);
}
== second-attach consequence chain ==
ipmi_smbus_attach -> ipmi_ssif_attach (ipmi_ssif.c:361-374, returns 0 unconditionally)
-> ipmi_attach (ipmi.c:841-866, no singleton check, sets ipmi_attached=1, config_intrhook at 859)
intrhook ipmi_startup (ipmi.c:708) -> sc->ipmi_startup = ssif_startup (ipmi_ssif.c:353-359) -> kthread_create(ssif_loop)
ipmi_startup -> make_dev ipmi%d (ipmi.c:831)