Доброго времени суток! Надеюсь, создал тему в нужном разделе. Пытаюсь заставить работать интеловскую фичу под названием Branch Trace Store (BTS). ОС - Windows XP SP3, проц Intel Core 2 Duo E8400. Возникла загвоздка. Уже 100500 раз перечитал маны интела, но что-то никак не найду ошибки.. Приведу упрощенный код (fasm). Объявление DS Save Area: Код (Text): BTS_entries_num = 4096 reserved_BTS_entries_num = 800 ;*****************DS Buffer Management Area***************** DS_Management_Area: ;-------BTS buffer base BTS_buffer_base: dd BTS_buffer ;-------BTS index BTS_index: dd BTS_buffer ;-------BTS absolute maximum dd BTS_buffer + BTS_entries_num *12 ;-------BTS interrupt threshold dd BTS_buffer + (BTS_entries_num - reserved_BTS_entries_num) *12 ;-------PEBS records dd 9 dup ? ;***********************BTS buffer*********************** align 64 BTS_buffer: dd BTS_entries_num *3 dup 0 Запись в LVT, задание базы DS, включение BTS: Код (Text): ; int 0F0h fixed edge sensitive not masked mov dword [0FFFE0340h], 0F0h or (000b shl 8) or (0b shl 15) or (0b shl 16) ;запись в LVT Performance Counter Register mov ecx, 600h ;IA32_DS_AREA rdmsr mov dword [original_IA32_DS_AREA], eax mov eax, DS_Management_Area ;база DS AREA wrmsr mov ecx, 01D9h ;IA32_DEBUGCTL rdmsr ; TR BTS BTINT BTS_OFF_OS BTS_OFF_USR or eax, (1 shl 6) or (1 shl 7) or (1 shl 8) or (1 shl 9) or (0 shl 10) wrmsr Генерация BTM включается (вижу по падению производительности), но вызова обработчика прерывания не происходит. При этом BTS буфер остается забитым нулями, т.е. записи тоже не происходит. Если же не устанавливать флаг BTINT, то BTMы в буфер пишутся. Обработчик PMI при этом не вызывается. Опять-таки, что-то неправильно. В мане сказано: "In order to prevent generating an interrupt, when working with circular BTS buffer, SW need to set BTS interrupt threshold to a value greater than BTS absolute maximum (fields of the DS buffer management area). It's not enough to clear the BTINT flag itself only." Т.е. PMI все равно должен сгенерироваться, т.к. BTS interrupt threshold я указал меньший, чем BTS absolute maximum. Кстати, возникает вопрос: а зачем тогда вообще нужен флаг BTINT? Проверил следующее: APIC global enable/disable flag (бит 11) в IA32_APIC_BASE MSR (адрес 1BH) = 1: апик включен. Spurious Interrupt Vector Register, бит 8 = 1: APIC Enabled. Error Status Register = 0: нет ошибок апика. Желаемые значения в IA32_DS_AREA MSR, IA32_DEBUGCTL MSR и LVT Performance Counter Register записываются. Обработчик прерывания в IDT устанавливаю вроде правильно (во всяком случае, int _vec_num_ он обрабатывает). Подскажите, пожалуйста, что я делаю неправильно? P.S. Вообще маны интела, касаемо данной темы, меня немного разочаровали (
Ну фича-то чисто ЦПшная, к ОСи привязки практически нет, вот и решил спросить здесь.. Тогда просьба к модератору: переместите тему в NTKERNEL, пожалуйста. ------------------------- Немного еще поэксперементировал. Если включать BTS со сброшенным флагом BTINT, в буфер происходит запись только 1 дворда (т.е. 1/3 целой записи), при этом BTS absolute maximum почему-то меняется на BTS buffer base+24. Проверил еще атрибуты страницы (в мане написано, что должны быть установлены A и D), вывод WinDbg: pfn ab7b -G-DA--KWEV pfn 449fb -G-DA--KWEV Вроде все ОК... Как-то этот BTS покрыт мраком Ни 1 примера найти не могу.