cpuid (x86)
読み:スィーピーユーアイディー
外語:cpuid

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

概要
 この命令は、i386末期から利用可能となった。公式にはi486以降対応。
 元々、CPUID命令対応以前のCPUでも、CPUリセット時にDXレジスターに16ビットでCPUの種類を表わすIDがセットされていた(これはEAX=1としてCPUID命令で得られる32ビット値中の下位16ビットそのままである)。これを32ビットに拡張し、また他の情報も得られるようにし、命令で取得可能にしたものである。
 具体的には、フラグレジスター(EFLAGS)のビット21が変更可能である場合に命令が利用できる。オペコードは「0F A2」の2バイトである。
 この命令を使うとCPUの種類を表わすコードやプロセッサーシリアルナンバー、そのCPUが持つ機能、メーカーなどを取得することができる。

内容
 cpuidという命令であることからも分かるように、CPUIDを得ることが主たる目的となる命令である。詳細は後述するが、これはEAX=1でcpuidを呼び出してEAXに返る32ビットの値である。
 下位16ビットが従来から使われていたコードで、上位16ビットは拡張された内容である。
 このコードは、最下位4ビットがステッピング、つぎの4ビットがモデル、次の4ビットがファミリー、残りの4ビットがタイプと予備(CPUの種類により微妙に違っている)となる。
 CPUの大まかな種類はファミリーで表わし、i486=4、Pentiumシリーズ=5、Pentium Pro、Peintium II〜IIIまで=6、Pentium 4=15となる。そして、各ファミリー中の細かい違い(SXとDXや、Pentium IIとIIIの違いなど)はモデルで表わされる。ステッピングはダイのバージョンなどを表わすものである。

利用方法
 実際には、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対象。
 GenuineIntelの場合、EBX=0x756e6547、EDX=0x49656e69、ECX=0x6c65746eが返される。

EAX=0000_0001
 EAX=1でcpuidを実行すると、次の値が得られる。cpuid対応の全CPU対象。
 現在のIA-32プロセッサーの仕様書では、ビット30は予約としか記載がない。IA-64は名を出すことも憚られる黒歴史だったらしい。

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

EAX=0000_0003
 EAX=3でcpuidを実行すると、次の値が得られる。これは、プロセッサーシリアルナンバー対応製品のみで有効で、事前にEAX=0で最大入力値を確認せねばならない。
 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では、引数ECXが必要である。0ならL1D、1ならL2の情報、あるいは、0ならL1D、1ならL1I、2ならL2、を得る、といった動作をする。
 いずれも、MSRのMISC_ENABLEのLCMVが0の場合に有効となる。Windows NTのバグ対策のためとされる。

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

EAX=0000_0007

使い方
 ECXにサブリーフ番号を入れ、EAX=7でcpuidを実行すると、EBX:ECX:EDXに拡張Feature flags情報が得られる。基本CPUID情報の最大入力値が7以上の場合のみ有効。特に記載がない場合は各ビットが0で無効(機能なし)、1で有効(機能あり)。
 EAX=0000_0001を使い切ったため拡張されたが、今後の更なる拡張でEAXを消費せずに済むよう、ECXで参照する情報(リーフ; leaf=葉)を切り替えられるようになっている。実際、2020(令和2)年頃の製品で既にECX=0の情報欄が埋まりつつあり、近い将来のCPUからECX=1のサブリーフが追加される可能性は高い。
 もしECXに無効なサブリーフ番号を入れた場合、つまりそのCPUがまだ対応していないサブリーフ番号を参照しようとした場合、EAX=0が返る。ECXのサブリーフ番号が有効の場合は、EAXに対応する最大サブリーフ番号を返す。

ECX=0

EAX=0000_0008
 予約 (未使用)

EAX=0000_0009
 EAX=9でcpuidを実行すると、DCA(Direct Cache Access)パラメーターが得られる。基本CPUID情報の最大入力値が9以上の場合のみ有効。
 MSRのMISC_ENABLEのLCMVが0の場合に有効となる。Windows NTのバグ対策のためとされる。

EAX=0000_000A
 EAX=10でcpuidを実行すると、DCAパラメーターが得られる。基本CPUID情報の最大入力値が10以上の場合のみ有効。
 EDXのビット12〜0は、リビジョン2以降で有効。
 MSRのMISC_ENABLEのLCMVが0の場合に有効となる。Windows NTのバグ対策のためとされる。

EAX=0000_000B
 EAX=11でcpuidを実行すると、topology enumeration情報が得られる。基本CPUID情報の最大入力値が11以上の場合のみ有効。
 引数としてECXを求める。ECX=0でcpuidを実行するとSMTの情報が得られる。
 MSRのMISC_ENABLEのLCMVが0の場合に有効となる。Windows NTのバグ対策のためとされる。

EAX=0000_000C
 予約 (未使用)

EAX=0000_000D
 EAX=13、ECXにサブリーフ番号を入れてcpuidを実行すると、extended state enumeration情報が得られる。基本CPUID情報の最大入力値が13以上の場合のみ有効。
 ECXのサブリーフ番号は、0でメイン、1でサブ、2〜62でXCR0.nのsub情報が得られる。
 MSRのMISC_ENABLEのLCMVが0の場合に有効となる。Windows NTのバグ対策のためとされる。

EAX=0000_000F〜0000_0010
 EAX=15〜16、ECXにサブリーフ番号を入れてcpuidを実行すると、Intel Resource Director Technology (Intel RDT)やキャッシュ、Memory Bandwidth Allocation Enumerationなどに関する各種の情報が得られる。基本CPUID情報の最大入力値がEAXに入れる値以上の場合のみ有効。

EAX=0000_0012
 ECXにサブリーフ番号を入れ、EAX=18(=12H)でcpuidを実行すると、Intel SGXに関する情報が得られる。基本CPUID情報の最大入力値が18以上の場合のみ有効。

EAX=0000_0014
 ECXにサブリーフ番号を入れ、EAX=20(=14H)でcpuidを実行すると、Intel Processor Trace Enumeration情報が得られる。基本CPUID情報の最大入力値が20以上の場合のみ有効。

EAX=0000_0015
 EAX=21(=15H)でcpuidを実行すると、タイムスタンプカウンター(TSC)やNominal Core Crystal Clockに関する情報が得られる。サブリーフ番号はない。基本CPUID情報の最大入力値が21以上の場合のみ有効。

EAX=0000_0016
 EAX=22(=16H)でcpuidを実行すると、CPUの周波数情報が得られる。サブリーフ番号はない。基本CPUID情報の最大入力値が22以上の場合のみ有効。

EAX=0000_0017
 ECXにサブリーフ番号を入れ、EAX=23(=17H)でcpuidを実行すると、System-On-Chip Vendor Attribute Enumerationに関する情報が得られる。基本CPUID情報の最大入力値が23以上の場合のみ有効。

EAX=0000_0018
 ECXにサブリーフ番号を入れ、EAX=24(=18H)でcpuidを実行すると、Deterministic Address Translation Parametersに関する情報が得られる。基本CPUID情報の最大入力値が24以上の場合のみ有効。

EAX=0000_001A
 ECXにサブリーフ番号を入れ、EAX=26(=1AH)でcpuidを実行すると、Hybrid Information Enumerationに関する情報が得られる。基本CPUID情報の最大入力値が26以上の場合のみ有効。

EAX=0000_001F
 ECXにサブリーフ番号を入れ、EAX=31(=1FH)でcpuidを実行すると、V2 Extended Topology Enumerationに関する情報が得られる。基本CPUID情報の最大入力値が31以上の場合のみ有効。

未実装機能
 後述する他社による実装EAX=8000_0000にIntelが対応するにあたり追加で用意した範囲。つまりIntelが使用しないことを宣言した範囲。未実装である。
 互換プロセッサーでは、この番号で独自の情報を得られる可能性がある。

拡張機能
 これは、元々はAMDが自社プロセッサーの情報取得用に作った仕様である。
 Intel製品にない機能の有無を表現するのに、Intelの用意したフラグの空きを使っては、のちのち競合する恐れがあったためである。このため、この仕様においてビットの定義についてはAMD側に主導権があり、IntelもPentium 4以降で対応するようになったがここに独自のフラグを追加したりはしていない。

EAX=8000_0000
 EAX=80000000Hでcpuidを実行すると、次の値が得られる。拡張機能対応チェックも兼ねている。
 拡張CPUIDに対応していない場合、EAXは80000000Hよりも小さな値を返す。
 IntelではEBX,ECX,EDXは0だが、他のブランドではEAX=0000_0000と同じベンダー文字列を返すことがある(AMD、Transmeta、NSCのGX2など)。

EAX=8000_0001
 EAX=80000001Hでcpuidを実行すると、次の値が得られる。対応しているCPUのみ。
 Feature flagsと同じ、とされている領域については、CPU種類によっては別の情報が格納されていることもある。
 殆どがAMD用の情報ビットで、Intelの仕様書では、ECXのビット0、5、8と、EDXのビット11、20、26、27、29のみ明記があり、他は予約としている。

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

EAX=8000_0005
 EAX=80000005Hでcpuidを実行すると、1次キャッシュの情報が得られる。対応しているCPUのみ。
 Intelのプロセッサーは対応せず、予約で値は全て0としている。

EAX=8000_0006
 EAX=80000006Hでcpuidを実行すると、2次キャッシュ、3次キャッシュの情報が得られる。対応しているCPUのみ。
 Intelプロセッサーの仕様書では、次のような記載がある。

EAX=8000_0007
 EAX=80000007Hでcpuidを実行すると、電源管理関係の機能の情報が得られる。対応しているCPUのみ。
 Intelプロセッサーでは、ビット8(ITSC)のみ定義している。

EAX=8000_0008
 EAX=80000008Hでcpuidを実行すると、拡張アドレス長機能などの情報が得られる。対応しているCPUのみ。
 Intelプロセッサーの仕様書では、EAXのビット15〜0の範囲のみ定義がある。

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

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

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

EAX=8FFF_FFFF
 AMD K7とK8に限り、EAX=8FFFFFFFHでcpuidを実行すると、EAX:EBX:ECX:EDXに文字列 "IT'S HAMMER TIME" を返すイースターエッグがある。

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

Transmeta

EAX=8086_0000
 EAX=80860000Hでcpuidを実行すると、次の値が得られる。拡張機能対応チェックも兼ねている。
 拡張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 予約

EAX=8086_0002
 EAX=80860002Hでcpuidを実行すると、プロセッサーの情報を返す。対応しているCPUのみ。

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

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

VIA

EAX=C000_0000
 EAX=C0000000Hでcpuidを実行すると、次の値が得られる。拡張機能対応チェックも兼ねている。
 拡張CPUIDに対応していない場合、EAXはC0000000Hよりも小さな値を返す。

EAX=C000_0001
 EAX=C0000001Hでcpuidを実行すると、EDXにFeature Flagが得られる。対応しているCPUのみ。
0AISAlternate Instruction Set
1AIS_ENAlternate Instruction Set enabled
2RNGRandom Number Generator (XSTORE)
3RNG_ENRandom Number Generator (XSTORE) enabled
4LHLongHaul MSR 0000_110Ah
5FEMMSFEMMS
6ACEAdvanced Cryptography Engine (XCRYPT)
7ACE_ENAdvanced Cryptography Engine (XCRYPT) enabled
8ACE2Advanced Cryptography Engine v2
9ACE2_ENACE v2 enabled
10PHEPadLock Hash Engine
11PHE_ENPHE enabled
12PMMPadLock Montgomery Multiplier
13PMM_ENPMM enabled
14 予約
15 予約
16 予約
17 予約
18 予約
19 予約
20 予約
21 予約
22 予約
23 予約
24 予約
25 予約
26 予約
27 予約
28 予約
29 予約
30 予約
31 予約

再検索