The TDVMCALLs are related to the I/O path (networking/block io) into the L2
guest, and
so they intentionally go straight to L0 and are never injected to L1. L1 is not involved in that path at all.
Using something different than TDVMCALLs here would lead to additional
traps to L1 and
just add latency/complexity.
Looks by default you assume we should use TDX partitioning as "paravisor L1" + "L0 device I/O emulation".
I don't actually want to impose this model on anyone, but this is the one that could use some refactoring. I intend to rework these patches to not use a single "td_partitioning_active" for decisions.
I think we are lacking background of this usage model and how it works. For instance, typically L2 is created by L1, and L1 is responsible for L2's device I/O emulation. I don't quite understand how could L0 emulate L2's device I/O?
Can you provide more information?
Let's differentiate between fast and slow I/O. The whole point of the paravisor in L1 is to provide device emulation for slow I/O: TPM, RTC, NVRAM, IO-APIC, serial ports.
Out of my curiosity and not really related to this discussion, but could you please elaborate on RTC part here? Do you actually host secure time in L1 to be provided to the L2?
Best Regards, Elena.