英特尔处理器:“如果CPUID.06H:EAX。[7] = 1”含义?

时间:2017-08-25 14:38:32

标签: linux-kernel linux-device-driver intel microprocessors

以下评论在英特尔处理器数据表中的含义是什么?如何在Linux中的驱动程序代码中检查它?

如果CPUID.06H:EAX。[7] = 1

我在注册表描述表的注释栏中的英特尔处理器SW开发人员手册中遇到过这种类型的陈述。

参考:https://software.intel.com/sites/default/files/managed/22/0d/335592-sdm-vol-4.pdf

请帮助我理解处理器说明。

感谢。

2 个答案:

答案 0 :(得分:2)

CPUID.06H:EAX。[7] 可以在英特尔处理器中发现HWP(硬件控制性能状态)支持。

如果未设置该功能位,则该功能不存在。访问HWP MSR将导致#GP异常。对于其他功能位,结果可能更糟:没有故障但后来导致难以调试的问题。

这意味着您应该在指令前eax运行the cpuid instruction后检查eax & (1<<7)寄存器中的位(具体为eax=0x6)。

要在Linux内核中发现CPUID值,您可以使用one of the cpuid functions, with op=6

#include  <asm/processor.h>   // defines the following:

void cpuid(unsigned int op,
             unsigned int *eax, unsigned int *ebx,
             unsigned int *ecx, unsigned int *edx);
void cpuid_count(unsigned int op, int count,
                   unsigned int *eax, unsigned int *ebx,
                   unsigned int *ecx, unsigned int *edx);

或者您只想要一个寄存器结果的情况:

unsigned int cpuid_eax(unsigned int op);

并屏蔽EAX返回值。

一个小注意事项:引用SDM时最好指定一个部分 - 毕竟它是一本大书......

答案 1 :(得分:2)

问题1

  

以下注释在英特尔处理器数据表中的含义是什么?

If CPUID.06H:EAX.[7] = 1

cpuid是一个特殊的处理器指令,用于发现处理器的详细信息(例如,检查某些不常见功能的可用性)。它隐式使用EAX寄存器作为参数,并在EAX,EBX,ECX,EDX中返回结果。 在英特尔手册中,一般格式为:

CPUID.EAX_VALUE:RETURN_REGISTER.[BIT_NUMBER] = 1:表示如果使用EAX寄存器= EAX_VALUE执行CPUID指令,则会在RETURN_REGISTER中得到结果。如果设置了位号BIT_NUMBER,那么它可以在手册中找到一些特殊含义。

CPUID.06H:EAX.[7]=1表示如果以寄存器EAX = 06H(十六进制为6)作为输入执行CPUID指令,则会在EAX中得到结果。如果结果的位数为1,那么它有一些特殊的含义,您可以在手册中找到。例如。我在手册中读到了这个:

  

HWP基线资源和功能的可用性,   CPUID.06H:EAX [bit 7]:如果该位置1(即if   CPUID.06H:EAX.[7]=1),HWP提供了几个新的架构MSR:   IA32_PM_ENABLE,IA32_HWP_CAPABILITIES,   IA32_HWP_REQUEST,IA32_HWP_STATUS。

问题2

  

如何在Linux的驱动程序代码中检查?

if(cpuid_eax(0x06) && (1<<7)){
   // Good news :features availlable, do your job
}else{
   // Bad luck ::
   return;
}