• 検索結果がありません。

RDPMC—Read Performance-Monitoring Counters(続き)

RDPMC 命令は、命令をシリアル化しない。すなわち、先行する命令によって発生し

たすべてのイベントが完了していること、または後続の命令によって発生するイベン トが開始していないことを保証していない。正確なイベントカウントが必要な場合 は、ソフトウェアは、RDPMC 命令の前、後、またはその両方で(CPUID 命令などの)

シリアル化命令を挿入しなければならない。

インテルPentium4 プロセッサおよびインテルXeon プロセッサでは、バックツーバッ ク高速読み込みの実行が単調になるという保証はない。バックツーバック読み込みの 単調性を保証するためには、シリアル化命令を2つの RDPMC 命令間に配置する必要 がある。

RDPMC 命令は、16ビット・アドレス指定モードまたは仮想8086モードで実行するこ とができるが、ECX レジスタの内容すべてを使用してカウンタを選択し、イベントカ ウントはすべての EAX レジスタおよび EDX レジスタにストアされる。

RDPMC 命令は、インテル® Pentium® Pro プロセッサおよび MMX® テクノロジを実装し た インテルPentium プロセッサで IA-32アーキテクチャに導入された。初期の インテル Pentium プロセッサにも性能モニタリング・カウンタがあるが、RDMSR 命令で読み取 らなければならない。

操作

(* P6 family processors and Pentium processor with MMX technology *) IF (ECX=0 OR 1) AND ((CR4.PCE=1) OR (CPL=0) OR (CR0.PE=0))

THEN

EAX ← PMC(ECX)[31:0];

EDX ← PMC(ECX)[39:32];

ELSE (* ECX is not 0 or 1 or CR4.PCE is 0 and CPL is 1, 2, or 3 and CR0.PE is 1*)

#GP(0); FI;

(* Pentium 4 and Intel Xeon processor *)

IF (ECX[30:0]=0 ... 17) AND ((CR4.PCE=1) OR (CPL=0) OR (CR0.PE=0)) THEN IF ECX[31] = 0

THEN

EAX ← PMC(ECX[30:0])[31:0]; (* 40-bit read *);

EDX ← PMC(ECX[30:0])[39:32];

ELSE IF ECX[31] = 1 THEN

EAX ← PMC(ECX[30:0])[31:0]; (* 32-bit read *);

EDX ← 0;

FI;

FI;

ELSE (* ECX[30:0] is not 0...17 or CR4.PCE is 0 and CPL is 1, 2, or 3 and CR0.PE is 1 *)

#GP(0); FI;

RDPMC—Read Performance-Monitoring Counters(続き)

影響を受けるフラグ

なし。

保護モード例外

#GP(0) 現行特権レベルが0でなく、CR4レジスタのPCEフラグがクリアさ

れている場合。

(P6ファミリ・プロセッサおよび MMXテクノロジ Pentium プロセッ サ)ECXレジスタの値が0または1でない場合。

(インテル Pentium 4 プロセッサおよびインテル Xeon プロセッサ)

ECX[30:0]の値が0~17の範囲外の場合。ECXレジスタの値が0ま たは1でない場合。

実アドレスモード例外

#GP (P6ファミリ・プロセッサおよび MMXテクノロジ Pentium プロセッ サ)

ECXレジスタの値が0または1でない場合。

(インテル Pentium 4 プロセッサおよびインテル Xeon プロセッサ)

ECX[30:0]の値が0~17の範囲外の場合。

仮想8086モード例外

#GP(0) CR4レジスタのPCEフラグがクリアされている場合。

(P6ファミリ・プロセッサおよび MMX テクノロジ Pentium プロセッ サ)ECXレジスタの値が0または1でない場合。

(インテル Pentium 4 プロセッサおよびインテル Xeon プロセッサ)

ECX[30:0]の値が0~17の範囲外の場合。

説明

プロセッサのタイムスタンプ・カウンタの現在の値をEDX:EAXレジスタにロードす る。タイムスタンプ・カウンタは、64ビットのMSRに包含されている。MSRの上位 32ビットがEDXレジスタにロードされ、下位32ビットがEAXレジスタにロードされ る。プロセッサは、クロックサイクルごとにタイムスタンプ・カウンタMSRを単調 にインクリメントし、プロセッサがリセットされるとカウンタを0にリセットする。

タイムスタンプ・カウンタの動作の詳細は、『IA-32 インテル®・アーキテクチャ・ソ フトウェア・デベロッパーズ・マニュアル、下巻』の第15章の「タイムスタンプ・カ ウンタ」を参照のこと。

保護モードまたは仮想8086モードでは、CR4レジスタのタイムスタンプ・ディスエー ブル(TSD)フラグは、以下のようにRDTSC命令の使用を制限する。TSDフラグが クリアされていると、RDTSC命令はどの特権レベルでも実行することができる。この フラグがセットされていると、命令は特権レベル0だけで実行することができる(実 アドレスモードでは、RDTSC 命令は常にイネーブルである)。

特権レベル0で実行しているときは、RDMSR命令を使用してタイムスタンプ・カウ ンタを読み取ることもできる。

RDTSC命令は、シリアル化命令ではない。そのため、カウンタを読み取る前に、前の

すべての命令が実行されるまで待つことをしない。同様に、読み取り操作が行われる 前に、後続の命令が実行を開始している場合もある。

この命令は、インテル® Pentium®プロセッサでIA-32アーキテクチャに導入された。

操作

IF (CR4.TSD=0) OR (CPL=0) OR (CR0.PE=0) THEN

EDX:EAX ← TimeStampCounter;

ELSE (* CR4.TSD is 1 and CPL is 1, 2, or 3 and CR0.PE is 1 *)

#GP(0) FI;

影響を受けるフラグ なし。

オペコード 命令 説明

0F 31 RDTSC タイムスタンプ・カウンタをEDX:EAXに読み込む。