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