summaryrefslogtreecommitdiff
path: root/src/arch/power
diff options
context:
space:
mode:
authorBrandon Potter <Brandon.Potter@amd.com>2017-03-01 13:07:43 -0600
committerBrandon Potter <Brandon.Potter@amd.com>2017-03-09 19:19:38 +0000
commit43418e7f81099072fb7d56dae11110ae1d858162 (patch)
tree0d624abfdd331b0edffcafc274c08695d0cca97b /src/arch/power
parent71dd6c2c17a465b7705f53469cd2c89f16ede4b7 (diff)
downloadgem5-43418e7f81099072fb7d56dae11110ae1d858162.tar.xz
syscall-emul: Move memState into its own file
The Process class is full of implementation details and structures related to SE Mode. This changeset factors out an internal class from Process and moves it into a separate file. The purpose behind doing this is to clean up the code and make it a bit more modular. Change-Id: Ic6941a1657751e8d51d5b6b1dcc04f1195884280 Reviewed-on: https://gem5-review.googlesource.com/2263 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/arch/power')
-rw-r--r--src/arch/power/process.cc40
1 files changed, 23 insertions, 17 deletions
diff --git a/src/arch/power/process.cc b/src/arch/power/process.cc
index 5a32218ef..4b2efb0a6 100644
--- a/src/arch/power/process.cc
+++ b/src/arch/power/process.cc
@@ -51,18 +51,23 @@ using namespace PowerISA;
PowerProcess::PowerProcess(ProcessParams *params, ObjectFile *objFile)
: Process(params, objFile)
{
- memState->stackBase = 0xbf000000L;
+ // Set up break point (Top of Heap)
+ Addr brk_point = objFile->dataBase() + objFile->dataSize() +
+ objFile->bssSize();
+ brk_point = roundUp(brk_point, PageBytes);
- // Set pointer for next thread stack. Reserve 8M for main stack.
- memState->nextThreadStackBase = memState->stackBase - (8 * 1024 * 1024);
+ Addr stack_base = 0xbf000000L;
- // Set up break point (Top of Heap)
- memState->brkPoint = objFile->dataBase() + objFile->dataSize() +
- objFile->bssSize();
- memState->brkPoint = roundUp(memState->brkPoint, PageBytes);
+ Addr max_stack_size = 8 * 1024 * 1024;
+
+ // 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. For now, start at bottom of kuseg space.
- memState->mmapEnd = 0x70000000L;
+ Addr mmap_end = 0x70000000L;
+
+ memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
+ next_thread_stack_base, mmap_end);
}
void
@@ -186,16 +191,17 @@ PowerProcess::argsInit(int intSize, int pageSize)
int space_needed = frame_size + aux_padding;
- memState->stackMin = memState->stackBase - space_needed;
- memState->stackMin = roundDown(memState->stackMin, align);
- memState->stackSize = memState->stackBase - memState->stackMin;
+ Addr stack_min = memState->getStackBase() - space_needed;
+ stack_min = roundDown(stack_min, align);
+
+ memState->setStackSize(memState->getStackBase() - stack_min);
// map memory
- allocateMem(roundDown(memState->stackMin, pageSize),
- roundUp(memState->stackSize, pageSize));
+ allocateMem(roundDown(stack_min, pageSize),
+ roundUp(memState->getStackSize(), pageSize));
// map out initial stack contents
- uint32_t sentry_base = memState->stackBase - sentry_size;
+ uint32_t sentry_base = memState->getStackBase() - sentry_size;
uint32_t aux_data_base = sentry_base - aux_data_size;
uint32_t env_data_base = aux_data_base - env_data_size;
uint32_t arg_data_base = env_data_base - arg_data_size;
@@ -214,7 +220,7 @@ PowerProcess::argsInit(int intSize, int pageSize)
DPRINTF(Stack, "0x%x - envp array\n", envp_array_base);
DPRINTF(Stack, "0x%x - argv array\n", argv_array_base);
DPRINTF(Stack, "0x%x - argc \n", argc_base);
- DPRINTF(Stack, "0x%x - stack min\n", memState->stackMin);
+ DPRINTF(Stack, "0x%x - stack min\n", stack_min);
// write contents to stack
@@ -259,12 +265,12 @@ PowerProcess::argsInit(int intSize, int pageSize)
ThreadContext *tc = system->getThreadContext(contextIds[0]);
//Set the stack pointer register
- tc->setIntReg(StackPointerReg, memState->stackMin);
+ tc->setIntReg(StackPointerReg, stack_min);
tc->pcState(getStartPC());
//Align the "stack_min" to a page boundary.
- memState->stackMin = roundDown(memState->stackMin, pageSize);
+ memState->setStackMin(roundDown(stack_min, pageSize));
}
PowerISA::IntReg