Получить прерывание мониторинга производительности на Qemu-Kvm
У меня есть ситуация с перехватом прерывания мониторинга производительности (PMI - особенно счетчик команд) на qemu-kvm. Приведенный ниже код отлично работает на реальной машине (Intel Core TM i5-4300U), но на qemu-kvm (хост qemu-system-x86_64 -cpu) я не вижу ни одного PMI. Хотя счетчик работает нормально. Я могу проверить это приращение хорошо.
Однако я протестировал ядро Linux, и оно очень хорошо ловит прерывание переполнения на том же qemu-kvm. Так что, очевидно, есть один шаг, который я пропускаю при настройке счетчика мониторинга производительности в Qemu-kvm.
Может ли кто-нибудь указать мне на это? Вот псевдокод:
#define LAPIC_SVR 0xF0
#define LAPIC_LVT_PERFM 0x340,
#define CPU_LOCAL_APIC 0xFFFFFFFFBFFFE000
#define NMI_DELIVERY_MODE 0x4 << 8 //NMI
#define MSR_PERF_GLOBAL_CTRL 0x38F
#define MSR_PERF_FIXED_CTRL 0x38D
#define MSR_PERF_FIXED_CTR0 0x309
#define MSR_PERF_GLOBAL_OVF_CTRL 0x390
/*Configure LAPIC*/
apic_base = Msr::read<Paddr>(Msr::IA32_APIC_BASE)
map(CPU_LOCAL_APIC, apic_base & 0xFFFFF000) // No caching, etc.
Msr::write (Msr::IA32_APIC_BASE, apic_base | 0x800);
write (LAPIC_SVR, read (LAPIC_SVR) | 0x100);
*reinterpret_cast<uint32 volatile *>(CPU_LOCAL_APIC + LAPIC_LVT_PERFM) = NMI_DELIVERY_MODE;
/*Configure MSR_PERF_FIXED_CTR0 to have overflow interrupt*/
Msr::write(Msr::MSR_PERF_GLOBAL_CTRL, Msr::read<uint64>(Msr::MSR_PERF_GLOBAL_CTRL) | (1ull<<32)); // enable IA32_PERF_FIXED_CTR0
Msr::write(Msr::MSR_PERF_FIXED_CTRL, 0xa); // configure IA32_PERF_FIXED_CTR0 to count in user mode and interrupt on overflow
Msr::write(Msr::MSR_PERF_FIXED_CTR0, (1<<48) - 0x1000); // overflow after 0x1000 instruction
Msr::write(Msr::MSR_PERF_GLOBAL_OVF_CTRL, Msr::read<uint64>(Msr::MSR_PERF_GLOBAL_OVF_CTRL) & ~(1UL<<32)); // clear overflow condition