summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorAlec Roelke <ar4jc@virginia.edu>2017-12-14 12:17:31 -0500
committerAlec Roelke <ar4jc@virginia.edu>2017-12-14 21:49:11 +0000
commitc5095c75f7a721551816efd16196d88eb997ec5a (patch)
tree89da07ae0b668829ddb2f9bf1a5baa8a6447666d /src/arch
parente43d24590329453a8fbf14850a3884b3919b74aa (diff)
downloadgem5-c5095c75f7a721551816efd16196d88eb997ec5a.tar.xz
arch-riscv: Define AT_RANDOM properly
According to the getauxval(3) man page, the AT_RANDOM aux value should be a pointer to 16 random bytes. In the initial implementation of RISC-V, this was based on spike's program stack setup, which copied the program header table there instead. This patch changes the implementation to use the proper 16 random bytes, making it compatible with some RISC-V programs that use custom linker scripts. Change-Id: Idaae7f19bf3ed3fd06d293e5e9c0b6f778270eb2 Reviewed-on: https://gem5-review.googlesource.com/6681 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Maintainer: Alec Roelke <ar4jc@virginia.edu>
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/riscv/process.cc21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/arch/riscv/process.cc b/src/arch/riscv/process.cc
index 371a8e48a..6fe935c13 100644
--- a/src/arch/riscv/process.cc
+++ b/src/arch/riscv/process.cc
@@ -36,6 +36,7 @@
#include <algorithm>
#include <cstddef>
#include <iostream>
+#include <iterator>
#include <map>
#include <string>
#include <vector>
@@ -44,6 +45,7 @@
#include "base/loader/elf_object.hh"
#include "base/loader/object_file.hh"
#include "base/logging.hh"
+#include "base/random.hh"
#include "cpu/thread_context.hh"
#include "debug/Stack.hh"
#include "mem/page_table.hh"
@@ -81,6 +83,8 @@ RiscvProcess::initState()
template<class IntType> void
RiscvProcess::argsInit(int pageSize)
{
+ const int RandomBytes = 16;
+
updateBias();
objFile->loadSections(initVirtMem);
ElfObject* elfObject = dynamic_cast<ElfObject*>(objFile);
@@ -88,7 +92,7 @@ RiscvProcess::argsInit(int pageSize)
// Determine stack size and populate auxv
Addr stack_top = memState->getStackMin();
- stack_top -= elfObject->programHeaderSize();
+ stack_top -= RandomBytes;
for (const string& arg: argv)
stack_top -= arg.size() + 1;
for (const string& env: envp)
@@ -114,15 +118,12 @@ 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 random bytes (for AT_RANDOM) to stack
+ memState->setStackMin(memState->getStackMin() - RandomBytes);
+ uint8_t at_random[RandomBytes];
+ generate(begin(at_random), end(at_random),
+ [&]{ return random_mt.random(0, 0xFF); });
+ initVirtMem.writeBlob(memState->getStackMin(), at_random, RandomBytes);
// Copy argv to stack
vector<Addr> argPointers;