// 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);
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 */
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,
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
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
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
stack_base = (Addr)0xf0000000ULL;
// Set up region for mmaps.
- mmap_start = mmap_end = 0x70000000;
+ mmap_end = 0x70000000;
}
void initState();
// 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();
uint32_t freehigh; /* Available high memory size */
uint32_t mem_unit; /* Memory unit size in bytes */
} tgt_sysinfo;
-
- static bool mmapGrowsDown() { return true; }
};
#endif
// 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
// 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*
// 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;
}
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__
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
}
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);
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);
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;
// 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",