This set of patches adds an IPMI device to qemu. This is good for systems that require an IPMI device to work correctly, for simulating scenarios that require IPMI and testing software that uses IPMI, and of course, for the Linux IPMI driver maintainer to use to reproduce issues that could not be easily reproduced otherwise :).
For those that don't know, IPMI is a standard for doing sensor monitoring and basic machine maintenance. It has local interfaces on the host system (four different types, SMIC, KCS, BT, and SSIF) that can be in I/O space, memory space, and PCI space, and in the case of SSIF, is on an I2C bus. It can also have network interfaces for out of band maintenance, though that's not directly relevant here. It is a message-based interface; all IPMI operations are done by sending command messages, results come back as response messages. The maintenance actions are done by a small controller on the system called a Baseboard Management Controller (BMC). These devices are always on when the system is plugged in, even if the system is off. The first 9 patches add the device itself on an ISA interface. This adds a KCS device and a BT device (two of the four standard IPMI interfaces). It also adds software to have a small BMC simulated inside of QEMU, and a way to connected to an external BMC (like openipmi library's lanserv) over the network. Those patches should be pretty straightforward, though I'm still not 100% sure about migration. Patch 10 postpones sending the SMBIOS and ACPI tables to the firmware until after the devices have initialized. This lets the IPMI driver add entries to those tables when it starts. It might be possible to pre-parse the IPMI parameters very early, but that seems like a lot more work, and there's no harm in sending the tables to the firmware later, as far as I can tell. Patches 11 and 12 add an SMBIOS entry for the IPMI device. Patches 13-15 are about adding ACPI tables for the IPMI device. This adds code that can dynamically create ACPI tables, then uses that to generate an SSDT for an IPMI device in the ISA bus space. I opted for this over a hard coded table because I would need several different tables depending on configuration (I/O or memory space, interrupt or none, PCI space, I2C space if that gets added, IPMI device type). Generating them on the fly is fairly simple. Patch 16 moves running the local BMC simulation to it's own thread. I'm not really sure of the value, besides a more accurate simulation, but perhaps there is to offload the main execution of qemu. -corey