Что бы разобраться, в чем дело открыл бутблок в ИДА.
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 можно дальше использовать.
Это SMRAM, там располагаются все Power Management процедуры.
В SMRAM находится x86-код, его можно "достать"?
У меня уже была идея, сделать переход на свою процедуру, которая найдёт wakeup vector и сделает переход.
Надо только знать в каком состоянии должен быть процессор.
Надо поковырять другой АМИ, с которым работает, я с АВАРД много не работал. А АМИ иногда слишком умные.
Кстати, есть где описание MSR атлона?
Точно также как и Windows, и любая другая ОС.
Можно - либо распаковать модуль BIOS, либо скопировавть "ручками" несложной программулькой.
www.amd.com
Дай пожалуйста ссылку на материал по SMM. Тема интересная. У меня те же чипы, та же проблема. Только материнка ноутбучная. Хочу присоединиться к теме.
...
http://www.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 странные.
Ну, явно не запуском на Вашей плате. :) Распаковать модуль из BIOS проще да и прямое чтение из SMRAM не часто востребовано.
Notebook, modul ID = 0Ah.
Ну можно было предположить, что снято на плате с АМИ.
Ну кому как, мне иногда проще сделать дамп. А то надо найти модуль и место. Глаз у меня ещё не тот.
А за модуль спасибо (модуль Notebook, никогда бы не подумал, хотя вроде вроде что-то было с Power Management), значит не надо будет портачить в бутблоке. Дома посмотрю.