summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;