CPUID

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>
#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 と同じ値が返ります。
0000_0001h
標準機能番号 0000_0001h は、プロセッサのモデルなどの情報と、サポートしている機能のフラグを返します。

どのプロセッサでも共通して判断できる情報もありますが、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)ProcessorTypeAMD では予約。

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
30RDRANDRDRAND 命令のサポート
29F16C半精度浮動小数点数の変換命令のサポート
28AVXAVX 命令のサポート
27OSXSAVEOS が CR4.OSXSAVE[bit 18] を設定して、XSETBV/XGETBV 命令が XCR0 にアクセスし、XSAVE/XRSTOR を使用したプロセッサ拡張状態管理をサポートできるようにした
26XSAVEXSAVE/XRSTOR プロセッサ拡張状態機能、XSETBV/XGETBV 命令、XCR0 をサポートしている
25AESAES 命令のサポート
24TSC-Deadline[Intel] ローカル APIC タイマーが、TSC 期限値を使用したワンショット操作をサポートしている
23POPCNTPOPCNT 命令
22MOVBEMOVBE 命令のサポート
21x2APICx2APIC のサポート
20SSE42SSE4.2 命令のサポート
19SSE41SSE4.1 命令のサポート
18DCA[Intel] メモリマップされたデバイスからデータをプリフェッチする機能
17PCID[Intel] Process-context identifiers
16-予約
15PDCM[Intel] Perfmon and Debug Capability
14xTPR Update Control[Intel] xTPR Update Control
13CMPXCHG16BCMPXCHG16B 命令のサポート
12FMAFMA 命令のサポート
11SDBG[Intel] IA32_DEBUG_INTERFACE MSR
10CNXT-ID[Intel] L1 Context ID
9SSSE3SSSE3 命令のサポート
8TM2[Intel] Thermal Monitor 2
7EIST[Intel] Enhanced Intel SpeedStep technology
6SMX[Intel] Safer Mode Extensions
5VMX[Intel] Virtual Machine 拡張機能のサポート
4DS-CPL[Intel] CPL によって修飾されたブランチメッセージストレージを可能にする、デバッグストア機能の拡張機能をサポート
3MONITORMONITOR/MWAIT 命令
2DTES64[Intel] DS 領域の 64bit レイアウトをサポート。
[AMD] 予約。
1PCLMULQDQPCLMULQDQ 命令のサポート
0SSE3SSE3 命令のサポート
EDX
31PBE[Intel] Pending Break Enable
30-予約
29TM[Intel] サーマルモニター
28HTTハイパースレッディングテクノロジー。
コアごとに複数のスレッドがあるか、コンピューティングユニットごとに複数のコアがあることを示す。
27SS[Intel] Self Snoop
26SSE2SSE2 命令のサポート
25SSESSE 命令のサポート
24FXSRFXSAVE 命令と FXRSTOR 命令のサポート
23MMXMMX 命令のサポート
22ACPI温度モニターおよびソフトウェア制御クロック機能
21DSデバッグストア
20-予約
19CLFSHCLFLUSH 命令のサポート
18PSN[Intel] プロセッサシリアルナンバー
17PSE36ページサイズの拡張。
PDE[20:13] は、物理アドレス [39:32] を供給します。
16PATページ属性テーブル
15CMOVCMOVcc 命令のサポート
14MCAマシンチェックアーキテクチャ
13PGEページのグローバル拡張
12MTRRメモリ型レンジレジスタ
11SysEnterSysExitSYSENTER 命令と SYSEXIT 命令のサポート
10-予約
9APIC高度なプログラマブル割り込みコントローラ。
APIC が存在し、有効になっていることを示します。
8CMPXCHG8BCMPXCHG8B 命令のサポート
7MCEマシンチェック例外
6PAE32bit を超える物理アドレスのサポート
5MSRRDMSR および WRMSR 命令による、モデル固有レジスタ (MSR) のサポート
4TSCRDTSC および RDTSCP 命令のサポート
3PSEページサイズの拡張
2DEデバッグ拡張機能
1VME仮想 8086 モードの機能強化
0FPUx87 浮動小数点ユニット
0000_0007h (ECX = 0)
標準機能番号 0000_0007h は、ECX でサブ機能番号を指定する必要があります。
AVX など、より拡張的な機能のサポートを確認できます。
EAX
0000_0007h でサポートされているサブ機能の数が返ります。
EBX
31AVX512VL[Intel]
30AVX512BW[Intel]
29SHAセキュアハッシュアルゴリズム (SHA) 命令拡張
28AVX512CD[Intel]
27AVX512ER[Intel] (Intel Xeon Phi)
26AVX512PF[Intel] (Intel Xeon Phi)
25-[Intel] Intel Processor Trace
24CLWBCLWB 命令のサポート
23CLFLUSHOPTCLFLUSHOPT 命令のサポート
22RDPID[AMD] RDPID 命令と TSC_AUX MSR のサポート
21AVX512_IFMA[Intel]
20SMAPスーパーバイザモードのアクセス防止
19ADXADCX, ADOX 命令サポート
18RDSEEDRDSEED 命令のサポート
17AVX512DQ[Intel]
16AVX512F[Intel]
15RDT-A/PQE[Intel] Intel Resource Director Technology Allocation
[AMD] プラットフォーム QOS 強制のサポート。
14MPX[Intel] Intel Memory Protection Extensions
13-[Intel] FPU CS および FPU DS を非推奨にする
12RDT-M/PQM[Intel] Intel Resource Director Technology Monitoring
[AMD] 予約済みプラットフォーム QOS モニタリングのサポート
11RTM[Intel]
10INVPCIDINVPCID 命令のサポート
9-[Intel] REP MOVSB/STOSB のサポート
8BMI2BMI2 命令のサポート
7SMEPスーパーバイザモードの実行防止
6FDP_EXCPTN_ONLY[Intel] 87 FPU データポインタは x87 例外でのみ更新されました
5AVX2AVX2 命令サブセットのサポート
4HLE[Intel]
3BMI1BMI1 命令のサポート
2SGX[Intel] Intel Software Guard Extensions
1-[Intel] IA32_TSC_ADJUST MSR
0FSGSBASERDFSBASE/RDGSBASE/WRFSBASE/WRGSBASE 命令のサポート
ECX
31PKS[Intel] スーパーバイザモードページの保護キー
30SGX_LC[Intel] SGX Launch Configuration
29ENQCMD[Intel]
28MOVDIR64B[Intel]
27MOVDIRI[Intel]
26-予約
25CLDEMOTE[Intel] cache line demote
24BUS_LOCK_DETECTバスロックトラップ (#DB) のサポート
23KL[Intel] Key Locker
22-[Intel] RDPID and IA32_TSC_AUX
21:17-[Intel] 64bit モードの BNDLDX/BNDSTX 命令によって使用される MAWAU の値
16LA575 レベルのページングのサポート
15-予約
14AVX512_VPOPCNTDQ[Intel]
13TME_EN[Intel]
12AVX512_BITALG[Intel]
11AVX512_VNNI[Intel]
10VPCMULQDQVPCLMULQDQ 256 ビット命令のサポート
9VAESVAES 256 ビット命令のサポート
8GFNI[Intel]
7CET_SSシャドウスタックのサポート
6AVX512_VBMI2[Intel]
5WAITPKG[Intel]
4OSPKEOS は、CR4.PKE=1 を設定することにより、メモリ保護キーと RDPKRU/WRPKRU 命令の使用を有効にした
3PKUメモリ保護キーがサポート
2UMIPユーザーモード命令防止のサポート
1AVX512_VBMI[Intel]
0PREFETCHWT1[Intel] (Intel Xeon Phi)
EDX
AMD では予約。Intel プロセッサでのみ使われます。
あまり一般的でない機能のフラグが多いので、省略します。
8000_0001h
拡張機能番号 8000_0001h では、追加の情報を取得できます。
EAX
ファミリ、モデル、ステッピング識別子。
EBX
Intel プロセッサでは予約。
ECX
21TBM[AMD] TBM 命令のサポート
16FMA4[AMD] FMA4 命令のサポート
11XOP[AMD] XOP のサポート
8PREFETCHWPREFETCHW 命令のサポート
7MisAlignSse[AMD] SSE 非アライメントのサポート
6SSE4A[AMD] EXTRQ, INSERTQ, MOVNTSS, MOVNTSD 命令のサポート
5LZCNTLZCNT 命令のサポート
0LahfSahf64bit モードで LAHF/SAHF 命令のサポート
EDX
313DNow[AMD] 3DNow! 命令のサポート
303DNowExt[AMD] 3DNow! 拡張命令のサポート
29-[Intel] Intel 64 アーキテクチャ
[AMD] ロングモード
27RDTSCPRDTSCP 命令のサポート
26Page1GB1GB ページサポート
25FFXSR[AMD]
24FXSR[AMD]
23MMX[AMD] MMX 命令のサポート
22MmxExt[AMD] MMX 拡張命令のサポート
11SysCallSysRetSYSCALL/SYSRET 命令のサポート