CPUID
CPUID | 0F A2
CPUID 命令は、プロセッサの情報や、プロセッサがサポートしている機能を確認するために使います。
CPUID 命令を実行する前に、取得したい情報の機能番号を、EAX レジスタにセットします。
一部の機能では、さらにサブ番号を指定する必要があるため、その場合は ECX にサブ番号をセットします。
CPUID 実行後、EAX, EBX, ECX, EDX レジスタに結果の値が返ります。
※64bit モードの場合、結果の値は 64bit にゼロ拡張されます。
機能番号には、標準機能と拡張機能の2つがあり、0000_xxxxh は標準機能、8000_xxxxh は拡張機能を示します。
以下で、いくつかの基本的な機能を紹介していきます。
0000_0000h
機能番号 0000_0000h は、サポートされている標機能番号の最大値と、プロセッサ識別子の文字列を取得します。
EAX | このプロセッサがサポートする、最大の標準機能番号 |
---|---|
EBX EDX ECX | 3つのレジスタを合わせて、12 文字の文字列となる。 EBX-EDX-ECX の順で、文字は下位バイトから順に格納される。 AMD の場合、"AuthenticAMD" (EBX = 6874_7541h, EDX = 6974_6E65h, ECX = 444D_4163h) Intel の場合、"GenuineIntel" (EBX = 756E_6547h, EDX = 4965_6E69h, ECX = 6C65_746Eh) |
ソースコード
<24_cpuid.c>
<24_cpuid.asm>
文字が、整数として下位バイトから順に並んでいるということは、メモリに格納した時は、先頭から順に並ぶので、EBX-EDX-ECX の順で、値を 4 byte ずつメモリに格納すれば、12 文字の文字列になります。
なお、RBX レジスタは、System V AMD64 ABI に準拠する場合、呼び出し元の値を維持しておく必要があるため、PUSH しています。
#include <stdio.h> int testfunc(char *); int main(void) { int max; char name[13]; max = testfunc(name); printf("max: %xh\nname: %s\n", max, name); return 0; }
<24_cpuid.asm>
global testfunc section .text ; arg1 = 文字列を格納するポインタ testfunc: push rbx xor eax, eax cpuid mov [rdi], ebx mov [rdi+4], edx mov [rdi+8], ecx mov byte [rdi+13], 0 pop rbx ret
$ nasm -f elf64 24_cpuid.asm $ cc -o test 24_cpuid.c 24_cpuid.o $ ./test max: 16h name: GenuineIntel
文字が、整数として下位バイトから順に並んでいるということは、メモリに格納した時は、先頭から順に並ぶので、EBX-EDX-ECX の順で、値を 4 byte ずつメモリに格納すれば、12 文字の文字列になります。
なお、RBX レジスタは、System V AMD64 ABI に準拠する場合、呼び出し元の値を維持しておく必要があるため、PUSH しています。
8000_0000h
拡張機能番号 8000_0000h は、EAX に、サポートされている拡張機能番号の最大値 (8000_xxxxh) を返します。
EBX, ECX, EDX は、Intel 64 では予約されています。
AMD64 では、0000_0000h と同じ値が返ります。
EBX, ECX, EDX は、Intel 64 では予約されています。
AMD64 では、0000_0000h と同じ値が返ります。
0000_0001h
標準機能番号 0000_0001h は、プロセッサのモデルなどの情報と、サポートしている機能のフラグを返します。
どのプロセッサでも共通して判断できる情報もありますが、Intel または AMD プロセッサの片方でしか使われない情報もあります。
表の左の数値は、ビット位置、またはビット範囲です。
どのプロセッサでも共通して判断できる情報もありますが、Intel または AMD プロセッサの片方でしか使われない情報もあります。
表の左の数値は、ビット位置、またはビット範囲です。
EAX
31:28 (4) | - | 予約 |
---|---|---|
27:20 (8) | ExtendedFamilyID | プロセッサ拡張ファミリ。 FamilyID が 0Fh の場合、ExtendedFamilyID を加算する。 |
19:16 (4) | ExtendedModelID | プロセッサ拡張モデル。 FamilyID が 06h or 0Fh の場合、モデルは (ExtendedModelID << 4) + Model となる。 |
15:14 (2) | - | 予約 |
13:12 (2) | ProcessorType | AMD では予約。 Intel ではプロセッサタイプ。 00b = Original OEM Processor 01b = Intel OverDrive Processor 10b = Dual processor (Intel 486 プロセッサには適用されない) 11b = Intel reserved |
11:8 (4) | FamilyID | 基本プロセッサファミリ。 |
7:4 (4) | Model | 基本プロセッサモデル。 |
3:0 (4) | SteppingID | 特定のモデルのプロセッサステッピング (リビジョン)。 |
EBX
31:24 (8) | 電源入時に、ローカル APIC 物理 ID レジスタに割り当てられる 8bit 値。 |
---|---|
23:16 (8) | [Intel] この物理パッケージ内の論理プロセッサの、アドレス指定可能な ID の最大数。 [AMD] 論理プロセッサ数。 CPUID: 0000_0001h EDX[HTT] = 1 の場合、パッケージあたりの論理プロセッサの数。 CPUID: 0000_0001h EDX[HTT] = 0 の場合、予約。 |
15:8 (8) | CLFLUSH サイズ。 CLFLUSH 命令によってフラッシュされるキャッシュラインのサイズを、8 byte 単位で指定。 |
7:0 (8) | [Intel] ブランドインデックス。 [AMD] CPUID:8000_0001h EBX と組み合わせて、プロセッサ名の文字列を生成するために使用されます。 |
ECX
31 | - | 0 |
---|---|---|
30 | RDRAND | RDRAND 命令のサポート |
29 | F16C | 半精度浮動小数点数の変換命令のサポート |
28 | AVX | AVX 命令のサポート |
27 | OSXSAVE | OS が CR4.OSXSAVE[bit 18] を設定して、XSETBV/XGETBV 命令が XCR0 にアクセスし、XSAVE/XRSTOR を使用したプロセッサ拡張状態管理をサポートできるようにした |
26 | XSAVE | XSAVE/XRSTOR プロセッサ拡張状態機能、XSETBV/XGETBV 命令、XCR0 をサポートしている |
25 | AES | AES 命令のサポート |
24 | TSC-Deadline | [Intel] ローカル APIC タイマーが、TSC 期限値を使用したワンショット操作をサポートしている |
23 | POPCNT | POPCNT 命令 |
22 | MOVBE | MOVBE 命令のサポート |
21 | x2APIC | x2APIC のサポート |
20 | SSE42 | SSE4.2 命令のサポート |
19 | SSE41 | SSE4.1 命令のサポート |
18 | DCA | [Intel] メモリマップされたデバイスからデータをプリフェッチする機能 |
17 | PCID | [Intel] Process-context identifiers |
16 | - | 予約 |
15 | PDCM | [Intel] Perfmon and Debug Capability |
14 | xTPR Update Control | [Intel] xTPR Update Control |
13 | CMPXCHG16B | CMPXCHG16B 命令のサポート |
12 | FMA | FMA 命令のサポート |
11 | SDBG | [Intel] IA32_DEBUG_INTERFACE MSR |
10 | CNXT-ID | [Intel] L1 Context ID |
9 | SSSE3 | SSSE3 命令のサポート |
8 | TM2 | [Intel] Thermal Monitor 2 |
7 | EIST | [Intel] Enhanced Intel SpeedStep technology |
6 | SMX | [Intel] Safer Mode Extensions |
5 | VMX | [Intel] Virtual Machine 拡張機能のサポート |
4 | DS-CPL | [Intel] CPL によって修飾されたブランチメッセージストレージを可能にする、デバッグストア機能の拡張機能をサポート |
3 | MONITOR | MONITOR/MWAIT 命令 |
2 | DTES64 | [Intel] DS 領域の 64bit レイアウトをサポート。 [AMD] 予約。 |
1 | PCLMULQDQ | PCLMULQDQ 命令のサポート |
0 | SSE3 | SSE3 命令のサポート |
EDX
31 | PBE | [Intel] Pending Break Enable |
---|---|---|
30 | - | 予約 |
29 | TM | [Intel] サーマルモニター |
28 | HTT | ハイパースレッディングテクノロジー。 コアごとに複数のスレッドがあるか、コンピューティングユニットごとに複数のコアがあることを示す。 |
27 | SS | [Intel] Self Snoop |
26 | SSE2 | SSE2 命令のサポート |
25 | SSE | SSE 命令のサポート |
24 | FXSR | FXSAVE 命令と FXRSTOR 命令のサポート |
23 | MMX | MMX 命令のサポート |
22 | ACPI | 温度モニターおよびソフトウェア制御クロック機能 |
21 | DS | デバッグストア |
20 | - | 予約 |
19 | CLFSH | CLFLUSH 命令のサポート |
18 | PSN | [Intel] プロセッサシリアルナンバー |
17 | PSE36 | ページサイズの拡張。 PDE[20:13] は、物理アドレス [39:32] を供給します。 |
16 | PAT | ページ属性テーブル |
15 | CMOV | CMOVcc 命令のサポート |
14 | MCA | マシンチェックアーキテクチャ |
13 | PGE | ページのグローバル拡張 |
12 | MTRR | メモリ型レンジレジスタ |
11 | SysEnterSysExit | SYSENTER 命令と SYSEXIT 命令のサポート |
10 | - | 予約 |
9 | APIC | 高度なプログラマブル割り込みコントローラ。 APIC が存在し、有効になっていることを示します。 |
8 | CMPXCHG8B | CMPXCHG8B 命令のサポート |
7 | MCE | マシンチェック例外 |
6 | PAE | 32bit を超える物理アドレスのサポート |
5 | MSR | RDMSR および WRMSR 命令による、モデル固有レジスタ (MSR) のサポート |
4 | TSC | RDTSC および RDTSCP 命令のサポート |
3 | PSE | ページサイズの拡張 |
2 | DE | デバッグ拡張機能 |
1 | VME | 仮想 8086 モードの機能強化 |
0 | FPU | x87 浮動小数点ユニット |
0000_0007h (ECX = 0)
標準機能番号 0000_0007h は、ECX でサブ機能番号を指定する必要があります。
AVX など、より拡張的な機能のサポートを確認できます。
AVX など、より拡張的な機能のサポートを確認できます。
EAX
0000_0007h でサポートされているサブ機能の数が返ります。
EBX
31 | AVX512VL | [Intel] |
---|---|---|
30 | AVX512BW | [Intel] |
29 | SHA | セキュアハッシュアルゴリズム (SHA) 命令拡張 |
28 | AVX512CD | [Intel] |
27 | AVX512ER | [Intel] (Intel Xeon Phi) |
26 | AVX512PF | [Intel] (Intel Xeon Phi) |
25 | - | [Intel] Intel Processor Trace |
24 | CLWB | CLWB 命令のサポート |
23 | CLFLUSHOPT | CLFLUSHOPT 命令のサポート |
22 | RDPID | [AMD] RDPID 命令と TSC_AUX MSR のサポート |
21 | AVX512_IFMA | [Intel] |
20 | SMAP | スーパーバイザモードのアクセス防止 |
19 | ADX | ADCX, ADOX 命令サポート |
18 | RDSEED | RDSEED 命令のサポート |
17 | AVX512DQ | [Intel] |
16 | AVX512F | [Intel] |
15 | RDT-A/PQE | [Intel] Intel Resource Director Technology Allocation [AMD] プラットフォーム QOS 強制のサポート。 |
14 | MPX | [Intel] Intel Memory Protection Extensions |
13 | - | [Intel] FPU CS および FPU DS を非推奨にする |
12 | RDT-M/PQM | [Intel] Intel Resource Director Technology Monitoring [AMD] 予約済みプラットフォーム QOS モニタリングのサポート |
11 | RTM | [Intel] |
10 | INVPCID | INVPCID 命令のサポート |
9 | - | [Intel] REP MOVSB/STOSB のサポート |
8 | BMI2 | BMI2 命令のサポート |
7 | SMEP | スーパーバイザモードの実行防止 |
6 | FDP_EXCPTN_ONLY | [Intel] 87 FPU データポインタは x87 例外でのみ更新されました |
5 | AVX2 | AVX2 命令サブセットのサポート |
4 | HLE | [Intel] |
3 | BMI1 | BMI1 命令のサポート |
2 | SGX | [Intel] Intel Software Guard Extensions |
1 | - | [Intel] IA32_TSC_ADJUST MSR |
0 | FSGSBASE | RDFSBASE/RDGSBASE/WRFSBASE/WRGSBASE 命令のサポート |
ECX
31 | PKS | [Intel] スーパーバイザモードページの保護キー |
---|---|---|
30 | SGX_LC | [Intel] SGX Launch Configuration |
29 | ENQCMD | [Intel] |
28 | MOVDIR64B | [Intel] |
27 | MOVDIRI | [Intel] |
26 | - | 予約 |
25 | CLDEMOTE | [Intel] cache line demote |
24 | BUS_LOCK_DETECT | バスロックトラップ (#DB) のサポート |
23 | KL | [Intel] Key Locker |
22 | - | [Intel] RDPID and IA32_TSC_AUX |
21:17 | - | [Intel] 64bit モードの BNDLDX/BNDSTX 命令によって使用される MAWAU の値 |
16 | LA57 | 5 レベルのページングのサポート |
15 | - | 予約 |
14 | AVX512_VPOPCNTDQ | [Intel] |
13 | TME_EN | [Intel] |
12 | AVX512_BITALG | [Intel] |
11 | AVX512_VNNI | [Intel] |
10 | VPCMULQDQ | VPCLMULQDQ 256 ビット命令のサポート |
9 | VAES | VAES 256 ビット命令のサポート |
8 | GFNI | [Intel] |
7 | CET_SS | シャドウスタックのサポート |
6 | AVX512_VBMI2 | [Intel] |
5 | WAITPKG | [Intel] |
4 | OSPKE | OS は、CR4.PKE=1 を設定することにより、メモリ保護キーと RDPKRU/WRPKRU 命令の使用を有効にした |
3 | PKU | メモリ保護キーがサポート |
2 | UMIP | ユーザーモード命令防止のサポート |
1 | AVX512_VBMI | [Intel] |
0 | PREFETCHWT1 | [Intel] (Intel Xeon Phi) |
EDX
AMD では予約。Intel プロセッサでのみ使われます。
あまり一般的でない機能のフラグが多いので、省略します。
あまり一般的でない機能のフラグが多いので、省略します。
8000_0001h
拡張機能番号 8000_0001h では、追加の情報を取得できます。
EAX
ファミリ、モデル、ステッピング識別子。
EBX
Intel プロセッサでは予約。
ECX
21 | TBM | [AMD] TBM 命令のサポート |
---|---|---|
16 | FMA4 | [AMD] FMA4 命令のサポート |
11 | XOP | [AMD] XOP のサポート |
8 | PREFETCHW | PREFETCHW 命令のサポート |
7 | MisAlignSse | [AMD] SSE 非アライメントのサポート |
6 | SSE4A | [AMD] EXTRQ, INSERTQ, MOVNTSS, MOVNTSD 命令のサポート |
5 | LZCNT | LZCNT 命令のサポート |
0 | LahfSahf | 64bit モードで LAHF/SAHF 命令のサポート |
EDX
31 | 3DNow | [AMD] 3DNow! 命令のサポート |
---|---|---|
30 | 3DNowExt | [AMD] 3DNow! 拡張命令のサポート |
29 | - | [Intel] Intel 64 アーキテクチャ [AMD] ロングモード |
27 | RDTSCP | RDTSCP 命令のサポート |
26 | Page1GB | 1GB ページサポート |
25 | FFXSR | [AMD] |
24 | FXSR | [AMD] |
23 | MMX | [AMD] MMX 命令のサポート |
22 | MmxExt | [AMD] MMX 拡張命令のサポート |
11 | SysCallSysRet | SYSCALL/SYSRET 命令のサポート |