Пишу небольшую ОС'ку, сделал PIC, Local APIC, а с I/O APIC'ом проблема. Если использовать PIC или LAPIC в режиме Virtual Wire - прерывания от PIT и RTC доходят, если отключить на LAPIC LINT0 и использовать I/O APIC - либо доходит только одно прерывание, либо ни одного. На QEMU, VirtualBox и Bochs I/O APIC работает. Подскажите, в чем может быть дело? В аттаче исходники, имеющие отношение к апику (на C++).
Встречный вопрос (в частности автору топика): как вырубить PIC-mode на qemu? Поясняю - IMCR у него нет (в коде во вложении, кстати, его наличие не проверяется, но порты используются - не случится ли конфуза?), поэтому он как бы сразу в virtual wire. Но. Баним LINT0/1 в LVT BSP (они, кстати, у qemu забанены по умолчанию) - прерывания приходят. Баним весь LAPIC в SVR - прерывания приходят. Баним LAPIC в MSR - прерывания приходят. Выставляем DM = InitIPI - продолжает приходить IRQ0. Вывод - qemu в PIC mode. Вмварь работает корректно во всех этих случаях, в случае DM = InitIPI BSP ребутится как и положено (да, я знаю, что там нельзя DM = IIPI, это для теста), LINT0/1 в LVT BSP по умолчанию разбанены, на AP забанены - т.е. сразу virtual wire. Пробовал все же выставить в несуществующем IMCR единицу - не помогает. Во всех случаях на всех AP выполнено cli, отключено NMI, все AP подняты в long mode. зы используется qemu 0.9.0 под виндами (0.10.х не нашел), код х64. ззы а вообще qemu (по крайней мере эта версия) жжот не по детски. Не выставляет #UD по lock с левой инструкцией, по invlpg [] сбрасывает, по-видимому, весь TLB, т.к. я подставлял в скобки _любые_ компилируемые значения - и оно работало, тогда как ВМварь исправно падал. Может еще чего есть, чего я еще не нашел. В общем, по PIC mode - поможите, кто чем может =)