Трудно сказать без какого-либо кода, но если вы уже получили первый PMI, то регистры счетчиков установлены правильно, и проблема, вероятно, находится на верхних уровнях 1 .
Я бы проверил:
Чтобы отправить EOI в LAPIC.
Я предполагаю, что вы настроили регистр PMI локальной APIC с фиксированным вектором.
В этом случае вам необходимо отправить EOI в регистр EOI.
Цитата Intel (глава 10.8.5, том 3)
Для всех прерываний, кроме тех, которые поставляются с NMI, SMI, INIT, ExtINT, запуском или INIT-Deassert
В этом режиме обработчик прерываний должен включать запись в регистр конца прерывания (EOI).
Пример кода:
mov DWORD [APIC_BASE+0xb0], eax
Эффективный адрес для неперемещенного LAPIC: 0xfee000b0
.
Записанное значение не имеет значения, я взял регистр, чтобы кодировка инструкции была короткой.
Конечно, вы должны правильно обращаться к LAPIC для вашего контекста.
Чтобы установить флаг IF
Очистить флаг IF
- маловероятная гипотеза, но также довольно легко исключить.
Поскольку шлюз прерывания (но не шлюз-ловушка) очищает IF
, убедитесь, что выбранный вами способ выхода из ISR правильно восстанавливает IF
.
1 Если я правильно помню, PMI не нужно менять.