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に読み込む。