aascut Понятия не имею и никогда не видел - погуглил паттерны - ничего нет (82h - 86h-85h-..., out/in). Нужно смотреть в каком контексте идет с ними работа (что ожидается после и до).
PSR1257II Мыли в слух: допустим идет перечисление ("запись" в "регистр 85h") значений: al= 06,07,08,09,0A,0B,0C,0D,0E,0F,10h.Для остальных "регистров" 86h,84h,82h "значения для записи" одинаковые и не меняются.-10h последнее значение al для 85h "регистра", больше этот код не используется. Для каждого вызова (CALL) свой -номер. По виду чем то напоминают номера прерываний IRQ??
aascut Если вы имеете в виду что этот блок что-то типа инициализации контроллера прерываний или какая-то хитрая методика открытия линий прерывания ... мне нет, не напоминают. Я бы сначала попробовал (как уже сказал): 0) Понять в каком контексте вызываются эти функции. Допустим: call Init_KeyBoard call Init_HDD call YourStrangeSub ; Here is your weird code call Init_Mouse - в этом случае можно делать выводы. 1) Что еще делается непосредственно до и после вашего кода. Допустим: YourStrangeSub proc call DisableInterrupts call DoSomethingElse call ReadMSRRegisters ... call SomeStringsRefs ... call WriteIntoRegister85h ; Here we go! ... call EnableInterrupts ... В этом случае можно предположить что это инициализация какого-то устройства но НЕ (выше) hdd, mouse, keyboard. Это устройство использует прерывания. Параметры BIOS держит в MSR регистрах - интересуемся что обычно содержится именно в этих ячейках. Может быть также (debug) SomeStringsRefs - если повезет - некие сообщения в самом модуле. BIOS же рапортует в SETUP о разных состояниях, верно? Может быть XREFs на вашу Sub и в процедуре вывода информации о машине.
PSR1257II Извиняюсь за задержку с ответом, но LPC протокол пока подождет разберусь чуть позже, когда наберется достаточно статистики обращений к этому модулю. Сейчас никак не могу понять куда ведет этот jump-JMP cs:word_F645A[bx]: cs-текущий сегмент кода word_F645A-смещение а вот дальше [bx]=допустим [08] как это интерпритировать? Код (Text): F000:6442 000 0F B6 DC movzx bx, ah ; Move with Zero-Extend F000:6445 000 03 DB add bx, bx ; bx=2*ah(): данные в ah если F000:6445 ; 1)ah=04->bx=08; F000:6445 ; 2)ah=05->bx=0A; F000:6445 ; 3)ah=06->bx=0C; F000:6445 ; 4)ah=07->bx=0E; F000:6445 ; 5)ah=08->bx=10; F000:6445 ; 6)ah=09->bx=12; F000:6445 ; 7)ah=0A->bx=14; F000:6445 ; 8)ah=0B->bx=16; F000:6447 000 0F 20 C0 mov eax, cr0 ; Move to/from Special Registers F000:644A 000 66 25 FF FF FF 9F and eax, 9FFFFFFFh ; reset bits30,29=0- F000:644A ; L1 Cash enable F000:6450 000 0F 22 C0 mov cr0, eax ; write cr0=00000010-L1 cash enable F000:6453 000 2E FF A7 5A 64 JMP cs:word_F645A[bx]; Indirect Near Jump .... F000:645A 000 D7 64 word_F645A dw 64D7h ; DATA XREF: sub_F63D8+7Br F000:645C 000 6C 64 dw 646Ch F000:645E 000 74 64 dw 6474h F000:6460 000 A4 9C dw 9CA4h F000:6462 000 96 64 dw 6496h F000:6464 000 7E 64 dw 647Eh F000:6466 000 74 64 dw 6474h F000:6468 000 58 64 dw 6458h F000:646A 000 78 64 dw 6478h .... Добавление: Разобрался с этим. Операция с массивом.
"Все пропало шеф!". Погрузился в SMM и тут засада да еще какая! Мозг взрывается. Кто знает о "режиме" и работе в нем ИДы. Как ее правильно настроить, что бы она верно интерпретировала код. Вопросы: 1. Кто знает как правильно прочитать это: Код (Text): A000:0234 BA F8 0C mov dx, 0CF8h A000:0237 ED in ax, dx ; read config address port 0CF8h, A000:0237 ; ax=xxxx(what is last device was config?) В литературе не нашел, но явно не то что я написал в комменте. 2. Собственно SMM. Код сегмент FEDA0000 отображается на 000A0000.Но там же (000A0000) находится видео. Проц переключился в P-mode. Код (Text): Входим: A000:0000 ; --------------------------------------------------------------------------- A000:0000 Second SMI HANDLER START: Attantion!! A000:0000 all accesses to addresses FEDA0000-FEDABFFF A000:0000 will be redirected to addresses 000A0000-000ABFFF A000:0000 DS, ES, FS, GS, SS Selectors =0000H A000:0000 DS, ES, FS, GS, SS Bases= 000000000H A000:0000 DS, ES, FS, GS, SS Limits= 0FFFFFFFFH A000:0000 ; =========================================================================== A000:0000 A000:0000 ; Segment type: Pure code A000:0000 A000 segment byte public 'CODE' use16 A000:0000 assume cs:A000 A000:0000 ; START OF FUNCTION CHUNK FOR sub_FAB8F A000:0000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing A000:0000 A000:0000 loc_A0000: ; CODE XREF: sub_FAB8F-E594EJ A000:0000 000 EB 11 jmp short loc_A0013 ; Jump A000:0000 ... прыгаем-> A000:0013 loc_A0013: ; CODE XREF: sub_FAB8F:loc_A0000j A000:0013 000 FA cli ; Clear Interrupt Flag A000:0014 A000:0014 loc_A0014: ; Load Interrupt Descriptor Table Register A000:0014 db 66h ; from address cs=FED98000+offset=8098; A000:0014 000 66 2E 0F 01 1E 98 80 lidt fword ptr cs:byte_A8098 ; =FEDA0098=000A0098:value=000000000000: A000:0014 000 ; IDT address base=0000:0000,limit=1 bytes A000:001B A000:001B loc_A001B: ; Load Global Descriptor Table Register A000:001B db 66h ; from address cs=FED98000+offset=8034; A000:001B 000 66 2E 0F 01 16 34 80 lgdt fword ptr cs:byte_A8034 ; =FEDA0034=000A0034:value=FEDA00400058: A000:001B 000 ; GDT address base=A000:0040,limit=58 bytes A000:001B ; A000:0022 000 0F 20 C0 mov eax, cr0 ; Move to/from Special Registers A000:0025 000 0C 01 or al, 1 ; Logical Inclusive OR A000:0027 000 0F 22 C0 mov cr0, eax ; Protect Mode Enable! A000:002A 000 66 EA 00 02 DA FE 08+ jmp large far ptr 8:0FEDA0200h ; selector=08-#1(0-10) from GDT A000:002A 000 00 ; =00CF9F000000FFFF; A000:002A ; address base=00000000 A000:002A ; limit FFFFFx1000 A000:002A ; flags:G=1(4kb lim),D=1-32bits A000:002A ; AVL=00-segment dis.for system A000:002A ; software used; A000:002A ; P=1-seg/enable in mem A000:002A ; DPL=00-privilege level=0(high) A000:002A ; S=1-code/data segment A000:002A ; Type=1111-code,CDA=111-Execute/ A000:002A ; Read-Only, conforming, accessed A000:002A ; jump to A000:0200 A000:002A A000:002A ; END OF FUNCTION CHUNK FOR sub_FAB8F .... прыгаем-> A000:0200 ; --------------------------------------------------------------------------- A000:0200 SMI HANDLER #2 A000:0200 ; START OF FUNCTION CHUNK FOR sub_FAB8F A000:0200 A000:0200 loc_A0200: ; CODE XREF: sub_FAB8F-5AB65J A000:0200 000 EB 1A jmp short near ptr unk_A021C ; Jump A000:0200 A000:0200 ; END OF FUNCTION CHUNK FOR sub_FAB8F A000:0200 ; -------------------------------------------------------------------------- ...прыгаем ->Куда? остаемся ли мы в коде SMM или прыгаем в Видео?: ... (Здесь уже появляется засада с "66" если его игнорировать, то все вроде правильно если включать в дизассеблирование, то получается фигня какая-то) A000:021C 66 unk_A021C db 66h ; f ; CODE XREF: sub_FAB8F:loc_A0200j A000:021D ; --------------------------------------------------------------------------- A000:021D B8 10 00 mov ax, 10h A000:0220 8E D8 mov ds, ax ; ds=0010,selector=10-#2 in GDT A000:0220 ; =00CF92000000FFFF: A000:0220 ; address base=00000000 A000:0220 ; limit=FFFFFx1000h A000:0220 ; flags:G=1(4kb lim),D=1-32bits A000:0220 ; AVL=00-segment dis.for system A000:0220 ; software used; A000:0220 ; P=1-seg/enable in mem A000:0220 ; DPL=00-privilege level=0(high) A000:0220 ; S=1-code/data segment A000:0220 ; Type=0010-Data,EWA=010-Read/Write A000:0220 ; A000:0222 assume ds:nothing A000:0222 8E C0 mov es, ax ; es=0010,selector=10-#2 in GDT A000:0222 ; =00CF92000000FFFF: A000:0222 ; address base=00000000 A000:0222 ; limit=FFFFFx1000h A000:0222 ; flags:G=1(4kb lim),D=1-32bits A000:0222 ; AVL=00-segment dis.for system A000:0222 ; software used; A000:0222 ; P=1-seg/enable in mem A000:0222 ; DPL=00-privilege level=0(high) A000:0222 ; S=1-code/data segment A000:0222 ; Type=0010-Data,EWA=010-Read/Write A000:0222 ; A000:0224 assume es:nothing A000:0224 8E E8 mov gs, ax ; gs=0010,selector=10-#2 in GDT A000:0224 ; =00CF92000000FFFF: A000:0224 ; address base=00000000 A000:0224 ; limit=FFFFFx1000h A000:0224 ; flags:G=1(4kb lim),D=1-32bits A000:0224 ; AVL=00-segment dis.for system A000:0224 ; software used; A000:0224 ; P=1-seg/enable in mem A000:0224 ; DPL=00-privilege level=0(high) A000:0224 ; S=1-code/data segment A000:0224 ; Type=0010-Data,EWA=010-Read/Write A000:0224 ; A000:0226 8E E0 mov fs, ax ; fs=0010,selector=10-#2 in GDT A000:0226 ; =00CF92000000FFFF: A000:0226 ; address base=00000000 A000:0226 ; limit=FFFFFx1000h A000:0226 ; flags:G=1(4kb lim),D=1-32bits A000:0226 ; AVL=00-segment dis.for system A000:0226 ; software used; A000:0226 ; P=1-seg/enable in mem A000:0226 ; DPL=00-privilege level=0(high) A000:0226 ; S=1-code/data segment A000:0226 ; Type=0010-Data,EWA=010-Read/Write A000:0226 ; A000:0226 A000:0226 ; --------------------------------------------------------------------------- A000:0228 66 db 66h ; f A000:0229 ; --------------------------------------------------------------------------- A000:0229 B8 18 00 mov ax, 18h A000:022C 8E D0 mov ss, ax ; selector=0011=#3(0-10)in GDT A000:022C ; =00CF92000000FFFF: A000:022C ; address base=00000000 A000:022C ; limit=FFFFFx1000h A000:022C ; flags:G=1(4kb lim),B=1-32bits A000:022C ; AVL=00-segment dis.for system A000:022C ; software used; A000:022C ; P=1-seg/enable in mem A000:022C ; DPL=00-privilege level=0(high) A000:022C ; S=1-code/data segment A000:022C ; Type=0010-Data,EWA=010-Read/Write A000:022E BC 60 1C mov sp, 1C60h ; set stack poit ss:sp=0000:1C60 A000:0231 0E push cs ; save cs=FED98000;???? A000:0231 прилагаю файлик, открывать в ИДе. Зы:А как файл прикрепить че-то никак не могу?
aascut Немного о порте 0xCF8: Код (Text): X_Get_Ct: CONFIG_ADDR EQU 0cf8h mov ax,8000H ;enable PCI config. shl eax,16 mov ax,cx and al,NOT 03h ;32 bit access for PCI mov dx,CONFIG_ADDR ;index is 0cf8h out dx,eax add dl,4 ;start from 0cfch mov al,cl and al,03h add dl,al ;byte index to read in al,dx ret X_Set_Ct: xchg ax,cx shl ecx,16 ;save value xchg ax,cx ;restore cx mov ax,8000H ;enable PCI config. shl eax,16 mov ax,cx and al,NOT 03h ;32 bit access for PCI mov dx,CONFIG_ADDR ;index is 0cf8h out dx,eax add dl,4 ;start from 0cfch mov al,cl and al,03h add dl,al ;byte index to read mov eax,ecx shr eax,16 out dx,al ret При переключении по #SMI проц переключаецца на обработчег SMM, но вот память совершенно другая, хотя адреса совпадают с видео. Надо отметить что (примерно) A0000 (или A8000) - это уже переопределенный обработчик (дефолт - 30000h). В IDA грузить как обычно - как BIOS.
30000 это видимо начальная точка инициализации SMM, я рассматривал этот вопрос достаточно много раз и всегда SMM убирается оттуда. Убирается он в 3 места: A_seg - a0000h - bffffh H_seg - feda0000 - fedbffffh T_seg - тут сложнее, n-ое число мегабайт до Top of memory вроде. (Могу путать), информация о том куда отображается коднахосится в регистрах PCI. так же определить адрес можно посмотрев таблицу дескрипторов, у меня машина тупо загружала дескриптор с базой h_seg. Для IDA SMM код надо грузить изначально как 16битный код. Вопрос затенения smm видеопамяти можете не ставить во главу угла, он появляется только когда код остается в A_seg.
PSR1257II! acckiitvar! Спасибо за инфу! Вот это и мне никак не понять. Вот как я думаю. Когда проц переключился в SMM у него появляется своя память SMRAM куда он сохраняет свой контент. Эта память не возникает ниоткуда, эта таже DRAM только она не видна никому кроме проца. Проц эту SMRAM память видит как 0-FFFF:FFFF или нет. Или только узкий диапазон адресов 000A:0000-000B:FFFF. + Н segment +T-segment(если они определены)? или он видит только 0003:0000-00037FFF (000A:0000-000A:7FFF; FEDA0000-FEDA7FFF)как SMRAM. D мануалах Интела написано что проц имеет доступ ко всему адресному пространству в режиме SMM. В Этом адресном пространстве проц видит тот же код BIOS в DRAM памяти или оно для него пустое? Или процу кажется что оно пустое а в нем видно только SMI обработкик ? Извиняюсь за сумбур. Насчет PCI я в курсе, однако в моем вопросе был код который противоречит спецификации PCI, поэтому я и спросил, мож кто сталкивался. К примеру регистр 0CF9h: все знают, что он перезагружает систему (поправка не систему а процессор), а 0СF8h тогда что за штука может быть?
SMRAM находится в озу по указанным мной адресам. И не доступна для процессора в любом режиме кроме смм. При попытке чтения вы увидите FF (кроме случая открытия памяти SMRAM, это возможно только патчем биос записи в 1 из регистров PCI. Извините что без конкретики, документации нет под рукой). Обычно операционная система даже и не подразумевает о наличии у нее SMRAM, поэтому туда и не пытается писать. Если же вы находитесь в SMI, то вы увидите там код и данные. Также вы увидите физическую память системы и то что в нее отображено, именно физическую, в Смм трансляция адресов, paging отключены. И вы можете внести изменения в память. Там стоит другой вопрос, что зная виртуальный адрес вы не знаете физический и вычислить его сложно. CR4 при входе в смм обнуляется. CF9 перезагружает систему? не знал. 0feh в 64h порт и нет системы. Через регистр CF8 указывается адрес на шине PCI куда будет обращение. Более подробно погугли, также почитай Салихана BIOS разработка, модификация, дизассемблирование.
acckiitvar Совершенно верно. Но допустим мы используем плоскую(линейную) модель. Находимся в SMM, загружаем дескрипторы таблиц IDT, GDT, определяем сегменты. Вот эти сегменты отображается на физ.память так как определено в таблицах? Собственно в этом весь вопрос. Еще спрошу про РОНы- их состояние изменяется при входе, ну то есть можем ли мы быть уверены, что значения РОНов остануться прежними, как до входа в SMM или они тоже обнуляются? Ну да, в интелах так,только надо туда нужное значение записать, в АМД не знаю. Скачал Салихана, оказывается я его уже читал , но видимо надо перечитать. Спасибо еще раз.
Именно, если вы определите сегмент, то именно его и получите в озу. Вообще SMM это даже не знаю как сказать, помесь BRM с Unreal mode. то есть из реального режима можно исполнять код где хочешь и адресовать 4 Гб озу. Честно говоря не проверял, изменяется ли их состояние. Скорее всего да, вроде слышал что в eax, передается какой то параметр, но не факт. Знаю только что SMM прозрачен для системы, роны сохраняются и восстанавливаются при входе и выходе из SMM.
Вот накопал тут кое что: CSE - Configuration Space Enable register Address 0CF8h default 0h Attributes of R / W bits 7:4 =0000 normal mode =1000 config mode, access to PCI read / write cycles 3:1-number function is, for multi-function PCI devices So plug-in cards, for example, the a VGA and an Ethernet have, therefore, multiple PCI devices onto an address 0 - reserved Can appeal to the area at all about C000 and to program the PCI devices must therefore bits 7 En- be set. TRC-turbo-reset control register Address 0CF9h default 0h Attributes of R / W bits 7:4 reserved 3 -enable BIST, CPU self-test release 2 -CPU reset, this bit is reset the CPU 1 -CPU reset enable, chooses hard or soft reset 0 - Deturbo mode is set, this bit can be a CPU mode Deturbo be triggered in conjunction with DFC (Deturbo-mode frequency control register) that is, the CPU by software down-clocked. FORW - Forward Register Addresse 0CFAh default 0h Attribute R/W bits 7:0 -PCI-Bus number, PCI bus number, the number of the bus' for system with more than one PCI bus. Is well on PCs hardly occur
aascut ++ - В SMI вы можете менять память PM/RM (прерванный код) а также менять (возвращать) любые значения в любых регистрах. И менно так и работает связь: сервисная DLL (example ~acpi.sys) <-> SMM Handler; - Код SMI не виден по дефолту но (как было сказано) читать его можно, например: call X_Ct_Disable_SMI_I810 call X_Ct_Enable_APMC_I810 call End_Pmi_Handler_I810 call Ct_Open_SM_RAM_I810 ;Enable SMRAM to access call Get_SMI_Code X_Ct_Disable_SMI_I810 proc near mov cl,30h call X_Get_PMIO and al,not 1 call X_Set_PMIO ret X_Ct_Disable_SMI_I810 endp X_Ct_Enable_APMC_I810 proc near mov cl,30h call X_Get_PMIO or al, 20h call X_Set_PMIO ret X_Ct_Enable_APMC_I810 endp End_Pmi_Handler_I815 proc near ;PM1 status mov cl,00h call X_Get_PMIO call X_Set_PMIO ;clear status mov cl,01h call X_Get_PMIO call X_Set_PMIO ;clear status ;GPE0 status mov cl,28h call X_Get_PMIO call X_Set_PMIO ;clear status mov cl,29h call X_Get_PMIO call X_Set_PMIO ;clear status ;GPE1 (GPI) status mov cl,2ch call X_Get_PMIO call X_Set_PMIO ;clear status mov cl,2dh call X_Get_PMIO call X_Set_PMIO ;clear status ;SMI status mov cl,34h call X_Get_PMIO call X_Set_PMIO ;clear status mov cl,35h call X_Get_PMIO call X_Set_PMIO ;clear status ;IOTRAP status mov cl,41h call X_Get_PMIO call X_Set_PMIO ;clear status mov cx,64h call X_Get_PMIO call X_Set_PMIO mov cx,65h call X_Get_PMIO call X_Set_PMIO ret End_Pmi_Handler_I815 endp ... ... - Если обработчег SMI установил бит запрещения чтения SMM памяти то нельзя открыть ее на чтение любыми средствами из не-SMM кода НО дампить ее все равно можно через всякие трики типа: SMM активно пользуется своим же BIOS'ом, зовет из него код. Далее достаточно перезаписать BIOS (не программатором конечно и форсировать #SMI - такой, что будет вызван именно этот участок BIOS; ...
Праздники закончились -пора продолжить. acckiitvar PSR1257II Огромное спасибо за помощь. Однако ИДА оказалась бессильна перед SMM кодом PHOENIX 1998-2006. Вернее сказать не бессильна а импотентна. Не берет этот код, выдает полную ахинею. Ручками очень сложно править, да я и особо не знаю как. Может настройки в ИДЕ какие-то надо подправить. По поводу РОНов нашел все-таки инфу, что состояние их считается неопределенным при переходе, следовательно SMM-код их должен заново переопределить. Вот самое начало, дальше я так и не продвинулся: Код (Text): A000:0000 ; --------------------------------------------------------------------------- A000:0000 Second SMI HANDLER START: Attantion!! A000:0000 all accesses to addresses FEDA0000-FEDABFFF A000:0000 will be redirected to addresses 000A0000-000ABFFF A000:0000 DS, ES, FS, GS, SS Selectors =0000H A000:0000 DS, ES, FS, GS, SS Bases= 000000000H A000:0000 DS, ES, FS, GS, SS Limits= 0FFFFFFFFH A000:0000 ; =========================================================================== A000:0000 A000:0000 ; Segment type: Pure code A000:0000 A000 segment byte public 'CODE' use16 A000:0000 assume cs:A000 A000:0000 ; START OF FUNCTION CHUNK FOR sub_FAB8F A000:0000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing A000:0000 A000:0000 loc_A0000: ; CODE XREF: sub_FAB8F-E594EJ A000:0000 004 EB 11 jmp short loc_A0013 ; Jump A000:0000 A000:0000 ; END OF FUNCTION CHUNK FOR sub_FAB8F *пока читаемо, смотрим дальше: --------------------------------------------------------------------------- A000:0013 SMI HANDLER #2 A000:0013 ; START OF FUNCTION CHUNK FOR sub_FAB8F A000:0013 A000:0013 loc_A0013: ; CODE XREF: sub_FAB8F:loc_A0000j A000:0013 004 FA cli ; Clear Interrupt Flag A000:0014 A000:0014 loc_A0014: ; Load Interrupt Descriptor Table Register A000:0014 db 66h ; from address cs=FED98000+offset=8098; A000:0014 004 66 2E 0F 01 1E 98 80 lidt fword ptr cs:byte_A8098 ; FEDA0098=000A0098: value=000000000000: A000:0014 004 ; IDT address base=0000:0000,limit=1 bytes A000:001B A000:001B loc_A001B: ; Load Global Descriptor Table Register A000:001B db 66h ; from address cs=FED98000+offset=8034; A000:001B 004 66 2E 0F 01 16 34 80 lgdt fword ptr cs:byte_A8034 ; = 000A0034:value=FEDA00400058: A000:001B 004 ; GDT address base=A000:0040,limit=58 bytes A000:001B ; A000:0022 004 0F 20 C0 mov eax, cr0 ; Move to/from Special Registers A000:0025 004 0C 01 or al, 1 ; Logical Inclusive OR A000:0027 004 0F 22 C0 mov cr0, eax ; Protect Mode Enable! A000:002A 004 66 EA 00 02 DA FE 08+ jmp large far ptr 8:0FEDA0200h ; ; selector=08-#1(0-10) from GDT A000:002A 004 00 ; =00CF9F000000FFFF; A000:002A ; address base=00000000 A000:002A ; limit FFFFFx1000 A000:002A ; flags:G=1(4kb lim),D=1-32bits A000:002A ; AVL=00-segment dis.for system A000:002A ; software used; A000:002A ; P=1-seg/enable in mem A000:002A ; DPL=00-privilege level=0(high) A000:002A ; S=1-code/data segment A000:002A ; Type=1111-code,CDA=111-Execute/ A000:002A ; Read-Only, conforming, accessed A000:002A ; jump to A000:0200 A000:002A A000:002A ; END OF FUNCTION CHUNK FOR sub_FAB8F * здесь уже я вмешался ручками но пока минимально А дальше полный ужас: Код (Text): ИДА: A000:021C ; --------------------------------------------------------------------------- A000:021C A000:021C loc_A021C: ; CODE XREF: sub_FAB8F:loc_A0200j A000:021C 66 B8 10 00 8E D8 mov eax, 0D88E0010h A000:0222 8E C0 mov es, ax ; es=0010,selector=10-#2 in GDT A000:0222 ; =00CF92000000FFFF: A000:0222 ; address base=00000000 A000:0222 ; limit=FFFFFx1000h A000:0222 ; flags:G=1(4kb lim),D=1-32bits A000:0222 ; AVL=00-segment dis.for system A000:0222 ; software used; A000:0222 ; P=1-seg/enable in mem A000:0222 ; DPL=00-privilege level=0(high) A000:0222 ; S=1-code/data segment A000:0222 ; Type=0010-Data,EWA=010-Read/Write A000:0222 ; A000:0224 assume es:nothing, ds:nothing A000:0224 8E E8 mov gs, ax ; gs=0010,selector=10-#2 in GDT A000:0224 ; =00CF92000000FFFF: A000:0224 ; address base=00000000 A000:0224 ; limit=FFFFFx1000h A000:0224 ; flags:G=1(4kb lim),D=1-32bits A000:0224 ; AVL=00-segment dis.for system A000:0224 ; software used; A000:0224 ; P=1-seg/enable in mem A000:0224 ; DPL=00-privilege level=0(high) A000:0224 ; S=1-code/data segment A000:0224 ; Type=0010-Data,EWA=010-Read/Write A000:0224 ; A000:0226 assume gs:nothing A000:0226 8E E0 mov fs, ax ; fs=0010,selector=10-#2 in GDT A000:0226 ; =00CF92000000FFFF: A000:0226 ; address base=00000000 A000:0226 ; limit=FFFFFx1000h A000:0226 ; flags:G=1(4kb lim),D=1-32bits A000:0226 ; AVL=00-segment dis.for system A000:0226 ; software used; A000:0226 ; P=1-seg/enable in mem A000:0226 ; DPL=00-privilege level=0(high) A000:0226 ; S=1-code/data segment A000:0226 ; Type=0010-Data,EWA=010-Read/Write A000:0226 ; A000:0228 assume fs:nothing A000:0228 66 B8 18 00 8E D0 mov eax, 0D08E0018h A000:022E BC 60 1C mov sp, 1C60h ; set stack poit ss:sp=E000:1C60 A000:022E A000:022E ; --------------------------------------------------------------------------- A000:0231 0E 00 dw 0Eh Моя интерпритация: Код (Text): A000:021C 66 unk_A021C db 66h ; f ; CODE XREF: sub_FAB8F:loc_A0200j A000:021D ; --------------------------------------------------------------------------- A000:021D B8 10 00 mov ax, 10h A000:0220 8E D8 mov ds, ax ; ds=0010,selector=10-#2 in GDT A000:0220 ; =00CF92000000FFFF: A000:0220 ; address base=00000000 A000:0220 ; limit=FFFFFx1000h A000:0220 ; flags:G=1(4kb lim),D=1-32bits A000:0220 ; AVL=00-segment dis.for system A000:0220 ; software used; A000:0220 ; P=1-seg/enable in mem A000:0220 ; DPL=00-privilege level=0(high) A000:0220 ; S=1-code/data segment A000:0220 ; Type=0010-Data,EWA=010-Read/Write A000:0220 ; A000:0222 assume ds:nothing A000:0222 8E C0 mov es, ax ; es=0010,selector=10-#2 in GDT A000:0222 ; =00CF92000000FFFF: A000:0222 ; address base=00000000 A000:0222 ; limit=FFFFFx1000h A000:0222 ; flags:G=1(4kb lim),D=1-32bits A000:0222 ; AVL=00-segment dis.for system A000:0222 ; software used; A000:0222 ; P=1-seg/enable in mem A000:0222 ; DPL=00-privilege level=0(high) A000:0222 ; S=1-code/data segment A000:0222 ; Type=0010-Data,EWA=010-Read/Write A000:0222 ; A000:0224 assume es:nothing A000:0224 8E E8 mov gs, ax ; gs=0010,selector=10-#2 in GDT A000:0224 ; =00CF92000000FFFF: A000:0224 ; address base=00000000 A000:0224 ; limit=FFFFFx1000h A000:0224 ; flags:G=1(4kb lim),D=1-32bits A000:0224 ; AVL=00-segment dis.for system A000:0224 ; software used; A000:0224 ; P=1-seg/enable in mem A000:0224 ; DPL=00-privilege level=0(high) A000:0224 ; S=1-code/data segment A000:0224 ; Type=0010-Data,EWA=010-Read/Write A000:0224 ; A000:0226 assume gs:nothing A000:0226 8E E0 mov fs, ax ; fs=0010,selector=10-#2 in GDT A000:0226 ; =00CF92000000FFFF: A000:0226 ; address base=00000000 A000:0226 ; limit=FFFFFx1000h A000:0226 ; flags:G=1(4kb lim),D=1-32bits A000:0226 ; AVL=00-segment dis.for system A000:0226 ; software used; A000:0226 ; P=1-seg/enable in mem A000:0226 ; DPL=00-privilege level=0(high) A000:0226 ; S=1-code/data segment A000:0226 ; Type=0010-Data,EWA=010-Read/Write --------------------------------------------------------------------------- A000:0228 assume fs:nothing A000:0228 66 db 66h ; f A000:0229 ; --------------------------------------------------------------------------- A000:0229 B8 18 00 mov ax, 18h A000:022C 8E D0 mov ss, ax ; selector=0011=#3(0-10)in GDT A000:022C ; =00CF92000000FFFF: A000:022C ; address base=00000000 A000:022C ; limit=FFFFFx1000h A000:022C ; flags:G=1(4kb lim),B=1-32bits A000:022C ; AVL=00-segment dis.for system A000:022C ; software used; A000:022C ; P=1-seg/enable in mem A000:022C ; DPL=00-privilege level=0(high) A000:022C ; S=1-code/data segment A000:022C ; Type=0010-Data,EWA=010-Read/Write A000:022E BC 60 1C mov sp, 1C60h ; set stack poit ss:sp=E000:1C60 A000:022E --------------------------------------------------------------------------- A000:0231 0E 00 dw 0Eh A000:0233 66 db 66h ; f ; 32-bit registers
Т.к. переход в 32-битный код, тебе надо создать 32-битный сегмент начиная с A0200, с базой 0. Ида пытается дизассемблировать код как 16-битный и естественно получается бред.
reverser Огромное мерси, гениально, действительно помогло!!! acckiitvar Да именно так. Перед первым заходом в SMM Биос создает в памяти DRAM такой сегмент по адресу 3000:8000: Код (Text): Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00000000 66 2E C7 06 F8 FE 00 80 D9 FE BA 34 10 66 B8 20 f.Ç øþ ?Ùþº4 f¸ 00000010 00 00 00 66 EF BA 30 10 ED 0D 02 00 EF 0F AA 66 fïº0 í ï ªf Собственно- это обработчик первый (умолчальный) SMI#: Код (Text): _3000:8000 ; --------------------------------------------------------------------------- _3000:8000 ; =========================================================================== _3000:8000 _3000:8000 ; Segment type: Pure code _3000:8000 _3000 segment byte public 'CODE' use16 _3000:8000 assume cs:_3000 _3000:8000 ;org 8000h _3000:8000 ; START OF FUNCTION CHUNK FOR sub_FAB8F _3000:8000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing _3000:8000 _3000:8000 loc_38000: ; CODE XREF: sub_FAB8F-E59D6J _3000:8000 004 66 2E C7 06 F8 FE 00+ mov cs:dword_3FEF8, 0FED98000h ; SMBASE =FED98000 _3000:800A 004 BA 34 10 mov dx, 1034h _3000:800D 004 66 B8 20 00 00 00 mov eax, 20h ; ' ' _3000:8013 004 66 EF out dx, eax ; write eax=00000020 to _3000:8013 ; reg.off.34-37(BASE:1000) _3000:8013 ; PM SMI# STS register bits: _3000:8013 ; bit5=1-Bios clear APM_STS bit; _3000:8013 ; ->0 _3000:8013 ; _3000:8015 004 BA 30 10 mov dx, 1030h _3000:8018 004 ED in ax, dx ; read reg.off.30-31(BASE:1000) _3000:8018 ; PM SMI# control&enable reg. _3000:8018 ; ax= _3000:8018 ; _3000:8019 004 0D 02 00 or ax, 2 ; set bit1=1 _3000:801C 004 EF out dx, ax ; write ax=xxxxxxx1xb to _3000:801C ; reg.off.30-31(BASE:1000) _3000:801C ; bit1=1-EOS,SMI# will be _3000:801C ; de-asserted for 4-PCI Clocks _3000:801C ; and Proc.will _3000:801D 004 0F AA rsm ; jump far 1000:51BB _3000:801D _3000:801F db 66h _3000:801F 004 66 00 00 add [bx+si], al ; Add _3000:801F _3000:801F ; END OF FUNCTION CHUNK FOR sub_FAB8F Кажись не ошибся, этот обработчик меняет базу и только, а второй (обработчик)уже лезет в сегмент A000 на который стоит редирект в регистре MCH.
Появился свет в конце туннеля! Близок к разгадке, но надо еще кое-что проверить! "Истина где-то рядом"(С).Еще раз убеждаюсь в том, что нет мелочей, всяк бит в коде архи-важен! Добавление: Пришлось вернуться в самое начало бут-блока F000, где я прошелся по верхам и, по незнанию, проигнорировал некоторые моменты, а там все это прописано было: Код (Text): F000:4ACD ; --------------------------------------------------------------------------- F000:4ACD Super IO chip programm turn F000:4ACD F000:4ACD SIOi: ; CODE XREF: F000:429FJ F000:4ACD BA 2E 00 mov dx, 2Eh ; '.' F000:4AD0 B0 55 mov al, 55h ; 'U' F000:4AD2 EE out dx, al F000:4AD3 EE out dx, al ; ENTER CONFIGURATION MODE: ...... и вот оно родимое: F000:4AF2 B4 09 mov ah, 9 F000:4AF4 BA 2E 00 mov dx, 2Eh ; '.' F000:4AF7 B0 07 mov al, 7 F000:4AF9 EE out dx, al F000:4AFA 42 inc dx ; Increment by 1 F000:4AFB 8A C4 mov al, ah F000:4AFD EE out dx, al ; write 09 to reg.#07: F000:4AFD ; select Logical Device #9 F000:4AFD ; F000:4AFE BA 2E 00 mov dx, 2Eh ; '.' F000:4B01 B0 30 mov al, 30h ; '0' F000:4B03 EE out dx, al ; Logical Device #9,reg#30: F000:4B04 42 inc dx ; Increment by 1 F000:4B05 B0 01 mov al, 1 F000:4B07 EE out dx, al ; write 01 to reg.30- F000:4B07 ; activate Logical Device #9 F000:4B07 ; -Mailbox Registers F000:4B08 B8 10 09 mov ax, 910h F000:4B0B BA 2E 00 mov dx, 2Eh ; '.' F000:4B0E B0 60 mov al, 60h ; '`' F000:4B10 EE out dx, al ; Config mode: Logical Device #9 F000:4B10 ; -Mailbox Registers F000:4B11 42 inc dx ; Increment by 1 F000:4B12 8A C4 mov al, ah ; al=09; F000:4B14 EE out dx, al ; write I/O base address bits 15:8 F000:4B14 ; al=09 F000:4B15 B8 10 09 mov ax, 910h F000:4B18 8A E0 mov ah, al ; ah=10 F000:4B1A BA 2E 00 mov dx, 2Eh ; '.' F000:4B1D B0 61 mov al, 61h ; 'a' F000:4B1F EE out dx, al ; write I/O base address bits 7:0 F000:4B20 42 inc dx ; Increment by 1 F000:4B21 8A C4 mov al, ah F000:4B23 EE out dx, al ; write I/O base address bits 7:0 F000:4B23 ; al=10 F000:4B23 ; Base address for Mailbox F000:4B23 ; (Logical device#9)=910h Т.е. южник по LPC общается с SIO через так называемые регистры "почтовые ящики" , которые находятся в SIO(чип LPC47N354 в моем случае): регистр 82h-входящая почта для 8051, регистр 83h-исходящая от 8051 для ICH. Порт 910h - index, 911h-data. Ура-ура!!! Теперь бы понять что они друг дружке шепчут.
Поправьте если я заблуждаюсь. Согласно мануалу, при записи в майлбокс регистр, ЮМ выставляет прерывание 1 для 8051. Поковырявшись в прошивке нашел обработчик прерываний для 8051 (INT1). А так как я вообще не знаком с особенностями 8051, то расшифровать код дюже трудно. Единственное, что понятно- это регистры 7Fxx по мануалу можно расшифровать. И еще когда ЮМ записывает в 8051 команду (например 04h )- 8051 ее считывает и сбрасывает прерывание. Два порта один для записи команды в 8051 MBX82 , он же 7F08, чтение команды для ICH от 8051 происходит из MBX83, он же 7F09. Остальные майлбоксы MBX84-MBX91 (они же 7F0A-7F17 в 8051) и MBXA0-MBXAF (они же 7F70-7F7F в 8051) используются для передачи данных. Вопрос как интерпритировать команды ЮМ? Вот кусок кода обработчика: Код (Text): ; public IE1 IE1: ; External Interrupt 1 ljmp code_164 ... code_164: ; Interrupt Enable Register clr EA anl RESERVED00D8, #0x20 ; RESERVED clr TR1 ; Timer 0/1 Control Register clr ET1 ; Interrupt Enable Register clr ET1 ; Interrupt Enable Register ;читаем майлбокс #84: mov DPTR, #0x7F0A ; Move (Op1 <- Op2) movx A, @DPTR ; Move from/to external RAM Сравниваем с F1h: cjne A, #0xF1, code_182 ; '¸' ; Если не равно прыгаем-> code_182: ; Interrupt Enable Register mov IE, #0 mov IP, #0 ; Interrupt Priority Register mov TCON, #0 ; Timer 0/1 Control Register mov T2CON, #0 ; Timer 2 Control Register mov RESERVED00D8, #0 ; RESERVED mov RESERVED0091, #0 ; RESERVED mov DPTR, #0x7F01 ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM ;8051 Interrupt 1 Mask Register: mov DPTR, #0x7F03 ; Move (Op1 <- Op2), mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F2C ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F2D ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F5A ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F5F ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F66 ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F65 ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F56 ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F2A ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F2B ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F59 ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F5E ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F63 ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F64 ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F55 ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F00 ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F02 ; Move (Op1 <- Op2) mov A, #0xFF ; Move (Op1 <- Op2) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F19 ; Move (Op1 <- Op2) clr A ; Clear Operand (0) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F1C ; Move (Op1 <- Op2) clr A ; Clear Operand (0) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F1F ; Move (Op1 <- Op2) clr A ; Clear Operand (0) movx @DPTR, A ; Move from/to external RAM mov P0, #0 ; Port 0 mov P1, #0 ; Port 1 mov DPTR, #0x7FA2 ; Move (Op1 <- Op2) clr A ; Clear Operand (0) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7FA5 ; Move (Op1 <- Op2) clr A ; Clear Operand (0) movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7FA8 ; Move (Op1 <- Op2) clr A ; Clear Operand (0) movx @DPTR, A ; Move from/to external RAM clr P03 ; Port 0 mov DPTR, #0x7FA5 ; Move (Op1 <- Op2) movx A, @DPTR ; Move from/to external RAM clr ACC4 ; Accumulator movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F3E ; Move (Op1 <- Op2) movx A, @DPTR ; Move from/to external RAM setb ACC1 ; Accumulator movx @DPTR, A ; Move from/to external RAM mov DPTR, #0x7F22 ; Move (Op1 <- Op2) movx A, @DPTR ; Move from/to external RAM clr ACC6 ; Accumulator movx @DPTR, A ; Move from/to external RAM setb P05 ; Port 0 mov DPTR, #0x7FA8 ; Move (Op1 <- Op2) movx A, @DPTR ; Move from/to external RAM setb ACC3 ; Accumulator movx @DPTR, A ; Move from/to external RAM mov R7, #0x3E ; '>' ; Move (Op1 <- Op ..... + еще куски большие , задержки какие-то и т.д. -результат: code_37D: ; Port 1 setb P1.7 mov R5, #4 ; Move (Op1 <- 4 .. ÷ code_381: ; Decrement Operand and JNZ djnz R5, code_381 .. clr P1.7 ; Port 1 mov R5, #4 ; Move (Op1 <- O .. djnz R6, code_37D ; Decrement Oper ... mov DPTR, #0x393 ; Move (Op1 <- Op2) push DPL ; Data Pointer, Low Byte push DPH ; Data Pointer, High Byte reti ; Return from Interrupt ; End of function RESET Извиняюсь за сумбур,но че-то сомневаюсь, что я правильно настроил ИДУ, и интерпритировать код мне сложно, поможите если сможете. Да, еще прошу помощи так как ИДА выдала код в графах, что непривычно и неудобно читать, как избавиться от сего?