⌨ Labor omnia vincit ☮

[Nouveau] Tester wanted: Timing management

Posted in hacking, Linux Kernel by anaumov on 16.10.2010


Трое ребят работают над созданием свободного драйвера для nVidia карточек, а именно – над таймингами чипов. Так как спецификации закрыты, они решили обратиться за помощью к сетевому сообществу. Им нужна помощь в reverse engineering’е vBIOSов nVidia видеокарт, для получения данных об их таймингах.

Если у тебя nVidia карточка, ты можешь помочь им, предоставив некоторую инфу о начинке своей видяхи.

Краткое пояснение основных понятий, которые помогут понять суть процесса, можно найти тут. Лицензию nVidia можно найти тут

2.1.3 Limitations.

No Reverse Engineering. Customer may not reverse engineer, decompile, or disassemble the SOFTWARE, nor attempt in any other manner to obtain the source code.

No Separation of Components. The SOFTWARE is licensed as a single product. Its component parts may not be separated for use on more than one computer, nor otherwise used separately from the other parts.

No Rental. Customer may not rent or lease the SOFTWARE to someone else.

Если вкратце, то этот единственный пункт, где говориться о Reverse Engineering, нас не касается, т.к. все что описанно в этой статье, относится только к HARDWARE.

Let’s go! Get source code

Итак, с чего начнем? Во-первых нам нужна программа vbtracetool:

> git clone git://anongit.freedesktop.org/~stuart/vbtracetool

Для сборки просто делаем

> make

Если не собирается, анализируем вывод make, заглядываем в исходник… У меня например компилятор не нашел pci/pci.h. Поэтому я доустановил pciutils-devel:

> sudo zypper in pciutils-devel

После повторной сборки все ок:

-rwxr-xr-x 1 alex users 237872 2010-10-15 23:52 vbtracetool*

Теперь нам нужна peek. Исходники тут:

> git clone git://0x04.net/pgtest

В openSUSE 11.1 make у меня не сработал (хотя gcc -std=gnu99 должен сработать), собрал ручками:

> gcc libio.c -o libio.o -c
> gcc libpg.c -o libpg.o -c
> gcc peek.c libpg.o libio.o -o peek -g -Wall -lpciaccess

В итоге получаем бинарник. Запускаем:

> ./peek 0x0
00000000: 04b300b1

Аха, нам нужны второй и третий символ с лева. В моем случае это 4b.

Dump the VBIOS

Теперь возвращаемся к vbtracetool:

> ./vbtracetool -w 2> nvXX_vbios.rom
Using card 10de:0393 on 0400
Nvidia card -- using PROM/PRAMIN BIOS
Using card memory region at 0xfd000000
Attempting to locate BIOS image in PROM... appears to be valid

Вывод перенаправляем в nvXX_vbios.rom. Файл бинарный:

> file nvXX_vbios.rom
nvXX_vbios.rom: BIOS (ia32) ROM Ext. IBM comp. Video (120*512)

Get your card’s strap

Теперь снова идем к peek и проверяем что у нас в ячейке 0x00101000:

> ./peek 0x00101000 > nvXX_strap_peek
> file nvXX_strap_peek
nvXX_strap_peek: ASCII text
> cat nvXX_strap_peek
00101000: a340fe87

Get the currently selected timings

Так, вспоминаем какая у нас карточка. Если ее серия попадает в диапазон адресов от NV40 до NVC0, то считываем 32 байта начиная с адреса 0x100220. У меня это NV4B, так что:

> ./peek 0x100220 0x20 > nvXX_timing_peek
> file nvXX_timing_peek
nvXX_timing_peek: ASCII text
> cat nvXX_timing_peek
00100220: 06101e16 0d010805 24230606 5312f405
00100230: 00000c1f 01e6a677 001e0311 00000031

Если же адреса старше чем NVC0 (AKA Fermi), то читаем 32 байта, но уже начиная с 0x10f220.

Так, и на последок давайте получим таблицу таймингов нашего vBIOS. Для этого нам нужна программа nvbios. Найти ее можно здесь:

> git clone git://github.com/pathscale/envytools

Собираем:

> make

Теперь копируем наш .rom-файл, полученный раньше, в папку с бинарником nvbios и запускаем его:

> pwd
/home/alex/hack/vbtracetool
> l *rom
-rw-r--r-- 1 root root 61440 2010-10-16 00:45 nvXX_vbios.rom
> ..
> cp vbtracetool/nvXX_vbios.rom envytools/
> ./nvbios nvXX_vbios.rom > nvXX_vbios_parsed
> l nvXX_vbios_parsed
-rw-r--r-- 1 root root 98222 2010-10-16 00:46 nvXX_vbios_parsed
> file nvXX_vbios_parsed
nvXX_vbios_parsed: ASCII text

Это текстовый файл, в конце которого должна быть тайминг-таблица.

Thanks a lot 🙂

Итак, в итоге мы получили 4 файла: nvXX_vbios_parsed, nvXX_vbios.rom, nvXX_strap_peek и nvXX_timing_peek. Выслав их на martin.peres at ensi-bourges dot fr ты удовлетворишь интерес Мартина по поводу начинки vBIOS’а твоей видяхи nVidia. Так же будет здорово, если ты приложишь вывод lspci -vnn

4 Responses

Subscribe to comments with RSS.

  1. stepa said, on 18.10.2010 at 02:59

    peek не компилится.
    gcc libio.c -o libio.o -c вроде нормально отрабатывает,
    а после

    gcc peek.c libpg.o libio.o -o peek -g -Wall -lpciaccess
    gcc: libpg.o: Нет такого файла или каталога
    peek.c: In function ‘main’:
    peek.c:17:4: warning: suggest parentheses around assignment used as truth value
    peek.c:16:6: warning: suggest explicit braces to avoid ambiguous ‘else’

    Make тоже не компилит.

    • Alex said, on 18.10.2010 at 10:41

      Да, у меня тоже 2 warning было.

      После gcc libio.c -o libio.o -c, если нет ошибок, какой-нить новый файл появляется?

      Какой дистрибутив?

  2. stepa said, on 18.10.2010 at 10:47

    opensuse11.3
    Появляется только libio.o
    А libpg.o нету и вылазит ошибка:
    gcc: libpg.o: Нет такого файла или каталога


Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.