sim: Change the syscall executor to a std::function.
authorGabe Black <gabeblack@google.com>
Fri, 22 Nov 2019 08:27:52 +0000 (00:27 -0800)
committerGabe Black <gabeblack@google.com>
Wed, 4 Dec 2019 04:29:50 +0000 (04:29 +0000)
This will enable using other types of callable like a lambda.

Jira Issue: https://gem5.atlassian.net/browse/GEM5-187

Change-Id: If9f7176205492830824b5fe3c00f2c7710f57f70
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23164
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/sim/syscall_desc.cc
src/sim/syscall_desc.hh

index fb39c11b2df195f5844842c601714ca44f43aa55..345bfa114996b871ba51ca82526ac05bb730d802 100644 (file)
@@ -43,7 +43,6 @@
 #include "sim/faults.hh"
 #include "sim/process.hh"
 #include "sim/syscall_debug_macros.hh"
-#include "sim/syscall_return.hh"
 
 void
 SyscallDesc::doSyscall(int callnum, ThreadContext *tc, Fault *fault)
@@ -69,7 +68,7 @@ SyscallDesc::doSyscall(int callnum, ThreadContext *tc, Fault *fault)
                     _name, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]);
 
     /** Invoke the system call */
-    SyscallReturn retval = (*executor)(this, callnum, tc);
+    SyscallReturn retval = executor(this, callnum, tc);
 
     /**
      * If the system call needs to be restarted, most likely due to
index 0b226438a0cb7d239a2ad1174305843162c7522e..8f6e33d89fdef6e5679795e225825d661a29787e 100644 (file)
 #ifndef __SIM_SYSCALL_DESC_HH__
 #define __SIM_SYSCALL_DESC_HH__
 
+#include <functional>
 #include <string>
 
 #include "base/types.hh"
+#include "sim/syscall_return.hh"
 
 class Process;
 class SyscallDesc;
-class SyscallReturn;
 class ThreadContext;
 
 SyscallReturn unimplementedFunc(SyscallDesc *desc, int num,
@@ -66,15 +67,13 @@ SyscallReturn unimplementedFunc(SyscallDesc *desc, int num,
  */
 class SyscallDesc {
   public:
-    /** Typedef the function pointer here to clean up code below */
-    typedef SyscallReturn (*SyscallExecutor)(SyscallDesc*, int num,
-                                             ThreadContext*);
+    using SyscallExecutor =
+        std::function<SyscallReturn(SyscallDesc *, int num, ThreadContext *)>;
 
     SyscallDesc(const char *name,
-                SyscallExecutor sys_exec=unimplementedFunc, int flags=0)
+            SyscallExecutor sys_exec=unimplementedFunc, int flags=0)
         : _name(name), executor(sys_exec), _flags(flags), _warned(false)
-    {
-    }
+    {}
 
     /** Provide a mechanism to specify behavior for abnormal system calls */
     enum Flags {