X86: Mark serializing macroops and regular instructions as such.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 23 Aug 2010 16:44:19 +0000 (09:44 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 23 Aug 2010 16:44:19 +0000 (09:44 -0700)
src/arch/x86/isa/formats/cpuid.isa
src/arch/x86/isa/insts/general_purpose/control_transfer/interrupts_and_exceptions.py
src/arch/x86/isa/insts/general_purpose/data_transfer/move.py
src/arch/x86/isa/insts/system/invlpg.py
src/arch/x86/isa/insts/system/msrs.py
src/arch/x86/isa/insts/system/segmentation.py

index 64a3f70a2851f2abfd324f4ef511939f0a5000c1..cc3070dedf630d275ce9a4a2cc4c67404236b871 100644 (file)
@@ -45,6 +45,8 @@ output header {{
                 OpClass __opClass) :
             X86ISA::X86StaticInst(_mnemonic, _machInst, __opClass)
         {
+            flags[IsSerializing] = 1;
+            flags[IsSerializeAfter] = 1;
         }
 
         std::string generateDisassembly(Addr pc,
index 925f4bef319d5204c58f430b878947e3bb974eda..f8bafa540fa8004ae1b4fdf757e0b06bada6c0d3 100644 (file)
 
 microcode = '''
 def macroop IRET_REAL {
+    .serializing
     panic "Real mode iret isn't implemented!"
 };
 
 def macroop IRET_PROT {
+    .serializing
     .adjust_env oszIn64Override
 
     # Check for a nested task. This isn't supported at the moment.
index a43325288658dec0c34aa8f6b5eeef15bbd94a9e..3f5c2d303267ba1047abd7ead076df0351269559 100644 (file)
@@ -174,16 +174,19 @@ def macroop MOVZX_W_R_P {
 };
 
 def macroop MOV_C_R {
+    .serializing
     .adjust_env maxOsz
     wrcr reg, regm
 };
 
 def macroop MOV_R_C {
+    .serializing
     .adjust_env maxOsz
     rdcr reg, regm
 };
 
 def macroop MOV_D_R {
+    .serializing
     .adjust_env maxOsz
     wrdr reg, regm
 };
index a54451a54514a200a5ef7c3b2a4620f0e2edaf1f..6d7292d50da634b8045a1ed80fd414c122cc7270 100644 (file)
 
 microcode = '''
 def macroop INVLPG_M {
+    .serializing
     tia seg, sib, disp
 };
 
 def macroop INVLPG_P {
+    .serializing
     rdip t7
     tia seg, riprel, disp
 };
index 95832442c7e577f41c042cbe9e6c7c32d02326c6..d0e2675de47f2d131d379d9306b5d873c7ff9a78 100644 (file)
@@ -50,6 +50,7 @@ def macroop RDMSR
 
 def macroop WRMSR
 {
+    .serializing
     mov t2, t2, rax, dataSize=4
     slli t3, rdx, 32, dataSize=8
     or t2, t2, t3, dataSize=8
index 9675501bbf3f71bf6becc7a2c3b8133799f6c8ea..5ecb2e1930caec027d883b8b84b4c2d727bce211 100644 (file)
@@ -38,6 +38,7 @@
 microcode = '''
 def macroop LGDT_M
 {
+    .serializing
     .adjust_env maxOsz
 
     # Get the limit
@@ -50,6 +51,7 @@ def macroop LGDT_M
 
 def macroop LGDT_P
 {
+    .serializing
     .adjust_env maxOsz
 
     rdip t7
@@ -68,6 +70,7 @@ def macroop LGDT_P
 
 def macroop LGDT_16_M
 {
+    .serializing
     .adjust_env maxOsz
 
     # Get the limit
@@ -81,6 +84,7 @@ def macroop LGDT_16_M
 
 def macroop LGDT_16_P
 {
+    .serializing
     .adjust_env maxOsz
 
     rdip t7
@@ -95,6 +99,7 @@ def macroop LGDT_16_P
 
 def macroop LIDT_M
 {
+    .serializing
     .adjust_env maxOsz
 
     # Get the limit
@@ -107,6 +112,7 @@ def macroop LIDT_M
 
 def macroop LIDT_P
 {
+    .serializing
     .adjust_env maxOsz
 
     rdip t7
@@ -125,6 +131,7 @@ def macroop LIDT_P
 
 def macroop LIDT_16_M
 {
+    .serializing
     .adjust_env maxOsz
 
     # Get the limit
@@ -138,6 +145,7 @@ def macroop LIDT_16_M
 
 def macroop LIDT_16_P
 {
+    .serializing
     .adjust_env maxOsz
 
     rdip t7
@@ -152,6 +160,7 @@ def macroop LIDT_16_P
 
 def macroop LTR_R
 {
+    .serializing
     chks reg, t0, TRCheck
     limm t4, 0, dataSize=8
     srli t4, reg, 3, dataSize=2
@@ -168,6 +177,7 @@ def macroop LTR_R
 
 def macroop LTR_M
 {
+    .serializing
     ld t5, seg, sib, disp, dataSize=2
     chks t5, t0, TRCheck
     limm t4, 0, dataSize=8
@@ -185,6 +195,7 @@ def macroop LTR_M
 
 def macroop LTR_P
 {
+    .serializing
     rdip t7
     ld t5, seg, riprel, disp, dataSize=2
     chks t5, t0, TRCheck
@@ -203,6 +214,7 @@ def macroop LTR_P
 
 def macroop LLDT_R
 {
+    .serializing
     chks reg, t0, InGDTCheck, flags=(EZF,)
     br label("end"), flags=(CEZF,)
     limm t4, 0, dataSize=8
@@ -219,6 +231,7 @@ end:
 
 def macroop LLDT_M
 {
+    .serializing
     ld t5, seg, sib, disp, dataSize=2
     chks t5, t0, InGDTCheck, flags=(EZF,)
     br label("end"), flags=(CEZF,)
@@ -236,6 +249,7 @@ end:
 
 def macroop LLDT_P
 {
+    .serializing
     rdip t7
     ld t5, seg, riprel, disp, dataSize=2
     chks t5, t0, InGDTCheck, flags=(EZF,)