Код (Text): mov ecx,2Ch rdmsr mov ebx,eax bt eax,14h jnb m1 mov al,38h out 70h,al pause pause in al,70h cmp al,1Ch jbe m2 mov al,1Ch out 71h,al m2: jmp m3 ... насколько я понял 2Ch - регистр в котором содержится информация о частоте системной шины, но вся проблема в том что здесь читается 20-вй бит(14h), а в документации Intel напиисано, что он reserved. За что он отвечает? Может кто сталкивался? Далее, 70h - индексный регистр CMOS'а, и насколько я знаю чтение из него запрещено(возможно только в alt mode).
забавный фрагмент, у MSR 2Ch везде, где он есть, бит 20 в резервед попадает. С 70h тоже странный стафф -- даже если предположить, что altacc включен, то все равно странный код. А что у тебя за система? Фрагмент бы лучше в виде копи-пасте с листинга заслал, а не в своей переработке. -------- хм, похоже на undoc fields. На сэндпайле чел какой-то постил, (предположительно интеловец, т.к. он же там постил инфу про различение инженерных sample'ов процев интел): Код (Text): | But i haven't found info about p4 multipliers. I know that these | info are stored in the MSR 0x2C for northwood and 0x2A for willy, | but I don't know how these info are stored. Can anyone help me? if CPUID < 0F20h... MSR 2Ah bits 11...8 = ratio 0h = 16x/16x ; 1st is for A/B step, 2nd is for C step 1h = 17x/17x 2h = 18x/18x 3h = 19x/19x 4h = 20x/20x 5h = 21x/21x 6h = 22x/22x 7h = 23x/24x 8h = 08x/08x 9h = 09x/23x Ah = 10x/10x Bh = 11x/11x Ch = 12x/12x Dh = 13x/13x Eh = 14x/14x Fh = 15x/15x MSR 2Ch bits 23...21 = bus speed (read-only) 000b=100 MHz if CPUID >= 0F20h... MSR 2Ch bits 21...24 = ratio (read-only) MSR 2Ch bit 21 = SpeedStep supported (read-only) MSR 2Ch bit 20 = frequency locked (read-only) MSR 2Ch bits 18...16 = bus speed (read-only) 000b=100, 001b=133, 010b=200, 011b=166 MHz MSR 2Ch bits 15...8 = low ratio delta (read-only) lowest ratio = bits 7...0 - bits 15...8 MSR 2Ch bits 7...0 = highest ratio (read-only)
это код моего амишного биоса (система:Pentium 4 2.4Ghz HT with 512Kb L2 0.13 micron, мать Asus P4P800, intel 865PE chipset). файл биоса могу выслать тебе на мыло. Этот кусок кода находится в самом начале, дизассемблируй и сразу на него наткнешься. Что по поводу того парня с sendpile, то это я читал, интересно откуда у него такая информация? Видимо Intel по каким-то причинам до конца не выдает все секреты архитектуры своего творения. Я думаю многим было бы очень интересно докопаться до правды. Так что вопрос остается открытым...
высылать не надо, у меня тоже как раз 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): disub_read_cmos_38h: ; CODE XREF: p5gd1pro:0DC5j ; p5gd1pro:0F15j ... mov al, 38h ; '8' out 70h, al ; CMOS Memory: ; pause pause in al, 71h ; CMOS Memory cmp al, cs:_1Ch jbe short skip_1 mov al, 0FFh out 71h, al ; CMOS Memory: skip_1: ; CODE XREF: p5gd1pro:0B7Cj clc jmp di Собственно в ячейке 38h данный амибиос хранит значение множителя -- далее по коду сравнивается с минимальным и максимальным значениями коэффициента (т.е. из undoc полей), если оказывается, что множитель вылезает за рамки приличия -- вместо него используется максимальный ratio из MSR 2Ch.
ты прав, такой возможности может и не быть но что интерсно, далее я наткнулся на следующий порт, о котором вообще никакой инфы нету (или может я не нашел?) Код (Text): F000:8D5E loc_F8D5E: ; CODE XREF: F000:8D56j F000:8D5E ; F000:8D5Aj F000:8D5E mov bx, dx F000:8D60 mov ecx, 2Dh F000:8D66 rdmsr F000:8D68 mov ax, bx F000:8D6A wrmsr F000:8D6C jmp loc_F00D1 что еще за "2Dh"??? Видимо, разработчикам биосов Intel выдает более подробные мануалы, другого объяснения таким вещам сложно придумать. По поводу 70h, уверяю, я не ошибся. Да действительно, сначала с помощью cpuid мы определяем модель процессора в системе: Код (Text): F000:8C20 CPU_init: ; CODE XREF: F000:0140j F000:8C20 xor eax, eax F000:8C23 cpuid F000:8C25 cmp ebx, 756E6547h ; "Genu" F000:8C2C jnz not_Intel ; di = 143h F000:8C30 invd ; очистка кеш-памяти первого уровня и генерация сигнала на очистку F000:8C30 ; кэш-памяти второго уровня F000:8C32 mov eax, 1 F000:8C38 cpuid F000:8C3A and ax, 0FF0h ; обнулим степпинг F000:8C3D cmp ax, 0F20h ; model 2 - Pentium 4 0.13 micron F000:8C40 jb model_1 ; ниже? F000:8C44 cmp ax, 0F30h ; model 3 - Pentium 4 0.09 micron F000:8C47 jb short model_2 для моего проца в ax будет 0F2xh (степпинг я не помню), и вот что получаем на метке model_2: Код (Text): F000:8CB8 model_2: ; CODE XREF: F000:8C47j F000:8CB8 mov ecx, 2Ch F000:8CBE rdmsr F000:8CC0 mov ebx, eax F000:8CC3 bt eax, 20 ; 20-ый бит в cf F000:8CC8 jnb short loc_F8CE4 ; cf=0? F000:8CCA F000:8CCA loc_F8CCA: ; CODE XREF: F000:8C59j F000:8CCA mov al, 38h F000:8CCC out 70h, al ; CMOS Memory: F000:8CCE pause F000:8CD0 pause F000:8CD2 in al, 70h ; CMOS Memory F000:8CD4 cmp al, cs:byte_F0DBC ;cs:byte_F0DBC = 1Ch F000:8CD9 jbe short loc_F8CE1 F000:8CDB mov al, cs:byte_F0DBC F000:8CDF out 71h, al ; CMOS Memory: F000:8CE1 F000:8CE1 loc_F8CE1: ; CODE XREF: F000:8CD9j F000:8CE1 jmp model_1 И еще откуда у тебя такая информация?
но факт, что где-то есть и с незаблокированными множителями, иначе бы амибиос не ветвился по locked-биту. Может как раз на тех самых инженерных образцах. MSR 2Dh... мда, это уже ни в какие ворота не лезет. Это уже конкретный намек на то, что по крайней мере по MSR-регистрам у биосдевелоперов есть доки получше общедоступных мануалов. У меня (P4, cpuid(1)-->0F43h) этот MSR отсутствует. Код (Text): F000:8CCA mov al, 38h F000:8CCC out 70h, al ; CMOS Memory: F000:8CCE pause F000:8CD0 pause F000:8CD2 in al, 70h ; CMOS Memory F000:8CD4 cmp al, cs:byte_F0DBC ;cs:byte_F0DBC = 1Ch F000:8CD9 jbe short loc_F8CE1 Код (Text): mov al, 38h ; '8' out 70h, al ; CMOS Memory: pause pause in al, 71h ; CMOS Memory cmp al, cs:_1Ch jbe short skip_1 классно, значит бага в сорцах биоса. Получается что в твоем биосе этот фрагмент будет всегда читать 0FFh (altacc там выключен) с 70h и получать 1Ch в результате. Но, т.к. множитель у обычных моделей залочен, то вся эта возня как-то по барабану и эта опечатка никак не должна проявиться. Может поэтому они и не слишком напрягались с proof-reading'ом данного кода. Попробуй кстати скачать с сайта асуса свежий биос на свою MB, может там пофиксено это. У меня биос новый, надо будет как-нть глянуть оригинальный дамп, может там тоже эта опечатка есть (но в принципе она роли не играет).
Разобрался с 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): ; bl = new ratio mov ecx, 2Dh rdmsr mov al, bl mov ah, bl wrmsr Насчет же приватных док для биосдевелоперов... На 99% уверен, что разблокированные множители есть только на инженерных образцах процев. Отсюда вывод, что массовому потребителю процев про них знать незачем. Но т.к. разработчики делают MB в т.ч. и под эти самые инженерные сэмплы -- на такое благое дело интел делится с ними описаниями MSR-регистров engineering sample'ов. Так и просачиивается до народа инфа о регистрах типа 2Ch, который присутствует и на обычных процах. Но если MSR 2Dh вдруг всплывет на mobile-процах, то это уже будет бл..во.
Скачал, посмотрел, вот как переделали этот кусок в новой версии: Код (Text): F000:8EF4 loc_F8EF4: ; CODE XREF: F000:8DF7j F000:8EF4 mov ecx, 2Ch F000:8EFA rdmsr F000:8EFC mov ebx, eax F000:8EFF bt eax, 20 F000:8F04 jnb short loc_F8F15 F000:8F06 mov al, 38h F000:8F08 out 70h, al ; CMOS Memory: F000:8F08 ; F000:8F0A pause F000:8F0C pause F000:8F0E mov al, 0FFh F000:8F10 out 71h, al ; CMOS Memory: F000:8F10 ; F000:8F12 jmp loc_F8FCB получается что так называемый баг: Код (Text): F000:8CD2 in al, 70h ; CMOS Memory F000:8CD4 cmp al, cs:byte_F0DBC F000:8CD9 jbe short loc_F8CE1 F000:8CDB mov al, cs:byte_F0DBC заменили на одну команду mov al,0FFh и все. Но раньше в al заносилось значение 1Ch, а теперь 0FFh.
_BC_ <Самый интересный вопрос -- откуда узнали об этих битах девелоперы AMI? Ведь одно дело знать, а другое дело -- вот так использовать в коде биосов, ведь уверены на 100% значит. Как будто бы для них отдельные мануалы интел писали... > Да стопудов они этой инфой владеют, получают от производителя. В этом интерес обеих сторон. Иначе глюк получится а не железо, а это потеря бабок, что никому ненужно.
http://www.intel.com/design/processor/manuals/253669.pdf там в приложении "B" описано большинство MSR (но не все, как мы могли убедиться)
хехе, какие баги, такие и фиксы. В аттаче на всяк случай модуль с моей MB, cpuid парсит на 11F3h, код для твоего 0F2xh -- на 1100h. Глянул оригинальный биос -- там тоже всё ок, биос afair был датирован декабрь-2005.
Не обязательно. Производитель может предоставить готовый код, а не инфу. Подобное легко проверяется - смотрим биосы различных вендоров, ежели код один и тот же, значит именно так и есть. Если (сильно) отличается - пишут сами по NDA-даташитам.
Вот бы раздобыть эту документацию. Подписать с Intel NDA-соглашение врядли получится ) Кстати, недокументированные регистры касаются не только процессора, но и чипсетов. В оффициальных даташитах многие регистры чипсетов "Reserved Intel", а bios при загрузке к ним обращается.