Denverton C3000 TCO 功能验证
①清除General Control寄存器中的No Reboot位。
②往TCO_TMR寄存器第0-9位写入计时值。
③清除TCO1_CNT寄存器中的第11位TCO_TMR_HALT。
④往TCO_RLD寄存器中的第0-9位TCO_RLD写入任意值,重装计时。
第①步:
a.访问GC寄存器,其Host Memory Space为SBREG_BAR + 0xCF0000 + Ch。
b.查找SBREG_BAR,其位于Bus:0 Device:31 Function:1设备Offest为0x10h和0x14h的地方。代码中会将此设备隐藏,所以在OS下使用lspci -tv ,你会发现找不到此Primary to Side Band (P2SB) Bridge。那如何访问到其配置空间呢?
c.查找BIOS代码,发现将PCH_PCR_BASE_ADDRESS(0xfd000000)写到SBREG_BAR中。
d. 所以General Control所在内存地址为0xFD000000 + 0xCF0000 + C = 0xFDCF000C。清除此内存地址的Bit 0,即当TCO 第二次计时结束后,机器重启功能被使能。
第②步:
a.访问TCO_TMR寄存器,是IO寄存器,Offset是[TCO_BASE] + 12h。
b.TCOBASE位于Bus:0 Device:31 Function:4 Offset:50h ,读取出来为400h。
c.所以TCO_TMR寄存器位于IO空间412h的地方。往Bit0-9写入计时值。
第③步:
同理,TCO1_CNT寄存器位于IO空间408h的地方,往Bit11 写0,使能计时功能。
第④步:
往IO空间400h地方Bit0-9写入任意值,重装入计时值到TCO_TMR计时器中。
备注:在Denverton实际验证过程中,使能计时器功能后,机器无法进行操作,所以执行第③步后,等待第二次超时到,机器就重启了。在Broadwell-DE SoC执行第③步后,貌似可以继续操作。
在Uefi Shell下验证如下:
附隐藏P2SB相关寄存器: