CPUID Package

Tcl 8.4.7のソースコードには、X86 CPUのCPUIDを返すコマンドが試験的に実装されています。
しかし、Tcl 8.4.7限定で、普通にビルドしただけでは使えないので、そのコマンドだけ切り出して、
Tcl拡張パッケージにしました。これならTcl 8.1以上で動作します。

インストール

Tcl/libにcpuid1.0というフォルダを作成し、そこにcpuid.dllとpkgIndex.tclを入れます。

使い方

使い方は簡単で、cpuidコマンドに0〜2の値を渡すとCPUIDが返ります。
たとえば、cpuid 1を実行して最初の値(0x00000f34)の28bit目を見て、
ここが立っていた(1になっていた)場合、Hyper-Threadingをサポートしていると判断する。
返る値はバイト単位にスワップされているので、(0x340f0000)とスワップした方が見やすい。

package require cpuid

eval format \"%8.8x %8.8x %8.8x\" [::cpuid::cpuid 0]
=> 00000005 756e6547 6c65746e

eval format \"%8.8x %8.8x %8.8x\" [::cpuid::cpuid 1]
=> 00000f34 00020800 0000441d

eval format \"%8.8x %8.8x %8.8x\" [::cpuid::cpuid 2]
=> 605b5001 00000000 00000000

CPUIDの詳細は、The CPUID Guideを参照してください。

ダウンロード

こちらからダウンロードできます。(フリーです。) Windowsで動作します。
動作させるには、Tcl 8.1以上が必要です。

サンプル

最近のPentium 4の三種の神器(HT, NX, 64bit)をチェックしてみましょう。

CPUIDチェック

package require cpuid

proc swap {x} {
    format "0x%2.2x%2.2x%2.2x%2.2x" \
        [expr ($x & 0xff)] \
        [expr ($x & 0xff00) >> 8] \
        [expr ($x & 0xff0000) >> 16] \
        [expr ($x & 0xff000000) >> 24]
}

pack [text .text -width 40 -height 5]

set result [::cpuid::cpuid 1]
set standard [swap [lindex $result 0]]
set standard2 [swap [lindex $result 1]]
set ncpu [expr ($standard2 & 0xff00) >> 8]
set extended [swap [lindex $result 2]]

# bit28
if {$standard & 0x10000000} {
    if {$ncpu >= 2} {
        .text insert end "Hyper-Threading Technology (HTT): Enable\n"
    } else {
        .text insert end "Hyper-Threading Technology (HTT): Disable\n"
    }
} else {
    .text insert end "Hyper-Threading: Not Supported\n"
}

# bit20
if {$extended & 0x100000} {
    .text insert end "No-execute Page Protection (NX): Supported\n"
} else {
    .text insert end "No-execute Page Protection (NX): Not Supported\n"
}

# bit29
if {$extended & 0x20000000} {
    .text insert end "64-Bit Extensions (IA-32e): Supported\n"
} else {
    .text insert end "64-Bit Extensions (IA-32e): Not Supported\n"
}

# bit30
if {$standard & 0x40000000} {
    .text insert end "IA-64 Processor Capable (IA-64): Supported\n"
} else {
    .text insert end "IA-64 Processor Capable (IA-64): Not Supported\n"
}