This is a non-trivial project involving kernel-level code. The fact that the CPU performance counters are updated all the time (and there is no virtualization support for them I assume besides the usual MSR updating) makes them hard to virtualize.

The concept itself is simple (excuse a little over-simplification): the initial state for the VM's perf counters is all 0. When starting the VM execution the host OS's perf counter values need to be saved and the ones for the guest need to be loaded. Similarly when ending the VM execution the guest's perf counter values need to be saved and the host OS's need to be loaded.

In the end this is an extension to the MSR handling which is already present. Still, you need to understand how the additional MSRs can be handled safely.

Note that the result won't ever be perfect, because the VM switching machinery will never be counted quite right and therefore it will introduce potentially a lot of inaccuracies to the perf counters.

Additionally it costs some clock cycles for every VM execution start and VM execution end, because MSR loading and saving isn't for free. Adding possibly another condition to the hot code path...

I wouldn't mind having such functionality, therefore please don't see the above as an attempt to talk you out of it. However, it needs dealing with low level code and it will pass through very careful code review to make sure the code doesn't have unintentional side effects.

Klaus

On 2023-11-16 18:00, Valdis Klētnieks via vbox-dev wrote:
On Tue, 07 Nov 2023 21:38:48 +0100, David via vbox-dev said:

I am considering contributing to VBox and add support for CPU performance
counters. You might have encountered the lack of such support while using
Perf, which will dispay *<not supported>* in place of, for example, the
branch-misses that were requested.

  Hw should you access the hardware specific registers? You're basically going 
to
have to include much of the infrastructure from the Linux 'perf' command, or
whatever the equivalent is on other host operating systems.

As to how to make them available inside the virtual machine?  As virtualized
MSRs or whatever the real hardare presents - because 'perf' running inside the
VM will use the same system calls to get info from the (virtualized) hardware, 
and the
virtualized OS will attempt to use the same MSR/etc access it would if it as
running on bare iron.
_______________________________________________
vbox-dev mailing list
vbox-dev@virtualbox.org
https://www.virtualbox.org/mailman/listinfo/vbox-dev

Reply via email to