Проверьте, включено ли определенное прерывание (IPI) - PullRequest
0 голосов
/ 04 июля 2018

Я читал, что EFLAGS имеет IF, где он может хранить, если прерывания вообще включены, но мне нужно знать, включен ли IPI (межпроцессное прерывание).

У меня есть физический доступ к регистрам и данным процессора только через отладчик Lauterbach, я не могу получить доступ к ядру или тому подобному.

1 Ответ

0 голосов
/ 05 июля 2018

Термин 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.

...