X86: Implement a "halt" microop.
authorGabe Black <gblack@eecs.umich.edu>
Fri, 19 Oct 2007 22:10:23 +0000 (15:10 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Fri, 19 Oct 2007 22:10:23 +0000 (15:10 -0700)
--HG--
extra : convert_revision : 53a846a157e4dce42343b81901df1207738f62cd

src/arch/x86/isa/microops/specop.isa

index ca4a6dc577009b3b0f601fb42544df6f10caf46b..dfc7f3e8b52f8cc9daed39ea750aa624bd21089d 100644 (file)
@@ -77,6 +77,25 @@ output header {{
         std::string generateDisassembly(Addr pc,
                 const SymbolTable *symtab) const;
     };
+
+    class MicroHalt : public X86ISA::X86MicroopBase
+    {
+      public:
+        MicroHalt(ExtMachInst _machInst, const char * instMnem,
+                bool isMicro, bool isDelayed, bool isFirst, bool isLast) :
+            X86MicroopBase(_machInst, "halt", instMnem,
+                    isMicro, isDelayed, isFirst, isLast, No_OpClass)
+        {
+        }
+
+        MicroHalt(ExtMachInst _machInst, const char * instMnem) :
+            X86MicroopBase(_machInst, "halt", instMnem,
+                    false, false, false, false, No_OpClass)
+        {
+        }
+
+        %(BasicExecDeclare)s
+    };
 }};
 
 def template MicroFaultDeclare {{
@@ -111,6 +130,16 @@ def template MicroFaultExecute {{
         }
 }};
 
+output exec {{
+    Fault
+    MicroHalt::execute(%(CPU_exec_context)s *xc,
+            Trace::InstRecord * traceData) const
+    {
+        xc->suspend();
+        return NoFault;
+    }
+}};
+
 output decoder {{
     inline MicroFaultBase::MicroFaultBase(
             ExtMachInst machInst, const char * instMnem,
@@ -209,4 +238,14 @@ let {{
     header_output += MicroFaultDeclare.subst(iop)
     decoder_output += MicroFaultConstructor.subst(iop)
     microopClasses["fault"] = Fault
+
+    class Halt(X86Microop):
+        def __init__(self):
+            pass
+
+        def getAllocator(self, *microFlags):
+            return "new MicroHalt(machInst, mnemonic %(flags)s)" % \
+                    self.microFlagsText(microFlags)
+
+    microopClasses["halt"] = Halt
 }};