/****************************************************************************** TrickLibrary extra ia32info ia32info ヘッダファイル Coded by Wraith in Jan 3, 2004. ******************************************************************************/ // Tab幅を4文字に設定して表示させてください。 /////////////////////////////////////////////////////////////////////////////// // // ■ ia32info.h // http://tricklib.com/cxx/ex/ia32info/ia32info.h // // □ リファレンス・サポートページ // http://tricklib.com/cxx/ex/ia32info/ // // □ ライセンス情報 // http://tricklib.com/license.htm // // このモジュールはインテルより公開されている資料(245471J および AP-485)を // 元に作成しています。 // // cf. http://www.intel.com/jp/developer/download/ #ifndef __IA32INFO_H__ #define __IA32INFO_H__ #if !defined(__WITH_IA32INFO__) # define __WITH_IA32INFO__ #endif #include namespace ia32info { // cpuid 命令のサポート bool enabled_cpuid(); class cpuid_info { public: unsigned int reg_eax; unsigned int reg_ebx; unsigned int reg_ecx; unsigned int reg_edx; cpuid_info(unsigned int option); }; // 基本情報:0x00 // 基本情報最大インデックス class cpuid_baseinfo_maxindex :public cpuid_info { public: cpuid_baseinfo_maxindex() :cpuid_info(0x00) { } unsigned int get_value() const { return reg_eax; } operator unsigned int () const { return reg_eax; } }; // CPU のベンダID class cpuid_venderid :protected cpuid_info { public: cpuid_venderid() :cpuid_info(0x00) { // ecx と edx の順番が逆になることに注意。 reg_eax = reg_ebx; reg_ebx = reg_edx; //reg_ecx = reg_ecx; reg_edx = 0; } const char * get_string() const { return (const char *)this; } const char * get_value() const { return get_string(); } operator const char * () const { return get_string(); } }; // 基本情報:0x01 class cpuid_signature :public cpuid_info { public: cpuid_signature() :cpuid_info(0x01) { } // EAX // ステッピングID unsigned int stepping_id() const { return reg_eax & 0x0F; } // モデル番号 unsigned int model_number() const { return (reg_eax >> 4) & 0x0F; } // ファミリーコード unsigned int family_code() const { return (reg_eax >> 8) & 0x0F; } // プロセッサタイプ unsigned int processor_type() const { return (reg_eax >> 12) & 0x03; } // 拡張モデル unsigned int ex_model() const { return (reg_eax >> 16) & 0x0F; } // 拡張ファミリ unsigned int ex_family() const { return (reg_eax >> 20) & 0xFF; } // プロセッサシグネチャ unsigned int processor_signature() const { return reg_eax; } // EBX // ブランドID unsigned int brand_id() const { return reg_ebx & 0xFF; } // チャンク unsigned int chunk() const { return (reg_ebx >> 8) & 0xFF; } // APIC ID unsigned int apic_id() const { return (reg_ebx >> 24) & 0xFF; } // ブランド名 const char * brand_name() const; // EDX // オンチップの浮動小数点演算ユニット // true なら Intel387 浮動小数点命令セットをサポートするFPUを内臓している。 bool fpu() const { return reg_edx & 0x00000001; } // 仮想モード拡張 // true なら仮想 8086 モードへの拡張をサポートしている。 bool vme() const { return reg_edx & 0x00000002; } // デバッグ機能拡張 // true なら I/O ブレークポイントをサポートしている。 bool de() const { return reg_edx & 0x00000004; } // ページサイズ拡張 // true なら 4Mバイトのページをサポートしている。 bool pse() const { return reg_edx & 0x00000008; } // タイムスタンプカウンタ // true ならアクセス/特権制御用の CR4.TSD ビットを含めた RDTSC 命令をサポートしている。 bool tsc() const { return reg_edx & 0x00000010; } // モデル固有レジスタ // true なら RDMSR 命令と WRMSR 命令によってモデル固有レジスタが組み込まれている。 bool msr() const { return reg_edx & 0x00000020; } // 物理アドレス拡張 // true なら 32 ビットを超える物理アドレスをサポートしている。 bool pae() const { return reg_edx & 0x00000040; } // マシンチェック例外 // true ならマシンチェック例外、例外 18、および CR4.MCE イネーブルビットをサポートしている。 bool mce() const { return reg_edx & 0x00000080; } // CMPXCHG8命令のサポート // true なら比較および交換を実行する 8 バイト命令をサポートする。 bool cx8() const { return reg_edx & 0x00000100; } // オンチップAPICハードウェアのサポート // true ならソフトウェアアクセスが可能なローカル APIC を格納する。 bool apic() const { return reg_edx & 0x00000200; } // 高速システムコール // true なら SYSENTER と SYSEXIT をサポートしている。 bool sep() const { return (reg_edx & 0x00000800) && 0x00000633 <= (reg_eax & 0x0FFF3FFF); } // メモリタイプレンジレジスタ // true ならメモリタイプレンジレジスタ( MTRR_CAP レジスタ)をサポートしている。 bool mtrr() const { return reg_edx & 0x00001000; } // ページグローバルイネーブル // true なら PDE(page directory entries) と PTE(page table entries) のグローバルビットをサポートしている。 bool pge() const { return reg_edx & 0x00002000; } // マシンチェックアーキテクチャ // true ならマシンチェックアキテクチャ( MCG_CAP レジスタ)をサポートしている。 bool mca() const { return reg_edx & 0x00004000; } // 条件付移動命令のサポート // true なら CMOVcc をサポートしている。 bool cmov() const { return reg_edx & 0x00008000; } // ページ属性テーブル // true ならページ属性テーブルをサポートしている。 bool pat() const { return reg_edx & 0x00010000; } // 36ビットページサイズ拡張 // true ならプロセッサが 4M バイトページをサポートしている。 bool pse_36() const { return reg_edx & 0x00020000; } // プロセッサシリアルナンバーのサポートとイネーブル // true なら 96 ビットのプロセッサシリアルナンバー機能をサポートしていて且つ有効になっている。 bool psn() const { return reg_edx & 0x00040000; } // CLFLUSH命令のサポート // true なら CLFUSH 命令をサポートしている。 bool clfsh() const { return reg_edx & 0x00080000; } // デバッグストア // true なら分岐先および分岐元アドレスの履歴をメモリバッファに書き込む機能をサポートしている。 bool ds() const { return reg_edx & 0x00200000; } // 温度モニタおよびソフトウェア制御されるクロック機能のサポート // true ならプロセッサ温度をモニタし、ソフトウェア制御化でプロセッサパフォーマンスを定義済みデューティサイクルに合わせる内部 MSR を実装している。 bool acpi() const { return reg_edx & 0x00400000; } // インテルアーキテクチャMMXテクノロジのサポート // true なら MMX テクロノジ命令をサポートしている。 bool mmx() const { return reg_edx & 0x00800000; } // 浮動小数点コンテキストの高速セーブ/リストア // true なら FXSAVE 命令と FXRSTOR 命令をサポートしている。 bool fxsr() const { return reg_edx & 0x01000000; } // ストリーミングSIMD拡張命令のサポート // true ならストリーミング SIMD 拡張命令をサポートしている。 bool sse() const { return reg_edx & 0x02000000; } // ストリーミングSIMD拡張命令2のサポート // true ならストリーミング SIMD 拡張命令2をサポートしている。 bool sse2() const { return reg_edx & 0x04000000; } // セルフスヌープ // true ならプロセッサはパスに出されたトランザクションに対して自身のキャッシュ構造をスヌープすることにより、メモリタイプの矛盾に対処できる。 bool ss() const { return reg_edx & 0x08000000; } // 温度モニタのサポート // true なら温度モニタの自動熱制御回路(TCC)を実装している。 bool tm() const { return reg_edx & 0x20000000; } }; // 基本情報:0x02 // キャッシュ特性とTLB特性のディスクリプタ class cpuid_cache_n_tlb :public cpuid_info { public: cpuid_cache_n_tlb() :cpuid_info(0x02) { } unsigned int size() const { return reg_eax & 0xFF; } bool is_valid(int index) const { assert(0 <= index); assert(index < 4); return (®_eax)[index] & 0x80000000; } unsigned int operator [] (int index) const { assert(0 <= index); assert(index < 4); if (0 == index) { return reg_eax & 0xFFFFFF00; } return (®_eax)[index]; } }; // 基本情報:0x03 // プロセッサシリアルナンバーの中位32ビット+下位32ビット class cpuid_serial_number_body :public cpuid_info { public: cpuid_serial_number_body() :cpuid_info(0x03) { } unsigned int middle() const { return reg_edx; } unsigned int last() const { return reg_ecx; } }; // プロセッサシリアルナンバー class cpuid_serial_number { public: unsigned int first; unsigned int middle; unsigned int last; cpuid_serial_number(const cpuid_signature &X = cpuid_signature(), const cpuid_serial_number_body &Y = cpuid_serial_number_body()) :first(X.reg_eax) { middle = Y.middle(); last = Y.last(); } unsigned int operator [] (int index) const { assert(0 <= index); assert(index < 3); return (&first)[index]; } }; class cpuid_serial_number_string { public: char value[sizeof("XXXX-XXXX-XXXX-XXXX-XXXX-XXXX")]; cpuid_serial_number_string(const cpuid_serial_number &X = cpuid_serial_number()); operator const char * () const { return value; } }; // 拡張機能:0x80000000 // 拡張機能最大インデックス class cpuid_extra_maxindex :public cpuid_info { public: cpuid_extra_maxindex() :cpuid_info(0x80000000) { } unsigned int get_value() const { return reg_eax; } operator unsigned int () const { return reg_eax; } // 拡張機能のサポート bool enabled_extra() const { return reg_eax & 0x80000000; } // プロセッサブランドストリング機能のサポート bool enabled_brand_string() const { return reg_eax >= 0x80000004; } }; // 拡張機能:0x80000002 // 拡張機能:0x80000003 // 拡張機能:0x80000004 class cpuid_processor_brand_string { public: cpuid_info X80000002, X80000003, X80000004; cpuid_processor_brand_string() :X80000002(0x80000002), X80000003(0x80000003), X80000004(0x80000004) { } bool is_valid() const { return 0 == (X80000004.reg_edx >> 24); } const char *get_original() const { return is_valid() ? (const char *)this: "不明"; } #if defined(__BORLANDC__) # pragma warn -8027 #endif const char *get_string() const { const char *X = get_original(); while(0x20 == *X) ++X; // 先頭のスペースをスキップ return X; } #if defined(__BORLANDC__) # pragma warn .8027 #endif operator const char * () const { return get_string(); } }; } // ia32info #endif // __IA32INFO_H__ /****************************************************************************** □■□■ Wraith the Trickster □■□■ ■□■□ 〜I'll go with heaven's advantage and fool's wisdom.〜 ■□■□ ******************************************************************************/