summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/alpha/process.cc2
-rw-r--r--src/arch/alpha/process.hh4
-rw-r--r--src/arch/arm/process.cc4
-rw-r--r--src/arch/mips/process.cc2
-rw-r--r--src/arch/power/process.cc2
-rw-r--r--src/arch/sparc/process.hh7
-rw-r--r--src/arch/x86/linux/linux.hh2
-rw-r--r--src/arch/x86/process.cc4
-rw-r--r--src/gpu-compute/shader.cc19
-rw-r--r--src/kern/operatingsystem.hh4
-rw-r--r--src/sim/process.cc4
-rw-r--r--src/sim/process.hh6
-rw-r--r--src/sim/syscall_emul.hh4
13 files changed, 31 insertions, 33 deletions
diff --git a/src/arch/alpha/process.cc b/src/arch/alpha/process.cc
index eb1a2ee6d..54ef338f3 100644
--- a/src/arch/alpha/process.cc
+++ b/src/arch/alpha/process.cc
@@ -57,7 +57,7 @@ AlphaLiveProcess::AlphaLiveProcess(LiveProcessParams *params,
// Set up region for mmaps. Tru64 seems to start just above 0 and
// grow up from there.
- mmap_start = mmap_end = 0x10000;
+ mmap_end = 0x10000;
// Set pointer for next thread stack. Reserve 8M for main stack.
next_thread_stack_base = stack_base - (8 * 1024 * 1024);
diff --git a/src/arch/alpha/process.hh b/src/arch/alpha/process.hh
index fcaa6539c..c41ece837 100644
--- a/src/arch/alpha/process.hh
+++ b/src/arch/alpha/process.hh
@@ -54,6 +54,10 @@ class AlphaLiveProcess : public LiveProcess
void setSyscallArg(ThreadContext *tc, int i, AlphaISA::IntReg val) override;
void setSyscallReturn(ThreadContext *tc,
SyscallReturn return_value) override;
+
+ // override default implementation in LiveProcess as the mmap
+ // region for Alpha platforms grows upward
+ virtual bool mmapGrowsDown() const override { return false; }
};
/* No architectural page table defined for this ISA */
diff --git a/src/arch/arm/process.cc b/src/arch/arm/process.cc
index ba56f0cdc..0c6f48fb5 100644
--- a/src/arch/arm/process.cc
+++ b/src/arch/arm/process.cc
@@ -77,7 +77,7 @@ ArmLiveProcess32::ArmLiveProcess32(LiveProcessParams *params,
brk_point = roundUp(brk_point, PageBytes);
// Set up region for mmaps. For now, start at bottom of kuseg space.
- mmap_start = mmap_end = 0x40000000L;
+ mmap_end = 0x40000000L;
}
ArmLiveProcess64::ArmLiveProcess64(LiveProcessParams *params,
@@ -94,7 +94,7 @@ ArmLiveProcess64::ArmLiveProcess64(LiveProcessParams *params,
brk_point = roundUp(brk_point, PageBytes);
// Set up region for mmaps. For now, start at bottom of kuseg space.
- mmap_start = mmap_end = 0x4000000000L;
+ mmap_end = 0x4000000000L;
}
void
diff --git a/src/arch/mips/process.cc b/src/arch/mips/process.cc
index 404c84da6..8754191fa 100644
--- a/src/arch/mips/process.cc
+++ b/src/arch/mips/process.cc
@@ -61,7 +61,7 @@ MipsLiveProcess::MipsLiveProcess(LiveProcessParams * params,
brk_point = roundUp(brk_point, PageBytes);
// Set up region for mmaps. Start it 1GB above the top of the heap.
- mmap_start = mmap_end = brk_point + 0x40000000L;
+ mmap_end = brk_point + 0x40000000L;
}
void
diff --git a/src/arch/power/process.cc b/src/arch/power/process.cc
index 3dc2c0d17..a770d8137 100644
--- a/src/arch/power/process.cc
+++ b/src/arch/power/process.cc
@@ -59,7 +59,7 @@ PowerLiveProcess::PowerLiveProcess(LiveProcessParams *params,
brk_point = roundUp(brk_point, PageBytes);
// Set up region for mmaps. For now, start at bottom of kuseg space.
- mmap_start = mmap_end = 0x70000000L;
+ mmap_end = 0x70000000L;
}
void
diff --git a/src/arch/sparc/process.hh b/src/arch/sparc/process.hh
index 2eda40aac..e9d81367b 100644
--- a/src/arch/sparc/process.hh
+++ b/src/arch/sparc/process.hh
@@ -82,7 +82,7 @@ class Sparc32LiveProcess : public SparcLiveProcess
stack_base = (Addr)0xf0000000ULL;
// Set up region for mmaps.
- mmap_start = mmap_end = 0x70000000;
+ mmap_end = 0x70000000;
}
void initState();
@@ -111,9 +111,8 @@ class Sparc64LiveProcess : public SparcLiveProcess
// downward, less the hole for the kernel address space.
stack_base = (Addr)0x80000000000ULL;
- // 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.
+ mmap_end = 0xfffff80000000000ULL;
}
void initState();
diff --git a/src/arch/x86/linux/linux.hh b/src/arch/x86/linux/linux.hh
index ce395f17d..47eac12b8 100644
--- a/src/arch/x86/linux/linux.hh
+++ b/src/arch/x86/linux/linux.hh
@@ -290,8 +290,6 @@ class X86Linux32 : public Linux
uint32_t freehigh; /* Available high memory size */
uint32_t mem_unit; /* Memory unit size in bytes */
} tgt_sysinfo;
-
- static bool mmapGrowsDown() { return true; }
};
#endif
diff --git a/src/arch/x86/process.cc b/src/arch/x86/process.cc
index 13cbf6edd..f0b8370c0 100644
--- a/src/arch/x86/process.cc
+++ b/src/arch/x86/process.cc
@@ -114,7 +114,7 @@ X86_64LiveProcess::X86_64LiveProcess(LiveProcessParams *params,
// Set up region for mmaps. This was determined empirically and may not
// always be correct.
- mmap_start = mmap_end = (Addr)0x2aaaaaaab000ULL;
+ mmap_end = (Addr)0x2aaaaaaab000ULL;
}
void
@@ -151,7 +151,7 @@ I386LiveProcess::I386LiveProcess(LiveProcessParams *params,
// Set up region for mmaps. This was determined empirically and may not
// always be correct.
- mmap_start = mmap_end = (Addr)0xf7ffe000ULL;
+ mmap_end = (Addr)0xf7ffe000ULL;
}
SyscallDesc*
diff --git a/src/gpu-compute/shader.cc b/src/gpu-compute/shader.cc
index e8d7946ff..31aa1e4cf 100644
--- a/src/gpu-compute/shader.cc
+++ b/src/gpu-compute/shader.cc
@@ -78,25 +78,24 @@ Shader::mmap(int length)
// round up length to the next page
length = roundUp(length, TheISA::PageBytes);
- if (X86Linux64::mmapGrowsDown()) {
+ Process *proc = gpuTc->getProcessPtr();
+
+ if (proc->mmapGrowsDown()) {
DPRINTF(HSAIL, "GROWS DOWN");
- start = gpuTc->getProcessPtr()->mmap_end -length;
- gpuTc->getProcessPtr()->mmap_end = start;
+ start = proc->mmap_end - length;
+ proc->mmap_end = start;
} else {
DPRINTF(HSAIL, "GROWS UP");
- start = gpuTc->getProcessPtr()->mmap_end;
- gpuTc->getProcessPtr()->mmap_end += length;
+ start = proc->mmap_end;
+ proc->mmap_end += length;
// assertion to make sure we don't overwrite the stack (it grows down)
- assert(gpuTc->getProcessPtr()->mmap_end <
- gpuTc->getProcessPtr()->stack_base -
- gpuTc->getProcessPtr()->max_stack_size);
-
+ assert(proc->mmap_end < proc->stack_base - proc->max_stack_size);
}
DPRINTF(HSAIL,"Shader::mmap start= %#x, %#x\n", start, length);
- gpuTc->getProcessPtr()->allocateMem(start,length);
+ proc->allocateMem(start, length);
return start;
}
diff --git a/src/kern/operatingsystem.hh b/src/kern/operatingsystem.hh
index f6f035f43..12aff946c 100644
--- a/src/kern/operatingsystem.hh
+++ b/src/kern/operatingsystem.hh
@@ -116,10 +116,6 @@ class OperatingSystem {
static int openSpecialFile(std::string path, LiveProcess *process, ThreadContext *tc);
- static const bool mmapGrowsUp = true;
-
- static bool mmapGrowsDown() { return false; }
-
}; // class OperatingSystem
#endif // __OPERATINGSYSTEM_HH__
diff --git a/src/sim/process.cc b/src/sim/process.cc
index 6c12b8100..81a7ec89e 100644
--- a/src/sim/process.cc
+++ b/src/sim/process.cc
@@ -182,7 +182,7 @@ Process::Process(ProcessParams * params)
fde_stderr->set(sim_fd, params->errout, O_WRONLY | O_CREAT | O_TRUNC,
0664, false);
- mmap_start = mmap_end = 0;
+ mmap_end = 0;
nxm_start = nxm_end = 0;
// other parameters will be initialized when the program is loaded
}
@@ -412,7 +412,6 @@ Process::serialize(CheckpointOut &cp) const
SERIALIZE_SCALAR(stack_size);
SERIALIZE_SCALAR(stack_min);
SERIALIZE_SCALAR(next_thread_stack_base);
- SERIALIZE_SCALAR(mmap_start);
SERIALIZE_SCALAR(mmap_end);
SERIALIZE_SCALAR(nxm_start);
SERIALIZE_SCALAR(nxm_end);
@@ -432,7 +431,6 @@ Process::unserialize(CheckpointIn &cp)
UNSERIALIZE_SCALAR(stack_size);
UNSERIALIZE_SCALAR(stack_min);
UNSERIALIZE_SCALAR(next_thread_stack_base);
- UNSERIALIZE_SCALAR(mmap_start);
UNSERIALIZE_SCALAR(mmap_end);
UNSERIALIZE_SCALAR(nxm_start);
UNSERIALIZE_SCALAR(nxm_end);
diff --git a/src/sim/process.hh b/src/sim/process.hh
index df007c9f2..72f789ec7 100644
--- a/src/sim/process.hh
+++ b/src/sim/process.hh
@@ -107,9 +107,13 @@ class Process : public SimObject
Addr next_thread_stack_base;
// Base of region for mmaps (when user doesn't specify an address).
- Addr mmap_start;
Addr mmap_end;
+ // Does mmap region grow upward or downward from mmap_end? Most
+ // platforms grow downward, but a few (such as Alpha) grow upward
+ // instead, so they can override thie method to return false.
+ virtual bool mmapGrowsDown() const { return true; }
+
// Base of region for nxm data
Addr nxm_start;
Addr nxm_end;
diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh
index a859fbe43..71c0dd090 100644
--- a/src/sim/syscall_emul.hh
+++ b/src/sim/syscall_emul.hh
@@ -1297,8 +1297,8 @@ mmapImpl(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc,
// Extend global mmap region if necessary. Note that we ignore the
// start address unless MAP_FIXED is specified.
if (!(tgt_flags & OS::TGT_MAP_FIXED)) {
- start = (OS::mmapGrowsDown()) ? p->mmap_end - length : p->mmap_end;
- p->mmap_end = (OS::mmapGrowsDown()) ? start : p->mmap_end + length;
+ start = p->mmapGrowsDown() ? p->mmap_end - length : p->mmap_end;
+ p->mmap_end = p->mmapGrowsDown() ? start : p->mmap_end + length;
}
DPRINTF_SYSCALL(Verbose, " mmap range is 0x%x - 0x%x\n",