« first day (2908 days earlier)      last day (2064 days later) » 

00:56
@FutureSecurity I'm going to say it'll depend on the target because i7/i9 have instructions that specifically are useful for virtualization. The x86 is the processor that I am least familiar with; however, I went through the exercise of this because I have a virtual image that I use locally for semiconductor simulation and a farm of crappy computers from around the Uni. The i5 throw aways were orders of magnitude slower running the images.
I believe that it is generally disabled. I have patches for MacOS that trap and emulate the instruction from a toolkit.
Generally, due to the fact that it'd be totally easy to ruin that, I would say that the CPUID and the rdtsc instructions are by far the most exploitable items you had.
If you emulated them, you probably could do this:
__asm__ volatile("rdtsc" : "=a" (a), "=d" (d));
dret = ((unsigned long long)a) | (((unsigned long long)d) << 32);
__asm__ volatile("rdtsc" : "=a" (a), "=d" (d));
dret2 = ((unsigned long long)a) | (((unsigned long long)d) << 32);
diffrdtsc=dret2-dret1;
You could probably use that to determine if the rdtsc instruction was actually working.
(note, that's a clang macro, I don't think gcc will let that work)
so, summary: I agree that everything but network traffic would be deterministic; however, interrupts might work and I believe you could assess the quality.
(sorry for being so scatter brained. Recovering from too much 200yen beer)
A quick test of the above showed that difference is 1000s on my i7 and about 20 on an emulated system.

« first day (2908 days earlier)      last day (2064 days later) »