Термин IPI обозначает категорию прерываний, а именно: NMI , SMI , SIPI, INIT и фиксированные прерывания.
Из них NMI, SMI, SIPI и INIT не могут быть замаскированы без глобального отключения LAPIC.
NMI (немаскируемое прерывание) с самого начала было разработано как немаскируемое, как следует из названия.
Есть способ взломать его: установить бит 7 порта 70h.
Однако это аппаратный трюк, он связывает высокий уровень #NMI (сегодня это LINT1, но это настраивается).
IPI отправляются через программное сообщение, поэтому этот трюк не сработает.
SMI (Прерывание управления системой) используется для входа в SMM (см. Предыдущую ссылку), режим, разработанный таким образом, чтобы быть максимально прозрачным для программного обеспечения.
Это не маскируется, что касается программного обеспечения, он не существует.
Прерывания INIT и SIPI (Start-IPI) 1 используются для сброса и пробуждения ЦП.
Они не могут быть замаскированы по замыслу (BIOS обычно помещает точки доступа, процессоры приложений в состояние ожидания с последовательностью cli / hlt
).
Фиксированные прерывания могут быть замаскированы флагом IF
или когда выполняется ISR с фиксированным прерыванием с более высоким приоритетом (точно так же, как устаревшие IRQ с PIC).
Можно замаскировать только фиксированные прерывания, что может фактически соответствовать общему пониманию термина IPI, путем soft отключения APIC.
Это можно сделать, очистив бит 8 регистра вектора побочных прерываний со смещением 0f0h от базы LAPIC (база LAPIC установлена в IA32_APIC_BASE
MSR, ее адрес равен 1bh).
Конечно, очистка IF
тоже подойдет.
В качестве альтернативы можно полностью отключить LAPIC (он не будет реагировать на любой IPI), очистив бит 11 из IA32_APIC_BASE
MSR.
Чтобы проверить, включены ли IPI, необходимо проверить флаг IF
, регистр векторов побочных прерываний и IA32_APIC_BASE
MSR.