sim: Add an option to forward work items to Python
[gem5.git] / src / sim / arguments.hh
index 97b848e03046c26db82f9b1cf3f971e37dbbe9a7..1658800951347f85f33841c8872ab199de737ee2 100644 (file)
 #define __SIM_ARGUMENTS_HH__
 
 #include <cassert>
+#include <memory>
 
-#include "arch/vtophys.hh"
-#include "base/refcnt.hh"
 #include "base/types.hh"
-#include "mem/vport.hh"
+#include "mem/fs_translating_port_proxy.hh"
 
 class ThreadContext;
 
@@ -45,10 +44,10 @@ class Arguments
   protected:
     ThreadContext *tc;
     int number;
-    uint64_t getArg(uint8_t size, bool fp = false);
+    uint64_t getArg(uint16_t size = (uint16_t)(-1), bool fp = false);
 
   protected:
-    class Data : public RefCounted
+    class Data
     {
       public:
         Data(){}
@@ -61,12 +60,12 @@ class Arguments
         char *alloc(size_t size);
     };
 
-    RefCountingPtr<Data> data;
+    std::shared_ptr<Data> data;
 
   public:
     Arguments(ThreadContext *ctx, int n = 0)
-        : tc(ctx), number(n), data(NULL)
-        { assert(number >= 0); data = new Data;}
+        : tc(ctx), number(n), data(new Data())
+    { assert(number >= 0); }
     Arguments(const Arguments &args)
         : tc(args.tc), number(args.number), data(args.data) {}
     ~Arguments() {}
@@ -74,15 +73,17 @@ class Arguments
     ThreadContext *getThreadContext() const { return tc; }
 
     const Arguments &operator=(const Arguments &args) {
-        tc = args.tc;
-        number = args.number;
-        data = args.data;
+        if (this != &args) {
+            tc = args.tc;
+            number = args.number;
+            data = args.data;
+        }
         return *this;
     }
 
     // for checking if an argument is NULL
     bool operator!() {
-        return getArg(TheISA::MachineBytes) == 0;
+        return getArg() == 0;
     }
 
     Arguments &operator++() {
@@ -130,20 +131,20 @@ class Arguments
     template <class T>
     operator T() {
         assert(sizeof(T) <= sizeof(uint64_t));
-        T data = static_cast<T>(getArg(sizeof(T)));
-        return data;
+        T d = static_cast<T>(getArg(sizeof(T)));
+        return d;
     }
 
     template <class T>
     operator T *() {
         T *buf = (T *)data->alloc(sizeof(T));
-        CopyData(tc, buf, getArg(sizeof(T)), sizeof(T));
+        CopyOut(tc, buf, getArg(sizeof(T)), sizeof(T));
         return buf;
     }
 
     operator char *() {
         char *buf = data->alloc(2048);
-        CopyStringOut(tc, buf, getArg(TheISA::MachineBytes), 2048);
+        CopyStringOut(tc, buf, getArg(), 2048);
         return buf;
     }
 };