Моя компания разрабатывает гипервизор, и этот вопрос касается использования API SVM (Secure-Virtual-Machine) AMD.
Я бы хотел точно отследить, сколько инструкций выполнено в моей гостевой операционной системе за данный период. AMD любезно предоставила так называемые биты «HO» и «GO» или «HostOnly» и «GuestOnly» в MSR PerfEvtSel (0xc0010000..3) при реализации своих процессоров семейства 0x10h (Phenom x2 и т. Д.). BKDG для семейства 0x10h указывает, что эти биты равны 40 и 41 из 64-битного регистра PerfEvtSel. Однако BKDG для семейства 0x11h не указывает на существование битов 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, и что данный код успешно записывает и может читать биты 40 и 41 MSR , Я подтвердил это.
Что я испытываю, так это то, что счетчик учитывает как гостя, так и хозяина. Это очень затрудняет получение точного учета только того, что произошло в госте.
Мои вопросы:
- Работают ли биты HostOnly и GuestOnly на процессорах семейства 0x10h?
- Есть ли какое-либо другое состояние машины, которое мне нужно настроить, чтобы это работало?
- Кто-нибудь когда-нибудь видел эту функцию этого процессора?
- Кто-нибудь знает, почему процессоры BKDG для семейства 0x11h не отображают эту функцию как имеющуюся? То есть рассматриваемые биты зарезервированы для этого семейства.
- Есть ли другой известный способ заставить реализации SVM отключать PMC, находясь в хосте?