Проблема с S3(STR), AMI BIOS Reverse Engineering

На плате MSI MS-6380 (KT333+8233, AMIBIOSCORE700) не работает Suspend to RAM под линуксом (под Win2000 работает).
Что бы разобраться, в чем дело открыл бутблок в ИДА.

                                                   jnz     POST_14         ; jmp if not STR
F000:DA13 B0 11                                   mov     al, 11h         ; POST 11
F000:DA13                                                                 ; Next, checking if End or Ins keys were pressed
F000:DA13                                                                 ; during power on.Initializing CMOS RAM if the
F000:DA13                                                                 ; Initialize CMOS RAM in every boot AMIBIOS POST
F000:DA13                                                                 ; option was set in AMIBCP or the End key was pressed
F000:DA15 BE 1B DA                                mov     si, 0DA1Bh
F000:DA18 E9 49 02                                jmp     debug_80
....
                                     POST_13:                                ; DATA XREF: seg000:off_FDAE6o
F000:DAE8 B0 13                                   mov     al, 13h
F000:DAEA BE F0 DA                                mov     si, offset loc_FDAF0 ; STR WakeUp routine?
F000:DAED E9 74 01                                jmp     debug_80
F000:DAF0                         ; ---------------------------------------------------------------------------
F000:DAF0
F000:DAF0                         loc_FDAF0:                              ; DATA XREF: seg000:DAEAo
F000:DAF0 EA 97 80 00 B0                          jmp     far ptr 0B000h:8097h ; STR WakeUp routine?
F000:DAF5                         ; ---------------------------------------------------------------------------
F000:DAF5
F000:DAF5                         POST_14:                                ; CODE XREF: seg000:DA0Fj
F000:DAF5 B0 14                                   mov     al, 14h         ; 8254 timer test will begin next
F000:DAF7 BE FD DA                                mov     si, 0DAFDh
F000:DAFA E9 67 01                                jmp     debug_80

После старта проверяется модус из которого вышел ПК, если не S3, переход (jnz POST_14) к POST_14.

В другом случае исполняется POST 11-13.
И доходит до F000:DAF0 jmp far ptr 0B000h:8097h.
Теперь вопрос.
0B000h:8097 это Video-RAM, или там находится STR WakeUp routine? В ДОС эта область вроде исползуется(смотрел с debug.exe).
У кого есть идеи почему не работает в линуксе? Принцип одинаковый (в FACS записывается WakeUp vektor и т. д.). Или линукс затирает 0B000h:хххх?
Ещё вопрос. Как считает АМИ чексум бутблока? Я пока нашел, что после копирования всех 256кб, проверяется 32-бит-сумма этих 256кб, если не так, то переход к POST E0 (bootblock recovery). Это единствинная проверка?

Ещё просьба, если есть наработки по Reverse Engineering, выложите их. А то сколько раз велосипед изобретается снова, и ещё разных моделей.

Я сам собираюсь выложить, когда время будет (в принципе ничего особенного), например:

write_PCI:                              ; CODE XREF: seg000:D94Fj
; seg000:D97Bj
                db      66h             ; Function: write dword to PCI
                bswap   edx             ; Input: DX = Dev. and Func.
                                        ; AH = register; ECX = value
                                        ; Destroy: EAX (Highword o.),
                                        ; EDX (Highword only)
                mov     dx, ax
                db      66h
                bswap   edx
                mov     al, 80h ; '�
                mov     ah, dh
                db      66h
                bswap   eax
                mov     ah, dl
                db      66h
                bswap   edx
                mov     al, dh
                and     al, 0FCh
                db      66h
                bswap   edx
                mov     dx, 0CF8h
                out     dx, eax
                shr     eax, 8
                mov     dx, 0CFCh
                xchg    eax, ecx
                out     dx, eax
                xchg    eax, ecx
                db      66h
                bswap   edx
                xchg    ax, dx
                jmp     di

Обратите внимание на bswap и xchg, запутаешся, зато AX и DX можно дальше использовать.

Аватар пользователя apple_rom

Цитата:
0B000h:8097 это Video-RAM, или там находится STR WakeUp routine?
Это SMRAM, там располагаются все Power Management процедуры.

Скачал материал по SMM, получается a0000-bffff SMRAM (параллельно с VRAM). Линукс вроде SMM не использует, регистры востанавливаются вручную.
В SMRAM находится x86-код, его можно "достать"?
У меня уже была идея, сделать переход на свою процедуру, которая найдёт wakeup vector и сделает переход.
Надо только знать в каком состоянии должен быть процессор.
Надо поковырять другой АМИ, с которым работает, я с АВАРД много не работал. А АМИ иногда слишком умные.
Кстати, есть где описание MSR атлона?

Аватар пользователя apple_rom

Цитата:
Линукс вроде SMM не использует
Точно также как и Windows, и любая другая ОС.
Цитата:
В SMRAM находится x86-код, его можно "достать"?
Можно - либо распаковать модуль BIOS, либо скопировавть "ручками" несложной программулькой.
Цитата:
Кстати, есть где описание MSR атлона?
www.amd.com

*** Oep
Дай пожалуйста ссылку на материал по SMM. Тема интересная. У меня те же чипы, та же проблема. Только материнка ноутбучная. Хочу присоединиться к теме.

Аватар пользователя apple_rom

Цитата:
0B000h:8097
00008097: jmp  00000A0EA
...
0000A0EA: mov  ax,0A000
0000A0ED: mov  es,ax
0000A0EF: mov  di,01000
0000A0F2: mov  ax,03000
0000A0F5: mov  ds,ax
...
0000A192: mov  ax,0F440
0000A195: call Get_PCI
0000A198: mov  edx,ebp
0000A19B: jmp  0F000:0FFF0
0000A1A0: retn

TO SWmail:
rcollins.org/ddj/Mar97/Mar97.html
Там много чего интересного. Всякие там "Developer’s Manual" можно найти через Гугл.

Открывал биос от MSI 865pe-neo2-p(бутблок 64КБ, ужас), тот же jmp far ptr 0B000h:8097h.
Открывал биос от Asus A7V133(AWARD), с которым работает без всякого колдовства.
После АМИ трудновато (многое знакомо), у АМИ открываеш 16КБ бутблока, проходиш его, контроль


переходит к Runtime Interface, Runtime Interface распаковывает Runtime, контроль переходит к Runtime ...
В АВАРД, начало F000:E0xx, потом ROMCALL F000:3xxx ... S3 Resume пока не нашёл.

Я пробовал посмотреть (это был бы лёгкий путь) по адресу B000h:8097h, сразу после STR,
там была какая-то чепуха. Всякие там видео биос видно, а это нет. Читал, что затирается,
наверное чтоб враги не узнали.

А код добыт распаковыванием биоса?
В каком модуле, это делается? Откуда куда копируется/распаковывается?
Конец не интересен,

0000A19B: jmp  0F000:0FFF0

это должен быть soft reset, если S3 resume, не удалось.
А адреса 0000AXXX странные.

Аватар пользователя apple_rom

Цитата:
А код добыт распаковыванием биоса?
Ну, явно не запуском на Вашей плате.:) Распаковать модуль из BIOS проще да и прямое чтение из SMRAM не часто востребовано.
Цитата:
В каком модуле, это делается?
Notebook, modul ID = 0Ah.

Цитата:
Ну, явно не запуском на Вашей плате.

Ну можно было предположить, что снято на плате с АМИ.
Цитата:
Распаковать модуль из BIOS проще...

Ну кому как, мне иногда проще сделать дамп. А то надо найти модуль и место. Глаз у меня ещё не тот.

А за модуль спасибо (модуль Notebook, никогда бы не подумал, хотя вроде вроде что-то было с Power Management), значит не надо будет портачить в бутблоке. Дома посмотрю.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • You can use BBCode tags in the text. URLs will automatically be converted to links.

Подробнее о форматировании текста

Антибот - введите цифру.
Ленты новостей