aboutsummaryrefslogtreecommitdiff
path: root/riscv
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2013-07-19 18:12:50 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2013-07-19 18:12:50 -0700
commit97a9245bdd3de9b9a58a684a4e8b2fe7772a0e2a (patch)
tree6394a433fad3edbb175bf3e15338e864e796846d /riscv
parent9299f2f74547023d39fe0b4b8154e35730e70b96 (diff)
downloadriscv-isa-sim-97a9245bdd3de9b9a58a684a4e8b2fe7772a0e2a.zip
riscv-isa-sim-97a9245bdd3de9b9a58a684a4e8b2fe7772a0e2a.tar.gz
riscv-isa-sim-97a9245bdd3de9b9a58a684a4e8b2fe7772a0e2a.tar.bz2
Use calloc to allocate target memory
It just calls mmap under the hood, anyway...
Diffstat (limited to 'riscv')
-rw-r--r--riscv/sim.cc25
1 files changed, 7 insertions, 18 deletions
diff --git a/riscv/sim.cc b/riscv/sim.cc
index 8fafa51..c6ca04a 100644
--- a/riscv/sim.cc
+++ b/riscv/sim.cc
@@ -2,16 +2,11 @@
#include "sim.h"
#include "htif.h"
-#include <sys/mman.h>
#include <map>
#include <iostream>
#include <climits>
-#include <assert.h>
-#include <unistd.h>
-
-#ifdef __linux__
-# define mmap mmap64
-#endif
+#include <cstdlib>
+#include <cassert>
sim_t::sim_t(size_t _nprocs, size_t mem_mb, const std::vector<std::string>& args)
: htif(new htif_isasim_t(this, args)),
@@ -20,23 +15,17 @@ sim_t::sim_t(size_t _nprocs, size_t mem_mb, const std::vector<std::string>& args
// allocate target machine's memory, shrinking it as necessary
// until the allocation succeeds
size_t memsz0 = (size_t)mem_mb << 20;
+ size_t quantum = 1L << 20;
if (memsz0 == 0)
memsz0 = 1L << (sizeof(size_t) == 8 ? 32 : 30);
- size_t quantum = std::max(PGSIZE, (reg_t)sysconf(_SC_PAGESIZE));
- memsz0 = memsz0/quantum*quantum;
-
memsz = memsz0;
- mem = (char*)mmap(NULL, memsz, PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
+ while ((mem = (char*)calloc(1, memsz)) == NULL)
+ memsz = memsz*10/11/quantum*quantum;
- if(mem == MAP_FAILED)
- {
- while(mem == MAP_FAILED && (memsz = memsz*10/11/quantum*quantum))
- mem = (char*)mmap(NULL, memsz, PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
- assert(mem != MAP_FAILED);
+ if (memsz != memsz)
fprintf(stderr, "warning: only got %lu bytes of target mem (wanted %lu)\n",
(unsigned long)memsz, (unsigned long)memsz0);
- }
mmu = new mmu_t(mem, memsz);
@@ -55,7 +44,7 @@ sim_t::~sim_t()
delete pmmu;
}
delete mmu;
- munmap(mem, memsz);
+ free(mem);
}
void sim_t::send_ipi(reg_t who)