Debug MSR regsiters

Тема в разделе "WASM.WIN32", создана пользователем green, 20 апр 2005.

  1. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Можно ли использовать возможности аппаратной трассировки ветвлений и исключений Pentium4 под Windows (XP) ?



    Смотрел в SoftICE MSR-регистры MSR_LASTBRANCH_* - или постоянно всё обнулено, или стабильный набор значений, Ппохоже механизм трассировки отключен т.к. бит 0 в регистре IA32_DEBUGCTL (1d9) сброшен.

    Попытки писать в этот регистр ничего не дают, при посл. чтении - снова 0. :-(



    Раньше помню под 9х SoftICE при всплытии выдавал инфу типа

    Last branch from IP= ..., Last branch to IP=...



    Теперь же такого нет, то ли из-за нового Виндовса то ли из-за SoftICE.



    Разъясните пожалуйста в чём тут дело.

    Спасибо.
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    И сейчас выдает, по крайней мере мой DS2.7 под XP на Athlon'е







    Или из-за проца :derisive:
     
  3. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    Asterix

    Проц наверно смотрит, какая ОС загружена =)
     
  4. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    эта фигня есть только на интеловских процах, amd на новых процах всю эту хрень убрала



    Поправлено:

    не на всех. вот на дюронах (у меня 1700) точно нет. на атлонах если верить Asterix-у - есть.

    Может у кого на дюронах есть тоже, тогда я вообще не знаю
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Я вот пытался через эти регистры, но обходным путем -

    без драйвера(где-то в топике был линк на статью),

    читать значения этих регистров под Olly - результаты

    странные, такое ощущение что удаётся читать предыдущие

    значения регистров, т.е. от предыдущего дебажного

    исключения %)



    Broken Sword





    Точно, есть :) В ближайшее время собираюсь обновить

    его до Athlon XP, надеюсь в нем тоже будут.
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Вот простенькая программка для теста поддержки MSR регистров процессором
    Код (Text):
    1.  
    2. format PE GUI 4.0
    3. entry start
    4.  
    5. include '%fasminc%\win32a.inc'
    6. include 'struct.inc'
    7.  
    8. MSR_FLAG = 00000020h
    9.  
    10. struct _SEH
    11.      .SafeEip   dd   ?       ; The offset where it's safe to continue execution
    12.      .PrevEsp   dd   ?       ; The previous value of esp
    13.      .PrevEbp   dd   ?       ; The previous value of ebp
    14. ends
    15.  
    16.  
    17. section '.code' code readable executable
    18.  
    19. align 4
    20. cproc DefaultExceptionHandler, pExcept, pFrame, pContext, pDispatch
    21. enter
    22.    lea eax, [_seh]
    23.      virtual at eax
    24.                 .sh   _SEH
    25.      end virtual
    26.    push [.sh.SafeEip]  ; здесь можно без virtual так:  push [eax+_SEH.SafeEip]
    27.    push [.sh.PrevEsp]
    28.    push [.sh.PrevEbp]
    29.  
    30.    mov eax, [pContext]
    31.      virtual at eax
    32.                 .con   CONTEXT
    33.      end virtual
    34.    pop [.con.Ebp]
    35.    pop [.con.Esp]
    36.    pop [.con.Eip]
    37.  
    38.    ; reload context & continue execution
    39.    xor eax, eax     ; return ExceptionContinueExecution
    40.    return
    41. endp
    42.  
    43. align 4
    44. start:
    45.    mov eax, msr_msg_not_supports
    46.    push eax
    47.  
    48.    push DefaultExceptionHandler
    49.    push DWORD [fs:0]
    50.    mov [fs:0], esp
    51.    mov [_seh.SafeEip], SafePlace
    52.    mov [_seh.PrevEbp], ebp
    53.    mov [_seh.PrevEsp], esp
    54.  
    55.    mov [_features_edx], 0
    56.    mov eax, 1
    57.    cpuid
    58.    mov [_features_edx], edx
    59.  
    60. SafePlace:
    61.    pop DWORD [fs:0]
    62.    add esp, 4
    63.    pop eax
    64.    and [_features_edx], MSR_FLAG
    65.    jz @F
    66.    mov eax, msr_msg_supports
    67. @@:
    68.    xor ecx, ecx
    69.    invoke MessageBox, ecx, eax, ecx, ecx
    70.    invoke ExitProcess, 0
    71.  
    72.  
    73. section '.data' data readable writeable
    74.  
    75. msr_msg_supports     db "The processor supports Model Specific Registers",0
    76. msr_msg_not_supports db "The processor NOT supports Model Specific Registers",0
    77. align 4
    78. _seh   _SEH
    79. _features_edx  dd  ?
    80.  
    81.  
    82. section '.idata' import data readable
    83.  
    84. library kernel32,'KERNEL32.DLL',\
    85.           user32,'USER32.DLL'
    86.  
    87. include '%fasminc%\APIA\KERNEL32.INC'
    88. include '%fasminc%\APIA\USER32.INC'
    89.  
    [​IMG] 1521829076__MsrRegs.rar
     
  7. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Asterix

    у меня пишет, что supports, хотя я точно знаю что нет. ты проверяешь по cpuid, а это неблагодарный метод проверки
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Broken Sword



    У меня ранше как раз Атлон был. И SoftICE (4.2.7) на Win9x выдавал эту информацию. Только я на неё тогда внимания не обращал :)



    Сейчас WinXP SP2

    SoftICE от DS 3.2

    Проц Pentium4 (family 0Fh, model 02h). Для него Интел декларирует поддержку 4-х MSR регистров,сохраняющих инфу о предыдущих ветвлениях.

    Судя по CPUID также поддерживается Debug Store (bit 21).

    Т.е. можно фактически делать лог трассировки произвольного размера. По моему это вообще суперфича для исследования программ!



    Только вот не пашет...







    Я никак не пойму почему не работает запись в регистр IA32_DEBUGCTL из SoftICE:

    после

    msr -w 1d9 1

    последующая

    msr 1d9

    выдает опять 0. :-(



    От виндовса это вроде никак не может зависеть. Т.е. либо глюк проца, либо SoftICE.
     
  9. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    green

    Разве wrmsr не может генерировать эксепшен? Т.е. от ос это может зависеть.
     
  10. LocTb

    LocTb New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    54
    Чем плясать с бубном, не проще ли почитать IA-32 Intel® Architecture Software Developer’s Manual, Volume3: CHAPTER 15

    DEBUGGING AND PERFORMANCE MONITORING.

    Там всё отлично расписано.
     
  11. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    вообще-то может, но только в 2 случаях AFAIK:

    1) ring > 0

    2) регистр не реализован



    В данном случае причин для этого нет:

    1) ring0 (SoftICE)

    2) этот регистр должен железно быть в Pentium4.



    И кроме того SoftICE вроде обрабатывает ошибки записи в MSR.
     
  12. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    ну попробуй записать в левый регистр - делов то...
     
  13. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    попробовал сейчас на Атлоне64 - то же самое. Т.е. SoftIce (4.3.2) инфу о посл. ветвлении не дает, изменить регистр IA32_DEBUGCTL тоже не получается (из softice).

    :-(

    infern0

    пробовал:

    NTICE error ...
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Broken Sword





    Интересно, а как ещё можно проверить, ведь это рекомендации

    производителей процов %)
     
  15. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Asterix

    незнаю, cpuid просто копирует готовые данные, ничего при этом не проверяя. Самый верный способ в данном случае - выполнить пару переходов и прочитать значения регистров этих.