out 71h <= 1Ch

Тема в разделе "WASM.RESEARCH", создана пользователем Kirillxskynet, 29 янв 2007.

  1. Kirillxskynet

    Kirillxskynet New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2006
    Сообщения:
    30
    Код (Text):
    1. mov ecx,2Ch
    2. rdmsr
    3. mov ebx,eax
    4. bt eax,14h
    5. jnb m1
    6. mov al,38h
    7. out 70h,al
    8. pause
    9. pause
    10. in al,70h
    11. cmp al,1Ch
    12. jbe m2
    13. mov al,1Ch
    14. out 71h,al
    15. m2:
    16. jmp m3
    ...
    насколько я понял 2Ch - регистр в котором содержится информация о частоте системной шины, но вся проблема в том что здесь читается 20-вй бит(14h), а в документации Intel напиисано, что он reserved. За что он отвечает? Может кто сталкивался?
    Далее, 70h - индексный регистр CMOS'а, и насколько я знаю чтение из него запрещено(возможно только в alt mode).
     
  2. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    забавный фрагмент, у MSR 2Ch везде, где он есть, бит 20 в резервед попадает. С 70h тоже странный стафф -- даже если предположить, что altacc включен, то все равно странный код. А что у тебя за система? Фрагмент бы лучше в виде копи-пасте с листинга заслал, а не в своей переработке.
    --------
    хм, похоже на undoc fields. На сэндпайле чел какой-то постил, (предположительно интеловец, т.к. он же там постил инфу про различение инженерных sample'ов процев интел):
    Код (Text):
    1. | But i haven't found info about p4 multipliers. I know that these
    2. | info are stored in the MSR 0x2C for northwood and 0x2A for willy,
    3. | but I don't know how these info are stored. Can anyone help me?
    4.  
    5. if CPUID < 0F20h...
    6.  
    7. MSR 2Ah bits 11...8 = ratio
    8.  0h = 16x/16x ; 1st is for A/B step, 2nd is for C step
    9.  1h = 17x/17x
    10.  2h = 18x/18x
    11.  3h = 19x/19x
    12.  4h = 20x/20x
    13.  5h = 21x/21x
    14.  6h = 22x/22x
    15.  7h = 23x/24x
    16.  8h = 08x/08x
    17.  9h = 09x/23x
    18.  Ah = 10x/10x
    19.  Bh = 11x/11x
    20.  Ch = 12x/12x
    21.  Dh = 13x/13x
    22.  Eh = 14x/14x
    23.  Fh = 15x/15x
    24. MSR 2Ch bits 23...21 = bus speed (read-only)
    25.  000b=100 MHz
    26.  
    27. if CPUID >= 0F20h...
    28.  
    29. MSR 2Ch bits 21...24 = ratio (read-only)
    30. MSR 2Ch bit 21 = SpeedStep supported (read-only)
    31. MSR 2Ch bit 20 = frequency locked (read-only)
    32. MSR 2Ch bits 18...16 = bus speed (read-only)
    33.  000b=100, 001b=133, 010b=200, 011b=166 MHz
    34. MSR 2Ch bits 15...8 = low ratio delta (read-only)
    35.  lowest ratio = bits 7...0 - bits 15...8
    36. MSR 2Ch bits 7...0 = highest ratio (read-only)
     
  3. Kirillxskynet

    Kirillxskynet New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2006
    Сообщения:
    30
    это код моего амишного биоса (система:Pentium 4 2.4Ghz HT with 512Kb L2 0.13 micron,
    мать Asus P4P800, intel 865PE chipset).
    файл биоса могу выслать тебе на мыло. Этот кусок кода находится в самом начале,
    дизассемблируй и сразу на него наткнешься.

    Что по поводу того парня с sendpile, то это я читал, интересно откуда у него такая информация?
    Видимо Intel по каким-то причинам до конца не выдает все секреты архитектуры своего творения.
    Я думаю многим было бы очень интересно докопаться до правды.
    Так что вопрос остается открытым...
     
  4. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    высылать не надо, у меня тоже как раз MB от Asus с amibios'ом, P5GD1 Pro.

    вряд ли он интеловец, он скорее всего эту инфу просто дернул из бутблока биоса. А в сообщении о enginnering samples я не заметил ключевого слова -- 'supposedly'. ;) В бутблоке перед твоим фрагментом идет парсинг по CPUID(1).AX и работа с MSR 2Ch по разным моделям -- всю инфу о скрытых в reserved битах множителях и тд можно почерпнуть оттуда. О назначении почти всех reserved bits еще можно в принципе узнать экспериментально, изменяя множитель (там где есть такая возможность) и смотря на изменения в 2Ch. Самый интересный вопрос -- откуда узнали об этих битах девелоперы AMI? Ведь одно дело знать, а другое дело -- вот так использовать в коде биосов, ведь уверены на 100% значит. Как будто бы для них отдельные мануалы интел писали... Или может мелькнуло где в какой-нибудь версии мануалов описание полей и тут же они стали "reserved" в следующих, хз.

    Что касаемо чтения 70h, тут тоже разъяснилось -- нет там никакого чтения в altacc mode и тп, просто-напросто ты опечатался когда перенабирал фрагмент. ;) Там обычное чтение из 71h, а не из 70h. У меня даже есть версия, зачем ты его перенабирал -- из-за ami'шных уникальных romcall'ов, которые чуть ли не на полноценный полиморф тянут. ;) Проверь код еще раз, должно быть что-то типа этого:
    Код (Text):
    1. disub_read_cmos_38h:            ; CODE XREF: p5gd1pro:0DC5j
    2.                     ; p5gd1pro:0F15j ...
    3.         mov al, 38h ; '8'
    4.         out 70h, al     ; CMOS Memory:
    5.                     ;
    6.         pause
    7.         pause
    8.         in  al, 71h     ; CMOS Memory
    9.         cmp al, cs:_1Ch
    10.         jbe short skip_1
    11.         mov al, 0FFh
    12.         out 71h, al     ; CMOS Memory:
    13.  
    14. skip_1:                 ; CODE XREF: p5gd1pro:0B7Cj
    15.         clc
    16.         jmp di
    Собственно в ячейке 38h данный амибиос хранит значение множителя -- далее по коду сравнивается с минимальным и максимальным значениями коэффициента (т.е. из undoc полей), если оказывается, что множитель вылезает за рамки приличия -- вместо него используется максимальный ratio из MSR 2Ch.
     
  5. Kirillxskynet

    Kirillxskynet New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2006
    Сообщения:
    30
    ты прав, такой возможности может и не быть
    но что интерсно, далее я наткнулся на следующий порт, о котором вообще никакой инфы нету (или может я не нашел?)
    Код (Text):
    1. F000:8D5E loc_F8D5E:                              ; CODE XREF: F000:8D56j
    2. F000:8D5E                                         ; F000:8D5Aj
    3. F000:8D5E                 mov     bx, dx
    4. F000:8D60                 mov     ecx, 2Dh
    5. F000:8D66                 rdmsr
    6. F000:8D68                 mov     ax, bx
    7. F000:8D6A                 wrmsr
    8. F000:8D6C                 jmp     loc_F00D1
    что еще за "2Dh"???
    Видимо, разработчикам биосов Intel выдает более подробные мануалы, другого объяснения таким вещам сложно придумать.


    По поводу 70h, уверяю, я не ошибся. Да действительно, сначала с помощью cpuid мы
    определяем модель процессора в системе:
    Код (Text):
    1. F000:8C20 CPU_init:                               ; CODE XREF: F000:0140j
    2. F000:8C20                 xor     eax, eax
    3. F000:8C23                 cpuid
    4. F000:8C25                 cmp     ebx, 756E6547h  ; "Genu"
    5. F000:8C2C                 jnz     not_Intel       ; di = 143h
    6. F000:8C30                 invd                    ; очистка кеш-памяти первого уровня и генерация сигнала на очистку
    7. F000:8C30                                         ; кэш-памяти второго уровня
    8. F000:8C32                 mov     eax, 1
    9. F000:8C38                 cpuid
    10. F000:8C3A                 and     ax, 0FF0h       ; обнулим степпинг
    11. F000:8C3D                 cmp     ax, 0F20h       ; model 2 - Pentium 4 0.13 micron
    12. F000:8C40                 jb      model_1         ; ниже?
    13. F000:8C44                 cmp     ax, 0F30h       ; model 3 - Pentium 4 0.09 micron
    14. F000:8C47                 jb      short model_2
    для моего проца в ax будет 0F2xh (степпинг я не помню), и вот что получаем на метке model_2:
    Код (Text):
    1. F000:8CB8 model_2:                                ; CODE XREF: F000:8C47j
    2. F000:8CB8                 mov     ecx, 2Ch
    3. F000:8CBE                 rdmsr
    4. F000:8CC0                 mov     ebx, eax
    5. F000:8CC3                 bt      eax, 20         ; 20-ый бит в cf
    6. F000:8CC8                 jnb     short loc_F8CE4 ; cf=0?
    7. F000:8CCA
    8. F000:8CCA loc_F8CCA:                              ; CODE XREF: F000:8C59j
    9. F000:8CCA                 mov     al, 38h
    10. F000:8CCC                 out     70h, al         ; CMOS Memory:
    11. F000:8CCE                 pause
    12. F000:8CD0                 pause
    13. F000:8CD2                 in      al, 70h         ; CMOS Memory
    14. F000:8CD4                 cmp     al, cs:byte_F0DBC ;cs:byte_F0DBC = 1Ch
    15. F000:8CD9                 jbe     short loc_F8CE1
    16. F000:8CDB                 mov     al, cs:byte_F0DBC
    17. F000:8CDF                 out     71h, al         ; CMOS Memory:
    18. F000:8CE1
    19. F000:8CE1 loc_F8CE1:                              ; CODE XREF: F000:8CD9j
    20. F000:8CE1                 jmp     model_1
    И еще
    откуда у тебя такая информация?
     
  6. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    но факт, что где-то есть и с незаблокированными множителями, иначе бы амибиос не ветвился по locked-биту. Может как раз на тех самых инженерных образцах. ;)

    MSR 2Dh... мда, это уже ни в какие ворота не лезет. Это уже конкретный намек на то, что по крайней мере по MSR-регистрам у биосдевелоперов есть доки получше общедоступных мануалов. У меня (P4, cpuid(1)-->0F43h) этот MSR отсутствует.
    Код (Text):
    1. F000:8CCA                 mov     al, 38h
    2. F000:8CCC                 out     70h, al         ; CMOS Memory:
    3. F000:8CCE                 pause
    4. F000:8CD0                 pause
    5. F000:8CD2                 in      al, 70h         ; CMOS Memory
    6. F000:8CD4                 cmp     al, cs:byte_F0DBC ;cs:byte_F0DBC = 1Ch
    7. F000:8CD9                 jbe     short loc_F8CE1
    Код (Text):
    1.         mov al, 38h ; '8'
    2.         out 70h, al     ; CMOS Memory:
    3.         pause
    4.         pause
    5.         in  al, 71h     ; CMOS Memory
    6.         cmp al, cs:_1Ch
    7.         jbe short skip_1
    классно, значит бага в сорцах биоса. Получается что в твоем биосе этот фрагмент будет всегда читать 0FFh (altacc там выключен) с 70h и получать 1Ch в результате. Но, т.к. множитель у обычных моделей залочен, то вся эта возня как-то по барабану и эта опечатка никак не должна проявиться. Может поэтому они и не слишком напрягались с proof-reading'ом данного кода. ;) Попробуй кстати скачать с сайта асуса свежий биос на свою MB, может там пофиксено это. У меня биос новый, надо будет как-нть глянуть оригинальный дамп, может там тоже эта опечатка есть (но в принципе она роли не играет).
     
  7. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Разобрался с MSR 2Dh. Биос работает с ним только если бит locked (бит20) в MSR 2Ch равен 0, т.е. этот MSR присутствует только на моделях процев с разблокированным множителем. Собственно о его назначении несложно догадаться, приняв во внимание, что 2Ch -- по сути чисто информативный рег, все ratio в нем read-only. MSR 2Dh предназначен для выставления множителя процессора (обоср..ся и не жить). Первое, что бросается в глаза -- это то, что биос работает с ним ОЧЕНЬ ОСТОРОЖНО. Считанное с cmos'а значение множителя участвует в многочисленнейших проверках диапазонов. Если что не так -- заменяется на допустимое значение (которое берется из 2Ch). После прохождения всех проверок биос даже проверяет текущее значение в 2Dh на равенство тому, что планируется туда записать и если равно -- то не пишет. ;) Так и представил до смерти запуганного программера с ami/asus, который трясущимися руками набирал этот код со всеми этими insane-проверками... Из MSR 2Dh используется биосом только младшие 2 байта, притом Byte0 = Byte1, установка нового множителя выглядит примерно так:
    Код (Text):
    1.         ; bl = new ratio
    2.         mov ecx, 2Dh
    3.         rdmsr
    4.         mov al, bl
    5.         mov ah, bl
    6.         wrmsr
    Насчет же приватных док для биосдевелоперов... На 99% уверен, что разблокированные множители есть только на инженерных образцах процев. Отсюда вывод, что массовому потребителю процев про них знать незачем. Но т.к. разработчики делают MB в т.ч. и под эти самые инженерные сэмплы -- на такое благое дело интел делится с ними описаниями MSR-регистров engineering sample'ов. Так и просачиивается до народа инфа о регистрах типа 2Ch, который присутствует и на обычных процах. ;) Но если MSR 2Dh вдруг всплывет на mobile-процах, то это уже будет бл..во.
     
  8. Kirillxskynet

    Kirillxskynet New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2006
    Сообщения:
    30
    Скачал, посмотрел, вот как переделали этот кусок в новой версии:
    Код (Text):
    1. F000:8EF4 loc_F8EF4:                              ; CODE XREF: F000:8DF7j
    2. F000:8EF4                 mov     ecx, 2Ch
    3. F000:8EFA                 rdmsr
    4. F000:8EFC                 mov     ebx, eax
    5. F000:8EFF                 bt      eax, 20
    6. F000:8F04                 jnb     short loc_F8F15
    7. F000:8F06                 mov     al, 38h
    8. F000:8F08                 out     70h, al         ; CMOS Memory:
    9. F000:8F08                                         ;
    10. F000:8F0A                 pause
    11. F000:8F0C                 pause
    12. F000:8F0E                 mov     al, 0FFh
    13. F000:8F10                 out     71h, al         ; CMOS Memory:
    14. F000:8F10                                         ;
    15. F000:8F12                 jmp     loc_F8FCB
    получается что так называемый баг:
    Код (Text):
    1. F000:8CD2                 in      al, 70h         ; CMOS Memory
    2. F000:8CD4                 cmp     al, cs:byte_F0DBC
    3. F000:8CD9                 jbe     short loc_F8CE1
    4. F000:8CDB                 mov     al, cs:byte_F0DBC
    заменили на одну команду mov al,0FFh и все.
    Но раньше в al заносилось значение 1Ch, а теперь 0FFh.
     
  9. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    _BC_
    где можно найти описание MSR? (участок которого приведён в начале темы)
     
  10. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    _BC_
    <Самый интересный вопрос -- откуда узнали об этих битах девелоперы AMI? Ведь одно дело знать, а другое дело -- вот так использовать в коде биосов, ведь уверены на 100% значит. Как будто бы для них отдельные мануалы интел писали... >

    Да стопудов они этой инфой владеют, получают от производителя. В этом интерес обеих сторон. Иначе глюк получится а не железо, а это потеря бабок, что никому ненужно.
     
  11. Kirillxskynet

    Kirillxskynet New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2006
    Сообщения:
    30
    http://www.intel.com/design/processor/manuals/253669.pdf
    там в приложении "B" описано большинство MSR (но не все, как мы могли убедиться)
     
  12. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    хехе, какие баги, такие и фиксы.

    В аттаче на всяк случай модуль с моей MB, cpuid парсит на 11F3h, код для твоего 0F2xh -- на 1100h. Глянул оригинальный биос -- там тоже всё ок, биос afair был датирован декабрь-2005.
     
  13. apple_rom

    apple_rom Роман

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    34
    Адрес:
    Минск
    Не обязательно. Производитель может предоставить готовый код, а не инфу. Подобное легко проверяется - смотрим биосы различных вендоров, ежели код один и тот же, значит именно так и есть. Если (сильно) отличается - пишут сами по NDA-даташитам.
     
  14. Kirillxskynet

    Kirillxskynet New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2006
    Сообщения:
    30
    Вот бы раздобыть эту документацию. Подписать с Intel NDA-соглашение врядли получится )
    Кстати, недокументированные регистры касаются не только процессора, но и чипсетов. В оффициальных даташитах многие регистры чипсетов "Reserved Intel", а bios при загрузке к ним обращается.