riscv: Fix crashes with large or frequent mmaps
authorAlec Roelke <ar4jc@virginia.edu>
Thu, 30 Mar 2017 20:35:08 +0000 (16:35 -0400)
committerAlec Roelke <ar4jc@virginia.edu>
Tue, 11 Apr 2017 16:03:13 +0000 (16:03 +0000)
This patch fixes a bug where increasing the mmap region too much causes
it to run into already-allocated memory, which causes gem5 to fail an
assertion.  Previously, the stack was incorrectly set up such that the
end of the mmap region and the top of the stack were the same address
and both would grow downward.  With this patch, the top of the stack has
been separated from the end of mmap and moved up, and the mmap region
now grows upward instead of downward.

[Rebase to master branch and remove dependencies.]

Change-Id: I7271ff478fff2994f918bc5003a6139b9ba6a520
Reviewed-on: https://gem5-review.googlesource.com/2680
Maintainer: Alec Roelke <ar4jc@virginia.edu>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
src/arch/riscv/process.cc
src/arch/riscv/process.hh

index b9623720ec4f956153592a230dec9f818cc8d395..13038c17c93472929c6df580db9b35821ed7feb8 100644 (file)
@@ -60,13 +60,12 @@ using namespace RiscvISA;
 RiscvProcess::RiscvProcess(ProcessParams * params,
     ObjectFile *objFile) : Process(params, objFile)
 {
-    const Addr mem_base = 0x80000000;
-    const Addr stack_base = mem_base;
+    const Addr stack_base = 0x7FFFFFFFFFFFFFFFL;
     const Addr max_stack_size = PageBytes * 64;
     const Addr next_thread_stack_base = stack_base - max_stack_size;
     const Addr brk_point = roundUp(objFile->bssBase() + objFile->bssSize(),
             PageBytes);
-    const Addr mmap_end = mem_base;
+    const Addr mmap_end = 0x4000000000000000L;
     memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
             next_thread_stack_base, mmap_end);
 }
index 8275a118a89db0e733967e02944787a561952f0b..f732a44363943222789cd27b0a6c6152a5e25db7 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2006 The Regents of The University of Michigan
+ * Copyright (c) 2017 The University of Virginia
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -27,6 +28,7 @@
  *
  * Authors: Gabe Black
  *          Ali Saidi
+ *          Alec Roelke
  */
 
 #ifndef __RISCV_PROCESS_HH__
@@ -57,6 +59,8 @@ class RiscvProcess : public Process
     using Process::getSyscallArg;
     void setSyscallArg(ThreadContext *tc, int i, RiscvISA::IntReg val);
     void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
+
+    virtual bool mmapGrowsDown() const override { return false; }
 };
 
 /* No architectural page table defined for this ISA */