disasm videobios

Тема в разделе "WASM.BEGINNERS", создана пользователем yoric, 4 авг 2006.

  1. yoric

    yoric Yoric

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    14
    Адрес:
    Kotchukov
    Здравствуйте!

    Подскажите, пож-ста, кто может: пытаюсь дизассемблировать видеоБИОС (GF6800, IDAPro5.0), есть там такая конструкция в самомо начале:

    seg000 segment byte public '' use16
    assume cs:seg000

    seg000:0000 word_0 dw 0AA55h ; Сигнатура БИОС плат расширения

    seg000:0003 jmp short loc_50 ; Точка входа

    seg000:0048 byte_48 db 0 ;XRef-ов полно, все типа "test cs:byte_48, хх"

    seg000:0050 loc_50 jmp loc_D4EF

    seg000:lol: 4EF loc_D4EF test cs:byte_48, 1

    jz

    Как я понимаю, cs:byte_48 указывает на word_0 (55h), только чего этим хотят проверить? Про изменения значения byte_48 ничего не нашёл в стандартных заголовках, он сам по себе, этим кодом в него, вроде, ничего не пишется...
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    А он что грузится по 0000:0000 ?
     
  3. yoric

    yoric Yoric

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    14
    Адрес:
    Kotchukov
    В память-то? Не знаю... Что посоветуете почитать вкупе с pci21.pdf&vbecore3.pdf?
    Непонятно, где находится PCI Configuration Space.
     
  4. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Я разбирал давно video bios с GeForce FX5200 (глючила в text-mode со шрифтами 8 на 14, нвидиа пи#$%&сы) . Там на ROM header XREF'ы только на байт размера модуля (в 512-байтовых страницах который). Все остальные -- от вы#$онов Иды, вроде call cs:[si+1] где она сдуру решала что +1 -- это offset второго байта в ROM header'е.

    Начинать там лучше не с точки входа в POST init, а с entrypoint'a int 10h. Найти точку входа в int 10h можно в IDT, но там оно скорее всего будет перехвачено и возможно понадобится потрейсить отладчиком. Есть альтернативный способ -- недалеко от начала кода POST-инициализации (т.е. если идти c ROM entrypoint'a -- ROM:0003) есть характерная процедура иниц-ии векторов и указателей:
    Код (Text):
    1. init_ints_and_BDA proc near     ; CODE XREF: VBIOS:E6D6p
    2.         pushf           ; DS = 0
    3.         cli
    4.         mov word ptr ds:40h, offset NVBIOS_EntryPoint
    5.         mov word ptr ds:42h, cs
    6.         mov word ptr ds:7Ch, offset Font_8_by_8
    7.         mov word ptr ds:7Eh, cs
    8.         mov word ptr ds:108h, 0F065h ; orig Int10h handler
    9.         mov word ptr ds:10Ah, 0F000h
    10.         mov word ptr ds:10Ch, offset CharTable
    11.         mov word ptr ds:10Eh, cs
    12.         mov word ptr ds:1B4h, offset NVBIOS_EntryPoint
    13.         mov word ptr ds:1B6h, cs
    14.         mov word ptr ds:4A8h, offset VSPT
    15.         mov word ptr ds:4AAh, cs
    16.         popf
    17.         retn
    18. init_ints_and_BDA endp
    NVIOS_Entrypoint и есть точка входа в int 10h.

    Байт по смещению 48h -- это как в моей, так и в твоей прошивке, набор флагов, управляющий работой прошивки. Он, очевидно, предназначен для манипулирования прошивкой без ее рекомпиляции, т.е. для патча разработчиками для своих целей вроде тестирования/отладки и тп. В частности он влияет на проверку контрольной суммы модуля -- бит 0 (test byte48, 1). В моей прошивке все флаги были сброшены в 0.
     
  5. yoric

    yoric Yoric

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    14
    Адрес:
    Kotchukov
    _BC_
    Что за IDT? Какая-то IDTable? Описана где-нибудь?

    _BC_
    Не понял, что потрейсить отладчиком? Как БИОС отрабатывает на реальном железе? Это же невозможно?
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Interrupt Descriptor Table. Описание читаем в мануалах по защищенному режиму.
    Команды для работы с ней - lidt, sidt.
     
  7. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    мм, по-моему ты рановато за это взялся.
    IDT = таблица прерываний (c 0000:0000 в real-mode/V86).

    Трассировать перехваченный int10h не надо -- из фрагмента видно, что нвидиа, как и остальные, хранит указатель на оригинальный обработчик int10h в векторе int 6Dh.
    Трассировать видеобиос или драйвера видеокарт (типа nvmini.vxd) вообще само по себе потрясающее занятие кстати. ;)
     
  8. yoric

    yoric Yoric

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    14
    Адрес:
    Kotchukov
    Не думал, что это всё так глубоко зарыто...:dntknw: Ткни меня, пож-ста, носом, где "из фрагмента видно, что нвидиа, как и остальные, хранит указатель на оригинальный обработчик int10h в векторе int 6Dh." Может, есть какие материалы по этому поводу (исходники, например, кроме nv15_bios_sources.zip?) Именно по теме видеоБИОСов, общего плана у меня есть.
     
  9. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Код (Text):
    1. mov    word ptr ds:40h, offset NVBIOS_EntryPoint   <-- int 10h, будет перехвачен
    2. mov    word ptr ds:42h, cs
    3. ...
    4. mov    word ptr ds:1B4h, offset NVBIOS_EntryPoint  <-- int 6Dh, останется нетронутым
    5. mov    word ptr ds:1B6h, cs
    Вот еще цитата с Р. Брауна:
     
  10. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    2yoric
    А ты посмотри внимательнее, можут быть где-то в коде это флажок (byte_48) изменяется? Тогда ты можешь из констекста понять его смысл.
     
  11. yoric

    yoric Yoric

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    14
    Адрес:
    Kotchukov
    Ой, давно я тут не был. Не уведомляет по почте что-то...:dntknw:

    Понятно, из иходников nv15_bios_sources видно, что оно модифицируется после загрузки кода в ОЗУ (если только), в общем, проехали. Так а исходников БИОС для nv40 и подобного никто нигде не встречал?

    ; These locations are the DDC Read/Write ports
    ; ***********************************************************

    org 048h
    ; dword 0 ; 4 bytes
    public Internal_Flags
    Internal_Flags label byte
    db 00000001b ; BIOS Internal flags
    ; ^^^^^^^^
    ; | | | | | | |+------- Engineering Release
    ; +++++++-------- Reserved
    ;

    public Internal_Flags2
    Internal_Flags2 label byte
    db 00000000b ; BIOS Internal Flags #2
    ; ^^^^^^^^
    ; | | | | | | |+------- Disable Head A SR1[5] on DFP
    ; | | | | | |+-------- Use IRET instead of RETF on NoSTIHandler
    ; ++++++--------- Reserved

    dw 0 ; 2 bytes
    dword 0 ; 4 bytes

    Каокй-то синтаксис не такой. dword - я так понимаю, это dd?
     
  12. yoric

    yoric Yoric

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    14
    Адрес:
    Kotchukov
    А это что за BAD ADDR, просветите?

    seg000:5F1D 000 push bp
    seg000:5F1E 002 mov bp, sp
    seg000:5F20 002 db 83h,0C4h,0C8h ; <BAD>add sp, 0FFC8h
    seg000:5F23 002 imul eax, 0Ah
    seg000:5F27 002 mov [bp-16h], eax
    seg000:5F2B 002 mov dword ptr [bp-26h], 0FFFFh
    seg000:5F33 002 mov byte ptr [bp-34h], 0Dh
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Уезжал тему не заметил.
    yoric
    А какой смысл дизассемблировать биос?
    Сам долго в нем не ковырялся. Сразу нашел таблиц tblHandlerVESA - список точек входа в функции vesa. На этом и остановился.
    Зачем исходники БИОС когда, есть драверя для линукса. (Copyright 2003 NVIDIA, Corporation. All rights reserved.)
    http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/hw/xfree86/drivers/nv/

    Да dword это dd.
    DDC это конал связи с монитором. Там I2C интерфейс. По этому каналу видео карта получает информацию о мониторе. И по немуже может управлять различными настройками монитора.
     
  14. yoric

    yoric Yoric

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    14
    Адрес:
    Kotchukov
    Pavia
    Так оно это, без драйверов (в линукс-консоли, в досе, до загрузки ОС) вентилятор работает на полных оборотах, воет, изнашивается, на нервы действует. Под драйвером- обороты управляются в соответствии с таблицами производительности (ТП). Хочу сбросить обороты без драйверов.

    Pavia
    Да это-то находится, но мне не надо. Прекрасно видны ТП, но не вижу к ним обращений. Из исходников nvclock:

    /* Fanspeed code for Geforce6800 hardware */
    float nv40_get_fanspeed()
    {
    /* Bit 26-16 of register 0x10f0 control the voltage for the pwm signal generator in 0.1%
    / that is connected to the fan. By changing the value in the register the duty cycle
    / can be controlled so that the fan turns slower or faster.
    / The value stored in the registers needs to be inverted, so a value of 10% means 90% and so on.
    */
    float fanspeed = (1000 - ((nv_card.PMC[0x10f0/4] >> 16) & 0x3ff))/10;
    return fanspeed;
    }

    Вот в БИОСе не найду никак обращений к порту 10f0.

    Pavia
    Даже в драйверах для линукса от самой NVidia в исходниках только видеорежимы, более тонкие настройки в виде *.o, дизассемблировать который ещё мрачнее БИОСа.
     
  15. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    yoric
    Это не порт, это регистр отоброженный в память.
    Но я думаю что можно и через порты достучаться, скорее всего весит на I2C.
     
  16. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    yoric
    Посмотри файл I2C.C помойму там есть все что тебе нужно.
     
  17. yoric

    yoric Yoric

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    14
    Адрес:
    Kotchukov
    Попробую, спасибо за мысль.
     
  18. yoric

    yoric Yoric

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    14
    Адрес:
    Kotchukov
    А всё таки что это за <BAD>add sp, 0FFC8h, просветите? In ProblemList в IDA этого нету. Не смогла проинтерпретировать код, а потом подхватила как ни в чём не бывало?

    seg000:5F1E 002 mov bp, sp
    seg000:5F20 002 db 83h,0C4h,0C8h ; <BAD>add sp, 0FFC8h
    seg000:5F23 002 imul eax, 0Ah