Greatly improve xhcid by using real MSI-X irqs.
First, it adds a mechanism for
pcid to talk to clients in a more advanced way, by using pipes and a request-response model. This interface allows subdrivers (e.g.
xhcid) to check which "features" (like MSI/MSI-X or PCI power management or AER) exist, and it also allows subdrivers to enable or disable these features.
xhcid side, the mechanism for awaiting an xHC response now involves an IRQ reactor, and async/await is used to simplify this logic by a lot. While the entire driver and it's scheme I/O isn't fully async yet (the non-async scheme I/O functions call
futures::executor::block_on, the commands themselves now at least use real IRQs instead of busy-waiting.
Marked as WIP because I added a logging framework for xhcid which also prints to stdout, which is really verbose as of now. I'm also a bit unsure about whether some kind of protection logic (probably involving page faults) should be used since the subdrivers themselves directly access the MSI-X table (which is located in the same BAR as everything else), because they can simply write a non-allocated (or even one of the exceptions 16-31) interrupt vector to the MSI-X registers. This is probably not that serious, but I thought it might be a problem when running untrusted drivers (as with
physmap too?) and thus worth mentioning.