While troubleshooting a graphics-related freeze on Linux I was asked whether Windows uses x2APIC. It was not immediately clear to me how to check, and my initial searching did not come up with a convenient command or WMI property to query. This post describes the method I used to read the configuration from the model-specific registers (MSRs) in hopes that it may save others the time effort of figuring it out.
The Intel(R) 64 Architecture x2APIC
Specification
says that “System software can place the local APIC in the x2APIC mode by
setting the x2APIC mode enable bit (bit 10) in the IA32_APIC_BASE
MSR at MSR
address 01BH.” Conversely, reading the IA32_APIC_BASE
MSR and checking
bit 10 will indicate whether the system is in x2APIC mode. Since the rdmsr
instruction must be executed at privilege level 0, a kernel-mode driver must
be used.
Performance Inspector
One method for reading the MSR values is to use the
msr
from the (abandoned)
Performance Inspector project:
- Download and unzip pi_win64-20100715.zip (or pi_win32-20100715.zip for 32-bit Windows).
- Run
tinstall.cmd
(as Administrator) to install the driver. - Run
msr -r APIC_BASE
The output should look something like the following:
***** msr v2.0.7 for x64 *****
CPU0 msr 0x1B = 0x00000000:FEE00900 (4276095232)
CPU1 msr 0x1B = 0x00000000:FEE00800 (4276094976)
CPU2 msr 0x1B = 0x00000000:FEE00800 (4276094976)
CPU3 msr 0x1B = 0x00000000:FEE00800 (4276094976)
Since bit 10 (0x400) is not set for any processor, it is clear that my system is not running in x2APIC mode.
Debugging Tools
It might also be possible to use the rdmsr
command
in the Debugging Tools for
Windows
to read the IA32_APIC_BASE
MSR.
Boot Policy
Whether x2APIC is enabled or disabled is both a matter of hardware/BIOS/driver
support and a matter of policy. If the x2APIC state does not match
expectations, consider checking the Windows boot configuration using bcdedit
/enum
and
adjusting the configuration with bcdedit /set x2apicpolicy
enable
or bcdedit /set x2apicpolicy disable
as appropriate.