CPUID (命令)

読み:スィーピーユーアイディー
外語:CPUID
品詞:固有名詞

80x86系プロセッサの命令の一つで、CPUの種類などを得ることができる。互換CPUでも利用可能。

この命令は、i386末期から利用可能となった。公式にはi486以降対応。

フラグレジスタ(EFLAGS)のビット21が変更可能である場合に命令が利用できる。オペコードは0fh、0a2h、の2バイトである。

この命令を使うとCPUの種類を表わすコードやプロセッサシリアルナンバ、そのCPUが持つ機能、メーカーなどを取得することができる。

実際には、EAXレジスタに取得したい情報の番号を入れ、CPUID命令を実行すると、EAXに応じた内容が各レジスタに返る。

利用できるEAXの範囲は、CPUID命令にて取得できる。

範囲の確認

まずEAX=0でCPUID命令を実行すると、EAXに利用できる最大の番号(例えばEAX=2)が返る。

また拡張で、EAX=8000_0000でCPUID命令を実行すると、EAXに利用できる最大の番号(例えばEAX=8000_0004)が返る。

この範囲を越える値を入れて実行した場合、返却値は未定義となる。無効オペコード例外などは生成されないので注意。

基本機能

EAX=0000_0000

EAX=0でCPUIDを実行すると、次の値が得られる。CPUID対応の全CPU対象。

  • EAX: 基本CPUID情報の最大入力値
  • EBX:EDX:ECX: ベンダー文字列
    • "GenuineIntel" Intel
    • "AuthenticAMD" AMD
    • "CyrixInstead" Cyrix
    • "CentaurHauls" Centaur
    • "NexGenDriven" NexGen
    • "GenuineTMx86" Transmeta
    • "RiseRiseRise" Rise
    • "UMC UMC UMC " UMC
    • "SiS SiS SiS " SiS
    • "Geode by NSC" National Semiconductor

EAX=0000_0001

EAX=1でCPUIDを実行すると、次の値が得られる。CPUID対応の全CPU対象。

  • EAX: プロセッサシグネチャ
    • CPUID番号(プロセッサシリアルナンバの上位32ビット)
  • EBX: ファンクションフラグ
    • ビット31〜24: APIC ID
    • ビット23〜16: 論理CPU数
    • ビット15〜8: CLFLUSH
    • ビット7〜0: ブランドID
  • ECX: Feature flags(その2)
    0SSE3Streaming SIMD Extensions 3
    1 予約
    2 予約
    3MONMONITOR/MWAIT Instructions
    4DSCPLCPL Qualified Debug Store
    5VMXVirtual Machine Extensions
    6SMXSafer Mode Extentions
    7ESTEnhanced SpeedStep Technology
    8TM2Thermal Monitor 2
    9SSSE3Supplemental SSE3
    10CIDContext ID
    11 予約
    12 予約
    13CX16CMPXCHG16B
    14ETPRDMISC_ENABLE.ETPRD
    15PDCMPerformance Debug Capability MSR
    16 予約
    17 予約
    18DCADirect Cache Access
    19SSE4.1Streaming SIMD Extensions 4.1
    20SSE4.2Streaming SIMD Extensions 4.2
    21x2APICx2APIC
    22 予約
    23POPCNTPopulation Count Instruction
    24 予約
    25 予約
    26 予約
    27 予約
    28 予約
    29 予約
    30 予約
    31 予約
    32 予約
  • EDX: Feature flags(その1)
    0FPUFloating-point unit on-chip
    1VMEVirtual Mode Extension
    2DEDebugging Extension
    3PSEPage Size Extension
    4TSCTime Stamp Counter
    5MSRModel Specific Registers
    6PAEPhysical Address Extension
    7MCEMachine Check Extension
    8CXBCMPXCHG8B Instruction
    9APICOn-chip APIC Hardware
    10 予約
    11SEPFast System Call
    12MTRRMemory Type Range Registers
    13PGEPage Global Enable
    14MCAMachine Check Architecture
    15CMOVConditional Move Instruction
    16PATPage Attribute Table
    17PSE3636-bit Page Size Extension
    18PSNプロセッサシリアルナンバ
    19CLFLCLFLUSH Instruction
    20 予約
    21DTESDebug Trace and EMON Store MSRs
    22ACPIAdvanced Configuration and Power Interface
    23MMXIntel Architecture MMX technology
    24FXSRFast floating point save and restore
    25SSEStreaming SIMD Extensions
    26SSE2Streaming SIMD Extensions 2
    27SSSelf-Snoop
    28HTTハイパー・スレッディング・テクノロジ
    29TM1Thermal Monitor
    30IA-64IA-64 Processor Capable
    31PBEPending Break Enable

EAX=0000_0002

EAX=2でCPUIDを実行すると、次の値が得られる。CPUID対応の全CPU対象。

  • EAX,EBX,ECX,EDX: CPUキャッシュとTLBディスクリプタ

EAX=0000_0003

EAX=3でCPUIDを実行すると、次の値が得られる。これは、プロセッサシリアルナンバ対応製品のみで有効で、事前にEAX=0で最大入力値を確認せねばならない。

  • EDX:ECX: プロセッサシリアルナンバの下位64ビット (上位32ビットはEAX=1のEAX)

Transmetaの場合、EAXとEBXにも値を返す。CrusoeではEBXに、EfficeonではEAXとEBXに返される。

EAX=0000_0004〜5

基本CPUID情報の最大入力値が4〜5以上で、かつIA32_CR_MISC_ENABLES.BOOT_NT4(ビット22)が0(デフォルト)時には、EAX=4またはEAX=5で、次の値が得られる。

  • EAX=4時: キャッシュ・コンフィグレーション・ディスクリプタの情報
  • EAX=5時: MONITOR/MWAIT機能の情報

EAX=4では、引数ECXが必要で、0ならL1、1ならL2の情報を得る、といった動作をする。

いずれも、MSRのMISC_ENABLEのLCMVが0の場合に有効となる。Windows NTのバグ対策のためとされる。

EAX=0000_0006

EAX=6でCPUIDを実行すると、パワーマネージメント情報が得られる。基本CPUID情報の最大入力値が6以上の場合のみ有効。

  • EAX:
    • ビット2: 1=operating point protection有効
    • ビット1: 1=Dynamic Acceleration有効
    • ビット0: 1=ディジタル温度計あり
  • EBX:
    • ビット3〜0: ディジタル温度計の割込スレッショルド数
  • ECX:
    • ビット0: ACNT/MCNT

EAX=0000_0007〜8

詳細不明。

EAX=0000_0009

EAX=9でCPUIDを実行すると、DCAパラメータが得られる。基本CPUID情報の最大入力値が9以上の場合のみ有効。

  • EAX: PLATFORM_DCA_CAP MSR 0000_01F8h

MSRのMISC_ENABLEのLCMVが0の場合に有効となる。Windows NTのバグ対策のためとされる。

EAX=0000_000A

EAX=10でCPUIDを実行すると、DCAパラメータが得られる。基本CPUID情報の最大入力値が10以上の場合のみ有効。

  • EAX:
    • ビット7〜0: リビジョン
    • ビット15〜8: 1論理プロセッサに対するPeMoカウンタ数
    • ビット23〜16: PeMoカウンタのビット幅
    • ビット31〜24: EBXビットベクタ長
  • EBX:
    • ビット0: core cycles event unavailable
    • ビット1: instructions retired event unavailable
    • ビット2: reference cycles event unavailable
    • ビット3: last level cache references event unavailable
    • ビット4: last level cache misses event unavailable
    • ビット5: branch instructions retired event unavailable
    • ビット6: branch mispredicts retired event unavailable
    • ビット31〜7: 予約
  • EDX:
    • ビット4〜0: 固定機能PeMoカウンタの数
    • ビット12〜5: 固定機能PeMoカウンタのビット幅
    • ビット31〜13: 予約

EDXのビット12〜0は、リビジョン2以降で有効。

MSRのMISC_ENABLEのLCMVが0の場合に有効となる。Windows NTのバグ対策のためとされる。

EAX=0000_000B

EAX=11でCPUIDを実行すると、topology enumeration情報が得られる。基本CPUID情報の最大入力値が11以上の場合のみ有効。

引数としてCLを求める。CL=0でCPUIDを実行するとSMTの情報が得られる。

MSRのMISC_ENABLEのLCMVが0の場合に有効となる。Windows NTのバグ対策のためとされる。

拡張機能

これは、元々はAMDが自社プロセッサの情報取得用に作った仕様である。

Intel製品にない機能の有無を表現するのに、Intelの用意したフラグの空きを使っては、のちのち競合する恐れがあったためである。このため、この仕様においてビットの定義についてはAMD側に主導権があるようである。なお、IntelもPentium 4以降で対応するようになった。

EAX=8000_0000

EAX=80000000HでCPUIDを実行すると、次の値が得られる。拡張機能対応チェックも兼ねている。

  • EAX: 拡張CPUID情報の最大入力値

拡張CPUIDに対応していない場合、EAXは80000000Hよりも小さな値を返す。

IntelではEBX,ECX,EDXは0だが、他のブランドではEAX=0000_0000と同じベンダー文字列を返すことがある(AMD、Transmeta、NSCのGX2など)。

EAX=8000_0001

EAX=80000001HでCPUIDを実行すると、次の値が得られる。対応しているCPUのみ。

  • EAX: 拡張プロセッサ種類情報(AMD系CPUの種類)
  • EBX: 拡張プロセッサ種類情報(AMD系CPUの種類)
  • ECX: Extended Feature flags(その2)
    0AHF64PM64でのLAHF/SAHFの使用可否
    1CMPHTT=1がHTT(0)かCMP(1)を示す
    2SVMSecure Virtual Machine
    3EASExtended APIC
    4CR8DLOCK MOV CR0 means MOV CR8
    5LZCNTLZCNT
    6SSE4aStreaming SIMD Extensions 4a
    7MASSEMisaligned SSE
    83DNow!-PREFETCHとPREFETCHW
    9OSVWOS Visible Workaround
    10IBSinstruction based sampling
    11SSE5Streaming SIMD Extensions 5
    12SKINITSKINIT
    13WDTウォッチドッグタイマ
    14 予約
    15 予約
    16 予約
    17 予約
    18 予約
    19 予約
    20LAHFLAHF/SAHFの使用可否 (Intel)
    21 予約
    22 予約
    23 予約
    24 予約
    25 予約
    26 予約
    27 予約
    28 予約
    29 予約
    30 予約
    31 予約
    32 予約
  • EDX: Extended Feature Flags(その1)
    0 Feature flags(EAX=0000_0001、EDX) 0〜9と同じ
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10 予約
    11SEPSYSCALL/SYSRET Instructions
    12 Feature flags 12〜18と同じ
    13
    14
    15
    16
    17
    18 予約
    19MPMultiprocessing Capable
    20NXNo-execute Page Protection
    21 予約
    22MMX+MMX Instruction Extensions
    23 Feature flags 23〜24と同じ
    24
    25FFXSRFast FXSAVE/FXRSTOR
    26P1GB1GB Page Size
    27TSCPRDTSCP Instructions
    28 予約
    29LMAMD64/Intel 64 ロングモード
    303DNow!+3DNow! Instruction Extentions (Enhanced 3DNow!)
    313DNow!3DNow! Instructions

Feature flagsと同じ、とされている領域については、CPU種類によっては別の情報が格納されていることもある。

EAX=8000_0002〜0004

EAX=80000002〜4HでCPUIDを実行すると、EAX,EBX,ECX,EDXにプロセッサブランド文字列が得られる。最大48バイト。対応しているCPUのみ。

EAX=8000_0005

EAX=80000005HでCPUIDを実行すると、1次キャッシュの情報が得られる。対応しているCPUのみ。

EAX=8000_0006

EAX=80000006HでCPUIDを実行すると、2次キャッシュ、3次キャッシュの情報が得られる。対応しているCPUのみ。

EAX=8000_0007

EAX=80000007HでCPUIDを実行すると、電源管理関係の機能の情報が得られる。対応しているCPUのみ。

  • EDX: Power Management
    0TSTemperature Sensor
    1FIDFrequency ID Control
    2VIDVoltage ID Control
    3TTPThermal Trip
    4TMThermal Monitoring
    5STCSoftware Thermanl Control
    6MUL100MHz Multiplier Steps
    7HWPSHardware P-State Control
    8ITSCInvariant TSC
    9 予約
    10 予約
    11 予約
    12 予約
    13 予約
    14 予約
    15 予約
    16 予約
    17 予約
    18 予約
    19 予約
    20 予約
    21 予約
    22 予約
    23 予約
    24 予約
    25 予約
    26 予約
    27 予約
    28 予約
    29 予約
    30 予約
    31 予約
    32 予約

EAX=8000_0008

EAX=80000008HでCPUIDを実行すると、拡張アドレス長機能の情報が得られる。対応しているCPUのみ。

EAX=8000_000A

EAX=8000000AHでCPUIDを実行すると、SVM情報が得られる。対応しているCPUのみ。

EAX=8000_0019

EAX=80000019HでCPUIDを実行すると、TLBコンフィギュレーションディスクリプタが得られる。対応しているCPUのみ。

EAX=8000_001A

EAX=8000001AHでCPUIDを実行すると、パフォーマンス最適化に関する情報が得られる。対応しているCPUのみ。

特殊拡張機能

AMDの拡張とは別に、TransmetaとVIAは、それぞれ独自のFeature Flagを提供している。

Transmeta

EAX=8086_0000

EAX=80860000HでCPUIDを実行すると、次の値が得られる。拡張機能対応チェックも兼ねている。

  • EAX: 拡張CPUID情報の最大入力値
  • EBX:EDX:ECX: ベンダー文字列

拡張CPUIDに対応していない場合、EAXは80860000Hよりも小さな値を返す。

EAX=8086_0001

EAX=80860001HでCPUIDを実行すると、CPUの情報を返す。対応しているCPUのみ。

EAX,EBXにCPUの種類、ECXにコアクロック周波数、EDXにFeature Flagが得られる。EDXの内容は次の通り。

0BADrecovery CMS active
1LRLongRun
2 予約
3LRTILongRun Table Interface
4 予約
5 予約
6 予約
7 予約
8 予約
9 予約
10 予約
11 予約
12 予約
13 予約
14 予約
15 予約
16 予約
17 予約
18 予約
19 予約
20 予約
21 予約
22 予約
23 予約
24 予約
25 予約
26 予約
27 予約
28 予約
29 予約
30 予約
31 予約
32 予約
EAX=8086_0003〜6

EAX=80860003〜6HでCPUIDを実行すると、CPUの情報文字列を返す。対応しているCPUのみ。

EAX=8086_0007

EAX=80860007HでCPUIDを実行すると、CPUの情報を返す。対応しているCPUのみ。

  • EAX: カレントのコアクロック周波数(MHz)
  • EBX: カレントのコア電圧(mV)
  • ECX: カレント(LongRun)パフォーマンスレベル(0〜100%)
  • EDX: カレントのゲートディレイ(fs)

VIA

EAX=C000_0000

EAX=C0000000HでCPUIDを実行すると、次の値が得られる。拡張機能対応チェックも兼ねている。

  • EAX: 拡張CPUID情報の最大入力値

拡張CPUIDに対応していない場合、EAXはC0000000Hよりも小さな値を返す。

EAX=C000_0001

EAX=C0000001HでCPUIDを実行すると、EDXにFeature Flagが得られる。対応しているCPUのみ。

0AISAlternate Instruction Set
1AIS-EAlternate Instruction Set enabled
2RNGRandom Number Generator
3RNG-ERandom Number Generator enabled
4LHLongHaul MSR 0000_110Ah
5FEMMSFEMMS
6ACEAdvanced Cryptography Engine
7ACE-EAdvanced Cryptography Engine enabled
8MM/HEMontgomery Multiplier and Hash Engine
9MM/HE-EMontgomery Multiplier and Hash Engine enabled
10 予約
11 予約
12 予約
13 予約
14 予約
15 予約
16 予約
17 予約
18 予約
19 予約
20 予約
21 予約
22 予約
23 予約
24 予約
25 予約
26 予約
27 予約
28 予約
29 予約
30 予約
31 予約
32 予約