arch-arm: Add initial support for SVE contiguous loads/stores
[gem5.git] / src / arch / sparc / process.hh
index a9a4247fcf72fdf4eb4f68dc2cf5b824c07e4a29..eeb267116382f79fa42bac07c39d20e2bcfd1a70 100644 (file)
 #ifndef __SPARC_PROCESS_HH__
 #define __SPARC_PROCESS_HH__
 
+#include <memory>
 #include <string>
 #include <vector>
 
+#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 ObjectFile;
-class System;
-
-class SparcLiveProcess : public LiveProcess
+class SparcProcess : public Process
 {
   protected:
 
@@ -50,8 +51,8 @@ class SparcLiveProcess : public LiveProcess
     // The locations of the fill and spill handlers
     Addr fillStart, spillStart;
 
-    SparcLiveProcess(LiveProcessParams * params,
-            ObjectFile *objFile, Addr _StackBias);
+    SparcProcess(ProcessParams * params, ObjectFile *objFile,
+                 Addr _StackBias);
 
     void initState();
 
@@ -61,7 +62,7 @@ class SparcLiveProcess : public LiveProcess
   public:
 
     // Handles traps which request services from the operating system
-    virtual void handleTrap(int trapNum, ThreadContext *tc);
+    virtual void handleTrap(int trapNum, ThreadContext *tc, Fault *fault);
 
     Addr readFillStart() { return fillStart; }
     Addr readSpillStart() { return spillStart; }
@@ -70,19 +71,34 @@ class SparcLiveProcess : public LiveProcess
     void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
 };
 
-class Sparc32LiveProcess : public SparcLiveProcess
+class Sparc32Process : public SparcProcess
 {
   protected:
 
-    Sparc32LiveProcess(LiveProcessParams * params, ObjectFile *objFile) :
-            SparcLiveProcess(params, objFile, 0)
+    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 initState();
@@ -93,24 +109,40 @@ class Sparc32LiveProcess : public SparcLiveProcess
 
     void flushWindows(ThreadContext *tc);
 
-    SparcISA::IntReg getSyscallArg(ThreadContext *tc, int &i);
-    void setSyscallArg(ThreadContext *tc, int i, SparcISA::IntReg val);
+    RegVal getSyscallArg(ThreadContext *tc, int &i);
+    /// Explicitly import the otherwise hidden getSyscallArg
+    using Process::getSyscallArg;
+
+    void setSyscallArg(ThreadContext *tc, int i, RegVal val);
 };
 
-class Sparc64LiveProcess : public SparcLiveProcess
+class Sparc64Process : public SparcProcess
 {
   protected:
 
-    Sparc64LiveProcess(LiveProcessParams * params, ObjectFile *objFile) :
-            SparcLiveProcess(params, objFile, 2047)
+    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 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.  Tru64 seems to start just above 0 and
-        // grow up from there.
-        mmap_start = mmap_end = 0xfffff80000000000ULL;
+        // 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 initState();
@@ -121,8 +153,11 @@ class Sparc64LiveProcess : public SparcLiveProcess
 
     void flushWindows(ThreadContext *tc);
 
-    SparcISA::IntReg getSyscallArg(ThreadContext *tc, int &i);
-    void setSyscallArg(ThreadContext *tc, int i, SparcISA::IntReg val);
+    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__