diff --git a/src/cpu/inorder/inorder_dyn_inst.cc b/src/cpu/inorder/inorder_dyn_inst.cc index f65d2ea9fd..ff178f6d3e 100644 --- a/src/cpu/inorder/inorder_dyn_inst.cc +++ b/src/cpu/inorder/inorder_dyn_inst.cc @@ -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) diff --git a/src/cpu/inorder/inorder_dyn_inst.hh b/src/cpu/inorder/inorder_dyn_inst.hh index 3427af86b2..f49476ec59 100644 --- a/src/cpu/inorder/inorder_dyn_inst.hh +++ b/src/cpu/inorder/inorder_dyn_inst.hh @@ -525,11 +525,11 @@ class InOrderDynInst : public FastAlloc, public RefCounted bool simPalCheck(int palFunc); #else short syscallNum; - - /** Calls a syscall. */ - void syscall(int64_t callnum); #endif + /** Emulates a syscall. */ + void syscall(int64_t callnum); + //////////////////////////////////////////////////////////// // // MULTITHREADING INTERFACE TO CPU MODELS diff --git a/src/cpu/o3/dyn_inst.hh b/src/cpu/o3/dyn_inst.hh index 399240d69a..e58eb99c5f 100644 --- a/src/cpu/o3/dyn_inst.hh +++ b/src/cpu/o3/dyn_inst.hh @@ -205,11 +205,11 @@ class BaseO3DynInst : public BaseDynInst /** 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 diff --git a/src/cpu/o3/dyn_inst_impl.hh b/src/cpu/o3/dyn_inst_impl.hh index eceb0b49f9..500d63de88 100644 --- a/src/cpu/o3/dyn_inst_impl.hh +++ b/src/cpu/o3/dyn_inst_impl.hh @@ -188,11 +188,15 @@ BaseO3DynInst::simPalCheck(int palFunc) #endif return this->cpu->simPalCheck(palFunc, this->threadNumber); } -#else +#endif + template void BaseO3DynInst::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::syscall(int64_t callnum) if (!(curPC == newPC)) { this->pcState(newPC); } -} #endif +} diff --git a/src/cpu/simple/base.hh b/src/cpu/simple/base.hh index b27ebf9984..ad281aa2b8 100644 --- a/src/cpu/simple/base.hh +++ b/src/cpu/simple/base.hh @@ -402,10 +402,18 @@ class BaseSimpleCPU : public BaseCPU #if FULL_SYSTEM Fault hwrei() { return thread->hwrei(); } bool simPalCheck(int palFunc) { return thread->simPalCheck(palFunc); } -#else - void syscall(int64_t callnum) { thread->syscall(callnum); } #endif + void + syscall(int64_t callnum) + { +#if FULL_SYSTEM + panic("Syscall emulation isn't available in FS mode.\n"); +#else + thread->syscall(callnum); +#endif + } + bool misspeculating() { return thread->misspeculating(); } ThreadContext *tcBase() { return tc; } };