Syscall: Make the syscall function available in both SE and FS modes.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 19 Sep 2011 09:46:48 +0000 (02:46 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 19 Sep 2011 09:46:48 +0000 (02:46 -0700)
In FS mode the syscall function will panic, but the interface will be
consistent and code which calls syscall can be compiled in. This will allow,
for instance, instructions that use syscall to be built unconditionally but
then not returned by the decoder.

src/cpu/inorder/inorder_dyn_inst.cc
src/cpu/inorder/inorder_dyn_inst.hh
src/cpu/o3/dyn_inst.hh
src/cpu/o3/dyn_inst_impl.hh
src/cpu/simple/base.hh

index f65d2ea9fd249ba03117efbcc08b18d56c8900f9..ff178f6d3ee56cc60119c8b0951737aa6892ca83 100644 (file)
@@ -311,14 +311,18 @@ InOrderDynInst::simPalCheck(int palFunc)
 #endif
     return this->cpu->simPalCheck(palFunc, this->threadNumber);
 }
-#else
+#endif
+
 void
 InOrderDynInst::syscall(int64_t callnum)
 {
+#if FULL_SYSTEM
+    panic("Syscall emulation isn't available in FS mode.\n");
+#else
     syscallNum = callnum;
     cpu->syscallContext(NoFault, this->threadNumber, this);
-}
 #endif
+}
 
 void
 InOrderDynInst::setSquashInfo(unsigned stage_num)
index 3427af86b249450c1c71b3b0be808d37bb0cb305..f49476ec595c5d4763176918279bd8bdb12a4b5a 100644 (file)
@@ -525,10 +525,10 @@ class InOrderDynInst : public FastAlloc, public RefCounted
     bool simPalCheck(int palFunc);
 #else
     short syscallNum;
+#endif
 
-    /** Calls a syscall. */
+    /** Emulates a syscall. */
     void syscall(int64_t callnum);
-#endif
 
     ////////////////////////////////////////////////////////////
     //
index 399240d69ad8bebc89a7deac5eb6a48953b859aa..e58eb99c5f3a9a393ca9128bca897f7ff4cb6199 100644 (file)
@@ -205,11 +205,11 @@ class BaseO3DynInst : public BaseDynInst<Impl>
     /** Traps to handle specified fault. */
     void trap(Fault fault);
     bool simPalCheck(int palFunc);
-#else
-    /** Calls a syscall. */
-    void syscall(int64_t callnum);
 #endif
 
+    /** Emulates a syscall. */
+    void syscall(int64_t callnum);
+
   public:
 
     // The register accessor methods provide the index of the
index eceb0b49f99565da1f794ab614b834771952f9f5..500d63de88ba0d547301a34062ebdb3e2c928044 100644 (file)
@@ -188,11 +188,15 @@ BaseO3DynInst<Impl>::simPalCheck(int palFunc)
 #endif
     return this->cpu->simPalCheck(palFunc, this->threadNumber);
 }
-#else
+#endif
+
 template <class Impl>
 void
 BaseO3DynInst<Impl>::syscall(int64_t callnum)
 {
+#if FULL_SYSTEM
+    panic("Syscall emulation isn't available in FS mode.\n");
+#else
     // HACK: check CPU's nextPC before and after syscall. If it
     // changes, update this instruction's nextPC because the syscall
     // must have changed the nextPC.
@@ -202,6 +206,6 @@ BaseO3DynInst<Impl>::syscall(int64_t callnum)
     if (!(curPC == newPC)) {
         this->pcState(newPC);
     }
-}
 #endif
+}
 
index b27ebf9984e39664bd3f49de5a93c6e93e8cbdd1..ad281aa2b88b45ee7a91246fd0d021b48b677383 100644 (file)
@@ -402,9 +402,17 @@ class BaseSimpleCPU : public BaseCPU
 #if FULL_SYSTEM
     Fault hwrei() { return thread->hwrei(); }
     bool simPalCheck(int palFunc) { return thread->simPalCheck(palFunc); }
+#endif
+
+    void
+    syscall(int64_t callnum)
+    {
+#if FULL_SYSTEM
+        panic("Syscall emulation isn't available in FS mode.\n");
 #else
-    void syscall(int64_t callnum) { thread->syscall(callnum); }
+        thread->syscall(callnum);
 #endif
+    }
 
     bool misspeculating() { return thread->misspeculating(); }
     ThreadContext *tcBase() { return tc; }