arch-arm: Add initial support for SVE contiguous loads/stores
[gem5.git] / src / arch / sparc / process.hh
index 2512441c61f9aa41e727439d3e4bba7f6a0d606b..eeb267116382f79fa42bac07c39d20e2bcfd1a70 100644 (file)
 #ifndef __SPARC_PROCESS_HH__
 #define __SPARC_PROCESS_HH__
 
+#include <memory>
 #include <string>
 #include <vector>
-#include "sim/process.hh"
 
-class ObjectFile;
-class System;
+#include "arch/sparc/isa_traits.hh"
+#include "base/loader/object_file.hh"
+#include "mem/page_table.hh"
+#include "sim/byteswap.hh"
+#include "sim/process.hh"
 
-class SparcLiveProcess : public LiveProcess
+class SparcProcess : public Process
 {
   protected:
 
-    //The locations of the fill and spill handlers
-    Addr fillStart, spillStart;
-
-    SparcLiveProcess(const std::string &nm, ObjectFile *objFile,
-                System *_system, int stdin_fd, int stdout_fd, int stderr_fd,
-                std::vector<std::string> &argv,
-                std::vector<std::string> &envp,
-                const std::string &cwd,
-                uint64_t _uid, uint64_t _euid,
-                uint64_t _gid, uint64_t _egid,
-                uint64_t _pid, uint64_t _ppid);
+    const Addr StackBias;
 
-  public:
+    // The locations of the fill and spill handlers
+    Addr fillStart, spillStart;
 
-    //Handles traps which request services from the operating system
-    virtual void handleTrap(int trapNum, ThreadContext *tc);
+    SparcProcess(ProcessParams * params, ObjectFile *objFile,
+                 Addr _StackBias);
 
-    Addr readFillStart()
-    { return fillStart; }
+    void initState();
 
-    Addr readSpillStart()
-    { return spillStart; }
+    template<class IntType>
+    void argsInit(int pageSize);
 
-};
+  public:
 
-struct M5_32_auxv_t
-{
-    int32_t a_type;
-    union {
-        int32_t a_val;
-        int32_t a_ptr;
-        int32_t a_fcn;
-    };
+    // Handles traps which request services from the operating system
+    virtual void handleTrap(int trapNum, ThreadContext *tc, Fault *fault);
 
-    M5_32_auxv_t()
-    {}
+    Addr readFillStart() { return fillStart; }
+    Addr readSpillStart() { return spillStart; }
 
-    M5_32_auxv_t(int32_t type, int32_t val);
+    virtual void flushWindows(ThreadContext *tc) = 0;
+    void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
 };
 
-class Sparc32LiveProcess : public SparcLiveProcess
+class Sparc32Process : public SparcProcess
 {
   protected:
 
-    std::vector<M5_32_auxv_t> auxv;
-
-    Sparc32LiveProcess(const std::string &nm, ObjectFile *objFile,
-                System *_system, int stdin_fd, int stdout_fd, int stderr_fd,
-                std::vector<std::string> &argv,
-                std::vector<std::string> &envp,
-                const std::string &cwd,
-                uint64_t _uid, uint64_t _euid,
-                uint64_t _gid, uint64_t _egid,
-                uint64_t _pid, uint64_t _ppid) :
-            SparcLiveProcess(nm, objFile, _system,
-                         stdin_fd, stdout_fd, stderr_fd,
-                         argv, envp, cwd,
-                         _uid, _euid, _gid, _egid, _pid, _ppid)
+    Sparc32Process(ProcessParams * params, ObjectFile *objFile)
+        : SparcProcess(params, objFile, 0)
     {
+        Addr brk_point = objFile->dataBase() + objFile->dataSize() +
+                         objFile->bssSize();
+        brk_point = roundUp(brk_point, SparcISA::PageBytes);
+
+        // Reserve 8M for main stack.
+        Addr max_stack_size = 8 * 1024 * 1024;
+
         // Set up stack. On SPARC Linux, stack goes from the top of memory
         // downward, less the hole for the kernel address space.
-        stack_base = (Addr)0xf0000000ULL;
+        Addr stack_base = 0xf0000000ULL;
+
+        // Set pointer for next thread stack.
+        Addr next_thread_stack_base = stack_base - max_stack_size;
 
         // Set up region for mmaps.
-        mmap_start = mmap_end = 0x70000000;
+        Addr mmap_end = 0x70000000;
+
+        memState = std::make_shared<MemState>(brk_point, stack_base,
+                                              max_stack_size,
+                                              next_thread_stack_base,
+                                              mmap_end);
     }
 
-    void startup();
+    void initState();
 
   public:
 
     void argsInit(int intSize, int pageSize);
 
-};
-
-struct M5_64_auxv_t
-{
-    int64_t a_type;
-    union {
-        int64_t a_val;
-        int64_t a_ptr;
-        int64_t a_fcn;
-    };
+    void flushWindows(ThreadContext *tc);
 
-    M5_64_auxv_t()
-    {}
+    RegVal getSyscallArg(ThreadContext *tc, int &i);
+    /// Explicitly import the otherwise hidden getSyscallArg
+    using Process::getSyscallArg;
 
-    M5_64_auxv_t(int64_t type, int64_t val);
+    void setSyscallArg(ThreadContext *tc, int i, RegVal val);
 };
 
-class Sparc64LiveProcess : public SparcLiveProcess
+class Sparc64Process : public SparcProcess
 {
   protected:
 
-    static const Addr StackBias = 2047;
-
-    std::vector<M5_64_auxv_t> auxv;
-
-    Sparc64LiveProcess(const std::string &nm, ObjectFile *objFile,
-                System *_system, int stdin_fd, int stdout_fd, int stderr_fd,
-                std::vector<std::string> &argv,
-                std::vector<std::string> &envp,
-                const std::string &cwd,
-                uint64_t _uid, uint64_t _euid,
-                uint64_t _gid, uint64_t _egid,
-                uint64_t _pid, uint64_t _ppid) :
-            SparcLiveProcess(nm, objFile, _system,
-                         stdin_fd, stdout_fd, stderr_fd,
-                         argv, envp, cwd,
-                         _uid, _euid, _gid, _egid, _pid, _ppid)
+    Sparc64Process(ProcessParams * params, ObjectFile *objFile)
+        : SparcProcess(params, objFile, 2047)
     {
+        Addr brk_point = objFile->dataBase() + objFile->dataSize() +
+                         objFile->bssSize();
+        brk_point = roundUp(brk_point, SparcISA::PageBytes);
+
+        Addr max_stack_size = 8 * 1024 * 1024;
+
         // Set up stack. On SPARC Linux, stack goes from the top of memory
         // downward, less the hole for the kernel address space.
-        stack_base = (Addr)0x80000000000ULL;
+        Addr stack_base = 0x80000000000ULL;
 
-        // Set up region for mmaps.  Tru64 seems to start just above 0 and
-        // grow up from there.
-        mmap_start = mmap_end = 0xfffff80000000000ULL;
+        // Set pointer for next thread stack.  Reserve 8M for main stack.
+        Addr next_thread_stack_base = stack_base - max_stack_size;
+
+        // Set up region for mmaps.
+        Addr mmap_end = 0xfffff80000000000ULL;
+
+        memState = std::make_shared<MemState>(brk_point, stack_base,
+                                              max_stack_size,
+                                              next_thread_stack_base,
+                                              mmap_end);
     }
 
-    void startup();
+    void initState();
 
   public:
 
     void argsInit(int intSize, int pageSize);
 
+    void flushWindows(ThreadContext *tc);
+
+    RegVal getSyscallArg(ThreadContext *tc, int &i);
+    /// Explicitly import the otherwise hidden getSyscallArg
+    using Process::getSyscallArg;
+
+    void setSyscallArg(ThreadContext *tc, int i, RegVal val);
 };
 
 #endif // __SPARC_PROCESS_HH__