|
楼主 |
发表于 2004-7-20 20:54:20| 字数 2,667| - 中国–北京–北京 中国科学院研究生院
|
显示全部楼层
不再出现报错界面,然而那烦人的声音仍然存在。让我们继续向下分析。
Dell Latitude 会报Processor Microcode Update Failure错误,它是怎么实现的呢?
原来,CPU还提供了检测微代码是否升级成功的功能,我们继续向下搜索,找到其位置如下,从7CCC9H开始是检测升级是否成功的功能。
0000:7CCAF mov al, 0E9h
0000:7CCB1 out 70h, al ; CMOS Memory:
0000:7CCB3 xor al, al
0000:7CCB5 out 71h, al ; CMOS Memory: used by real-time clock
0000:7CCB7 mov al, 0F8h
0000:7CCB9 out 70h, al ; CMOS Memory:
0000:7CCBB in al, 71h ; CMOS Memory
0000:7CCBD and al, 70h
0000:7CCBF mov ah, al
0000:7CCC1 mov al, 0F8h
0000:7CCC3 out 70h, al ; CMOS Memory:
0000:7CCC5 mov al, ah
0000:7CCC7 out 71h, al ; CMOS Memory: used by real-time clock
0000:7CCC9 xor eax, eax
0000:7CCCC xor edx, edx
0000:7CCCF mov ecx, 8Bh ;IA32_BIOS_SIGN_ID
0000:7CCD5 wrmsr
0000:7CCD7 mov eax, 1
0000:7CCDD cpuid
0000:7CCDF mov ecx, 8Bh
0000:7CCE5 rdmsr
0000:7CCE7 mov ax, dx
0000:7CCE9 or ax, ax
0000:7CCEB jnz loc_CCF7
0000:7CCED mov al, 0E9h
0000:7CCEF out 70h, al ; CMOS Memory:
0000:7CCF1 in al, 71h ; CMOS Memory
0000:7CCF3 or al, 10h
0000:7CCF5 out 71h, al ; CMOS Memory: used by real-time clock
0000:7CCF7 mov al, 0
0000:7CCF9 out 0Dh, al ; DMA controller, 8237A-5. master clear.
0000:7CCF9 ; Any OUT clears the ctrlr (must be re-initialized)
0000:7CCFB out 0DAh, al
0000:7CCFD out 8, al ; DMA 8237A-5. cmd reg bits:
0000:7CCFD ; 0: enable mem-to-mem DMA
0000:7CCFD ; 1: enable Ch0 address hold
0000:7CCFD ; 2: disable controller
0000:7CCFD ; 3: compressed timing mode
0000:7CCFD ; 4: enable rotating priority
0000:7CCFD ; 5: extended write mode; 0=late write
0000:7CCFD ; 6: DRQ sensing - active high
0000:7CCFD ; 7: DACK sensing - active high
0000:7CCFF out 0D0h, al
0000:7CD01 mov al, 0Ch
0000:7CD03 out 61h, al ; PC/XT PPI port B bits:
0000:7CD03 ; 0: Tmr 2 gate to spkr enable. OR 03H=spkr ON
0000:7CD03 ; 1: spkr enable. AND 0fcH=spkr OFF
0000:7CD03 ; 3: 1=read high switches
0000:7CD03 ; 4: 0=enable RAM parity checking
0000:7CD03 ; 5: 0=enable I/O channel check
0000:7CD03 ; 6: 0=hold keyboard clock low
0000:7CD03 ; 7: 0=enable kbrd
0000:7CD05 mov al, 0
0000:7CD07 out 8Fh, al ; DMA page register 74LS612: refresh
0000:7CD09 mov al, 54h
0000:7CD0B out 43h, al ; Timer 8253-5 (AT: 8254.2).
0000:7CD0D mov al, 12h
0000:7CD0F out 41h, al ; Timer 8253-5 (AT: 8254.2).
0000:7CD11 lgdt qword ptr cs:loc_CDF7+1
0000:7CD18 lidt qword ptr cs:loc_CDFD+1
0000:7CD1F mov eax, cr0
0000:7CD22 or al, 1
0000:7CD24 mov cr0, eax
0000:7CD27 jmp far ptr 8:0CD2Ch
我简要解释一下,详细过程可以参考上述文献1)的第9章和附录B。
xor eax, eax
xor edx, edx
mov ecx, 8Bh ;IA32_BIOS_SIGN_ID
wrmsr
mov eax, 1
cpuid
mov ecx, 8Bh
rdmsr
如果升级成功,则EDX中的数值为非0,0表示升级失败。
mov ax, dx
or ax, ax
jnz loc_CCF7
如果升级成功,则直接跳到FCCF7H处。跳过的代码有:
mov al, 0E9h
out 70h, al ; CMOS Memory:
in al, 71h ; CMOS Memory
or al, 10h
out 71h, al
据此,我们可以猜想IO地址70H和71H存放着与微码相关的信息。
然而,IBM PC AT/XT对地址70H和71H是这样定义的:
70H:CMOS RAM Address port and NMI Mask
Bit 7: NMI Mask.1-disable
Bit [0-6]: CMOS RAM Address.
71H: RTC CMOS RAM date port.
0000:7CD01 mov al, 0Ch
0000:7CD03 out 61h, al ; PC/XT PPI port B bits:
这两句是我们特别关心的,因为它与声音的设置有关。我们可以搜索out 61h, al的二进制代码E661来确定对声音的操作。对地址61H前两位(bit)的操作属于对声音的操作。
这里的设置是将声音关掉。出现了不正常声响,肯定有某处不小心打开了声音。我们继续搜索类似的语句。查询的结果共有22处,其中,处在0FC000H-0FFFFFH的共有两处。另外一处位于0FD5AEH。 |
|