Broadwell 微架构上未记录的特定于模型的寄存器

逆向工程 x86-64 BIOS
2021-06-19 23:22:08

我正在尝试反转机器的 BIOS 来学习一些东西。我面临的更大问题是,在早期初始化期间,代码大量使用 MSR,而且大多数时候,我发现那些没有记录。

在这个 BIOS 的一个特定点,作为一个例子,我发现了这个功能:

0000F575                    sub_F575        proc near               
0000F575 60                                 pusha
0000F576 B8 01 00 00 00                     mov     eax, 1
0000F57B 0F A2                              cpuid
0000F57D C1 C8 04                           ror     eax, 4
0000F580 66 3D 6F 30                        cmp     ax, 306Fh       ; Haswell
0000F584 74 06                              jz      short HaswellBroadwellStuffs
0000F586 66 3D 6F 40                        cmp     ax, 406Fh       ; Broadwell
0000F58A 75 0E                              jnz     short NoNeed4IvyBridge
0000F58C
0000F58C                    HaswellBroadwellStuffs:
0000F58C B9 FC 01 00 00                     mov     ecx, 1FCh
0000F591 0F 32                              rdmsr
0000F593 0D 01 00 20 00                     or      eax, 200001h
0000F598 0F 30                              wrmsr
0000F59A
0000F59A                    NoNeed4IvyBridge:
0000F59A 61                                 popa
0000F59B E8 02 06 00 00                     call    DummyProc_1
0000F5A0 C3                                 retn
0000F5A0                    sub_F575        endp

仔细查看英特尔 64 位和 IA-32 架构软件开发人员手册第 4 卷:特定于模型的寄存器,我没有发现此 BIOS 所针对的HaswellBroadwellIvyBridge存在0x1fc寄存器的证据相反,对于不同的 Intel 版本,很少有关于此寄存器的文档:

  • 对于GoldmontNehalem,该寄存器名为MSR_POWER_CTL并且仅记录了第 1 位
  • 因为Sandy Bridge仍然被命名为MSR_POWER_CTL,但没有提供更多信息,它只是说参考http://biosbits.org,在那里没有找到任何有用的东西。
  • 对于SkylakeKaby LakeCoffee LakeCannon Lake数据表更加冗长;仍然命名为MSR_POWER_CTL并且出现了位:#1、#20 和 #21 的描述,仍然没有证据表明此函数中使用了位 #0 和 #21。

所以我的问题:如果有人知道我提到的登记册的信息,如果他/她想与我分享,那就太好了;更重要的是,如果有人能指导我找到有关此主题的可靠信息来源,而不是英特尔官方手册,我将不胜感激。

1个回答

此类低级寄存器的详细信息通常仅根据 NDA 披露给英特尔可信赖的合作伙伴,因为它们不打算由一般应用程序员访问,而只能由 BIOS 或其他系统级代码的编写者访问。也就是说,有时您可以在意想不到的地方找到信息......

#define MSR_POWER_CTL                           0x1FC
#define PCH_NEG_DISABLE                         (1 << 30)
#define PCH_NEG_DISABLE_SHIFT                   30
#define LTR_SW_DISABLE                          (1 << 29)  //LTR_IIO_DISABLE
#define LTR_SW_DISABLE_SHIFT                    29
#define PROCHOT_LOCK                            (1 << 27)
#define PROCHOT_LOCK_SHIFT                      27
#define PROCHOT_RESPONSE                    (1 << 26)
#define PROCHOT_RESPONSE_SHIFT              26
#define PWR_PERF_TUNING_CFG_MODE                (1 << 25)
#define PWR_PERF_TUNING_CFG_MODE_SHIFT          25
#define PWR_PERF_TUNING_ENABLE_DYN_SWITCHING    (1 << 24)
#define PWR_PERF_TUNING_ENABLE_DYN_SHIFT        24
#define PWR_PERF_TUNING_DISABLE_EEP_CTRL        (1 << 23)
#define PWR_PERF_TUNING_DISABLE_EEP_SHIFT       23
#define PWR_PERF_TUNING_DISABLE_SAPM_CTRL       (1 << 22)
#define PWR_PERF_TUNING_DISABLE_SAPM_SHIFT      22
#define DIS_PROCHOT_OUT                         (1 << 21)
#define DIS_PROCHOT_OUT_SHIFT                   21
#define EE_TURBO_DISABLE                    (1 << 19)
#define EE_TURBO_DISABLE_SHIFT              19
#define ENERGY_EFFICIENT_PSTATE_ENABLE          (1 << 18)
#define ENERGY_EFFICIENT_PSTATE_ENABLE_SHIFT    18
#define PHOLD_SR_DISABLE                        (1 << 17)
#define PHOLD_SR_DISABLE_SHIFT                  17
#define PHOLD_CST_PREVENTION_INIT               (1 << 16)
#define PHOLD_CST_PREVENTION_INIT_SHIFT         16
#define FAST_BRK_INT_EN                         (1 << 4)
#define FAST_BRK_INT_EN_SHIFT                   4
#define FAST_BRK_SNP_EN                         (1 << 3)
#define FAST_BRK_SNP_EN_SHIFT                   3
#define SAPM_IMC_C2_POLICY_EN                   (1 << 2)
#define SAPM_IMC_C2_POLICY_SHIFT                2
#define C1E_ENABLE                              (1 << 1)
#define C1E_ENABLE_SHIFT                        1
#define ENABLE_BIDIR_PROCHOT_EN                 (1 << 0)
#define ENABLE_BIDIR_PROCHOT_EN_SHIFT           0

这不像完整的数据表,但总比没有好......