arch-riscv: Define AT_RANDOM properly
authorAlec Roelke <ar4jc@virginia.edu>
Thu, 14 Dec 2017 17:17:31 +0000 (12:17 -0500)
committerAlec Roelke <ar4jc@virginia.edu>
Thu, 14 Dec 2017 21:49:11 +0000 (21:49 +0000)
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>

src/arch/riscv/process.cc

index 371a8e48a3d095020acf59ac689e0ad9729436b7..6fe935c1381bea0e1f2aa35f2b5a15c68b9520a5 100644 (file)
@@ -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;