local APIC - нет PMI для BTS

Тема в разделе "WASM.NT.KERNEL", создана пользователем q1nex, 23 дек 2011.

  1. q1nex

    q1nex New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2011
    Сообщения:
    4
    Доброго времени суток!
    Надеюсь, создал тему в нужном разделе.

    Пытаюсь заставить работать интеловскую фичу под названием Branch Trace Store (BTS). ОС - Windows XP SP3, проц Intel Core 2 Duo E8400.
    Возникла загвоздка. Уже 100500 раз перечитал маны интела, но что-то никак не найду ошибки..
    Приведу упрощенный код (fasm).

    Объявление DS Save Area:
    Код (Text):
    1. BTS_entries_num = 4096
    2. reserved_BTS_entries_num = 800
    3.  
    4. ;*****************DS Buffer Management Area*****************
    5. DS_Management_Area:
    6. ;-------BTS buffer base
    7. BTS_buffer_base:
    8. dd BTS_buffer
    9. ;-------BTS index
    10. BTS_index:
    11. dd BTS_buffer
    12. ;-------BTS absolute maximum
    13. dd BTS_buffer + BTS_entries_num *12
    14. ;-------BTS interrupt threshold
    15. dd BTS_buffer + (BTS_entries_num - reserved_BTS_entries_num) *12
    16.  
    17. ;-------PEBS records
    18. dd 9 dup ?
    19.  
    20. ;***********************BTS buffer***********************
    21. align 64
    22. BTS_buffer:
    23. dd BTS_entries_num *3 dup 0
    Запись в LVT, задание базы DS, включение BTS:
    Код (Text):
    1. ;                  int 0F0h       fixed       edge sensitive   not masked
    2. mov dword [0FFFE0340h], 0F0h or (000b shl 8) or (0b shl 15) or (0b shl 16)  ;запись в LVT Performance Counter Register
    3.  
    4.  
    5. mov ecx, 600h   ;IA32_DS_AREA
    6. rdmsr
    7. mov dword [original_IA32_DS_AREA], eax
    8. mov eax, DS_Management_Area ;база DS AREA
    9. wrmsr
    10.  
    11. mov ecx, 01D9h  ;IA32_DEBUGCTL
    12. rdmsr
    13. ;   TR    BTS      BTINT      BTS_OFF_OS    BTS_OFF_USR
    14. or eax, (1 shl 6) or (1 shl 7) or (1 shl 8) or (1 shl 9) or (0 shl 10)
    15. 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. Вообще маны интела, касаемо данной темы, меня немного разочаровали (
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Раздел неудачно вы выбрали. Надо в NTKERNEL. Тут разработка других ОС.
     
  3. q1nex

    q1nex New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2011
    Сообщения:
    4
    Ну фича-то чисто ЦПшная, к ОСи привязки практически нет, вот и решил спросить здесь.. Тогда просьба к модератору: переместите тему в 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 покрыт мраком :lol: Ни 1 примера найти не могу.