summaryrefslogtreecommitdiff
path: root/src/arch/riscv/process.cc
diff options
context:
space:
mode:
authorAlec Roelke <ar4jc@virginia.edu>2017-05-16 17:00:02 -0400
committerAlec Roelke <ar4jc@virginia.edu>2017-05-23 19:10:18 +0000
commit76692f360c243401a850ea74cf123d4d006113ec (patch)
tree8b1b6fcf7919ad7b0eb11b2e2eb88edd3b3889c0 /src/arch/riscv/process.cc
parent1d10cd6185edfd46d51f6562bff832a9b5d36cff (diff)
downloadgem5-76692f360c243401a850ea74cf123d4d006113ec.tar.xz
arch-riscv: Fix bad stack initialization
This patch fixes a problem with RISC-V initial stack setup in SE mode where the AT_RANDOM aux vector value contains an address that is too close to the top of the stack and doesn't fit the required 16 bytes. To fix this, the program header table was added to the top of the stack just like the RISC-V proxy kernel does. Change-Id: I814562e060ff041cd0d7a7c54c3685645bd325a3 Reviewed-on: https://gem5-review.googlesource.com/3401 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Brandon Potter <Brandon.Potter@amd.com> Maintainer: Alec Roelke <ar4jc@virginia.edu>
Diffstat (limited to 'src/arch/riscv/process.cc')
-rw-r--r--src/arch/riscv/process.cc11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/arch/riscv/process.cc b/src/arch/riscv/process.cc
index 13038c17c..eeea5ee48 100644
--- a/src/arch/riscv/process.cc
+++ b/src/arch/riscv/process.cc
@@ -88,6 +88,7 @@ RiscvProcess::argsInit(int pageSize)
// Determine stack size and populate auxv
Addr stack_top = memState->getStackMin();
+ stack_top -= elfObject->programHeaderSize();
for (const string& arg: argv)
stack_top -= arg.size() + 1;
for (const string& env: envp)
@@ -113,6 +114,16 @@ RiscvProcess::argsInit(int pageSize)
allocateMem(roundDown(stack_top, pageSize),
roundUp(memState->getStackSize(), pageSize));
+ // Copy program headers to stack
+ memState->setStackMin(memState->getStackMin() -
+ elfObject->programHeaderSize());
+ uint8_t* phdr = new uint8_t[elfObject->programHeaderSize()];
+ initVirtMem.readBlob(elfObject->programHeaderTable(), phdr,
+ elfObject->programHeaderSize());
+ initVirtMem.writeBlob(memState->getStackMin(), phdr,
+ elfObject->programHeaderSize());
+ delete phdr;
+
// Copy argv to stack
vector<Addr> argPointers;
for (const string& arg: argv) {