> I think we could solve all problems (well, maybe not world peace, yet) > by switching to message based system for all of DMA and IRQs. > > Each device would have a message input port and way to output messages. > > Examples: > > Zero copy memory access from device D1 to D2 to host memory (D3) with > access broken to page length units and errors occurring on the last > byte: > D1 send_msg(ID, MSG_MEM_WRITE, DMA address, length) -> D2 >... > IRQ delivery chain D1->D2->D3 with coalescing, messages, delivery > reporting and EOI: > D1 send_msg(ID, MSG_IRQ_RAISE, payload) -> D2
This feels like a terrible idea to me. It introduces an unnecessary RPC indirection layer without actually solving any of the problems. It just makes it harder (if not impossible) for the compiler to verify any of the interfaces between objects. If we need a mechanism for a device to query the state of its outgoing IRQ lines (which is what I mentioned previously), then we can just add that. I still maintain that qemu_irq is *not* a message passing interface, and that this absence is a good thing. Maybe if I make the qemu_irq code actively suppress redundant level change notices that would make things clearer. Paul