我的公司开发了一个虚拟机管理程序,这个问题涉及使用AMD的SVM(安全虚拟机)API。
我想跟踪在给定时间段内在客户操作系统中执行了多少指令。 AMD在他们的0x10h系列CPU(Phenom x2等)的实现中,在PerfEvtSel MSR(0xc0010000..3)中提供了所谓的“HO”和“GO”或“HostOnly”和“GuestOnly”位。系列0x10h的BKDG表示这些位是64位PerfEvtSel寄存器的40和41。但是,系列0x11h的BKDG没有说明HostOnly和GuestOnly位的存在!
我的代码如下:
reg_svm_pes_set_unit_mask(&pes, 0x00);
reg_svm_pes_set_usr(&pes, 1); // Count user mode cycles
reg_svm_pes_set_os(&pes, 1); // Count system cycles
reg_svm_pes_set_e(&pes, 0); // Level, not edge
reg_svm_pes_set_pc(&pes, 0);
reg_svm_pes_set_int(&pes, 1); // Trigger interrupt on overflow
reg_svm_pes_set_en(&pes, enabled);
reg_svm_pes_set_inv(&pes, 0); // No invert sense
reg_svm_pes_set_go(&pes, 1); // Count in the guest
reg_svm_pes_set_ho(&pes, 0); // And not in the host...
你必须明白,每个都是一个正确编写的内联函数,它设置PMC寄存器中的相应位,并且给定代码成功写入并可以读回MSR的第40和41位。我已经证实了这一点。
我所经历的是,计数器在来宾和主机中都是重要的。这使得很难准确计算客人发生的事情。
我的问题是: