13 sim_t::sim_t(int _nprocs
, int mem_mb
, const std::vector
<std::string
>& args
)
14 : htif(new htif_isasim_t(this, args
)),
17 // allocate target machine's memory, shrinking it as necessary
18 // until the allocation succeeds
19 size_t memsz0
= (size_t)mem_mb
<< 20;
21 memsz0
= 1L << (sizeof(size_t) == 8 ? 32 : 30);
23 size_t quantum
= std::max(PGSIZE
, (reg_t
)sysconf(_SC_PAGESIZE
));
24 memsz0
= memsz0
/quantum
*quantum
;
27 mem
= (char*)mmap(NULL
, memsz
, PROT_WRITE
, MAP_PRIVATE
|MAP_ANON
, -1, 0);
31 while(mem
== MAP_FAILED
&& (memsz
= memsz
*10/11/quantum
*quantum
))
32 mem
= (char*)mmap(NULL
, memsz
, PROT_WRITE
, MAP_PRIVATE
|MAP_ANON
, -1, 0);
33 assert(mem
!= MAP_FAILED
);
34 fprintf(stderr
, "warning: only got %lu bytes of target mem (wanted %lu)\n",
35 (unsigned long)memsz
, (unsigned long)memsz0
);
38 mmu
= new mmu_t(mem
, memsz
);
40 for(size_t i
= 0; i
< num_cores(); i
++)
41 procs
[i
] = new processor_t(this, new mmu_t(mem
, memsz
), i
);
46 for(size_t i
= 0; i
< num_cores(); i
++)
48 mmu_t
* pmmu
= &procs
[i
]->mmu
;
56 void sim_t::send_ipi(reg_t who
)
59 procs
[who
]->deliver_ipi();
62 reg_t
sim_t::get_scr(int which
)
66 case 0: return num_cores();
67 case 1: return memsz
>> 20;
72 void sim_t::run(bool debug
)
77 step_all(10000, 1000, false);
83 void sim_t::step_all(size_t n
, size_t interleave
, bool noisy
)
86 for(size_t j
= 0; j
< n
; j
+=interleave
)
88 for(int i
= 0; i
< (int)num_cores(); i
++)
89 procs
[i
]->step(interleave
,noisy
);