x86: Implement the RDTSCP instruction.
authorGabe Black <gabeblack@google.com>
Tue, 13 Mar 2018 00:41:15 +0000 (17:41 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 14 Mar 2018 20:07:38 +0000 (20:07 +0000)
This is very similar to RDTSC, except that it requires all younger
instructions to retire before it completes, and it writes the TSC_AUX
MSR into ECX. I've added an mfence as an iniitial microop to ensure
that memory accesses complete before RDTSCP runs, and added an rdval
microop at the end to read the TSC_AUX value into ECX.

Change-Id: I9766af562b7fd0c22e331b56e06e8818a9e268c9
Reviewed-on: https://gem5-review.googlesource.com/9043
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/arch/x86/isa/insts/system/msrs.py

index aa60e4c48a0a9691be759e2cd73f60a177c904c9..761e8381ec547618868a284b17c85875e59cd97a 100644 (file)
                 0x7: decode MODRM_MOD {
                     0x3: decode MODRM_RM {
                         0x0: Inst::SWAPGS();
-                        0x1: rdtscp();
+                        0x1: Inst::RDTSCP();
                         default: Inst::UD2();
                     }
                     default: Inst::INVLPG(M);
index fe9c5b262623b9b90f0bb6edf1020e59d1471b6a..b79b6dbe9b1b0a9289370d39a4ad7cd6eef1348e 100644 (file)
@@ -66,4 +66,15 @@ def macroop RDTSC
     srli t1, t1, 32, dataSize=8
     mov rdx, rdx, t1, dataSize=4
 };
+
+def macroop RDTSCP
+{
+    .serialize_before
+    mfence
+    rdtsc t1
+    mov rax, rax, t1, dataSize=4
+    srli t1, t1, 32, dataSize=8
+    mov rdx, rdx, t1, dataSize=4
+    rdval rcx, "InstRegIndex(MISCREG_TSC_AUX)", dataSize=4
+};
 '''