EN JA
CPUCTL(4)
CPUCTL(4) FreeBSD Kernel Interfaces Manual CPUCTL(4)

名称

cpuctlcpuctl 疑似デバイス

書式

このドライバをカーネルにコンパイルするためには、次の行を利用者のカーネル設定ファイルに置きます:

device cpuctl

もう一つの方法として、ブート時にモジュールとしてドライバをロードするためには、次の行を loader.conf(5) に置きます:

cpuctl_load="YES"

解説

特別なデバイス /dev/cpuctl は、システム CPU へのインタフェースを提供します。それは、CPUID 情報を検索して、マシンの特定のレジスタ (MSR) に読み込み/書き込みし、CPU ファームウェアの更新を実行する機能を提供します。

システムに存在する各 CPU に関しては、適切なインデックスがある特別なデバイス /dev/cpuctl%d が作成されます。複数のコアがある CPU に関しては、特別なデバイスは、コア毎に作成されます。

現在、i386 と amd64 プロセッサだけがサポートされています。

IOCTL インタフェース

サポートされてる操作のすべては、 ioctl(2) システムコールを使用して呼び出されます。現在、次の ioctl が定義されています:
CPUCTL_RDMSR cpuctl_msr_args_t *args
CPUCTL_WRMSR cpuctl_msr_args_t *args
CPU のマシンの特定のレジスタを読み書きします。 cpuctl_msr_args_t 構造体は、次の < sys/cpuctl.h> で定義されています:

typedef struct { 
 int  msr; /* 読み込む MSR */ 
 uint64_t data; 
} cpuctl_msr_args_t;
CPUCTL_MSRSBIT cpuctl_msr_args_t *args
CPUCTL_MSRCBIT cpuctl_msr_args_t *args
data フィールドで与えられたマスクに従って、MSR ビットを設定するか、またはクリアします。
CPUCTL_CPUID cpuctl_cpuid_args_t *args
CPUID 情報を検索します。引数は、次の struct で供給されます:

typedef struct { 
 int  level; /* CPUID レベル */ 
 uint32_t data[4]; 
} cpuctl_cpuid_args_t;

level フィールドは、情報を検索する CPUID レベルを示しますが、一方 data フィールドは、受信された CPUID データを格納するために使用されます。

CPUCTL_UPDATE cpuctl_update_args_t *args
CPU ファームウェア (マイクロコード) を更新します。構造体は、次の < sys/cpuctl.h> で定義されています:

typedef struct { 
 void *data; 
 size_t size; 
} cpuctl_update_args_t;

data フィールドは、サイズ size のファームウェアイメージを指すべきです。

追加情報については、 cpuctl.h を参照してください。

戻り値

[ ENXIO]
要求された操作が、デバイスで、サポートされていません (例えば、サポートされないアーキテクチャ、または CPU が無効にされています)。
[ EINVAL]
不正な要求が、提供されたか、またはマイクロコードイメージが、正しくありません。
[ ENOMEM]
物理的なメモリが、要求を終了するために利用可能ではありませんでした。
[ EFAULT]
ファームウェアイメージのアドレスが、プロセスのアドレス空間の外を指しています。

関連ファイル

/dev/cpuctl

関連項目

hwpmc(4), cpucontrol(8)

歴史

cpuctl ドライバは、 FreeBSD 7.2 ではじめて登場しました。

作者

cpuctl モジュールとこのマニュアルページは、 Stanislav Sedov <stas@FreeBSD.org>によって書かれました。

バグ

たぶん、あります、もしあれば報告してください。
June 30, 2009 FreeBSD