10 sim_t::sim_t(int _nprocs
, appserver_link_t
* _applink
, icsim_t
* default_icache
, icsim_t
* default_dcache
)
14 size_t memsz0
= sizeof(size_t) == 8 ? 0x100000000ULL
: 0x70000000UL
;
15 size_t quantum
= std::max(PGSIZE
, (reg_t
)sysconf(_SC_PAGESIZE
));
16 memsz0
= memsz0
/quantum
*quantum
;
19 mem
= (char*)mmap64(NULL
, memsz
, PROT_WRITE
, MAP_PRIVATE
|MAP_ANON
, -1, 0);
23 while(mem
== MAP_FAILED
&& (memsz
= memsz
*10/11/quantum
*quantum
))
24 mem
= (char*)mmap64(NULL
, memsz
, PROT_WRITE
, MAP_PRIVATE
|MAP_ANON
, -1, 0);
25 assert(mem
!= MAP_FAILED
);
26 fprintf(stderr
, "warning: only got %lu bytes of target mem (wanted %lu)\n",
27 (unsigned long)memsz
, (unsigned long)memsz0
);
30 mmu
= new mmu_t(mem
, memsz
);
32 for(size_t i
= 0; i
< num_cores(); i
++)
34 procs
[i
] = new processor_t(this, new mmu_t(mem
, memsz
));
35 procs
[i
]->init(i
, default_icache
, default_dcache
);
43 for(size_t i
= 0; i
< num_cores(); i
++)
45 mmu_t
* pmmu
= &procs
[i
]->mmu
;
53 void sim_t::set_tohost(reg_t val
)
57 applink
->wait_for_tohost();
60 reg_t
sim_t::get_fromhost()
62 applink
->wait_for_fromhost();
66 void sim_t::send_ipi(reg_t who
)
69 procs
[who
]->deliver_ipi();
72 void sim_t::run(bool debug
)
74 applink
->wait_for_start();
82 step_all(100,100,false);
87 std::cin
.getline(s
,sizeof(s
)-1);
89 char* p
= strtok(s
," ");
92 interactive_run_noisy(std::string("r"), std::vector
<std::string
>(1,"1"));
97 std::vector
<std::string
> args
;
98 while((p
= strtok(NULL
," ")))
102 typedef void (sim_t::*interactive_func
)(const std::string
&, const std::vector
<std::string
>&);
103 std::map
<std::string
,interactive_func
> funcs
;
105 funcs
["r"] = &sim_t::interactive_run_noisy
;
106 funcs
["rs"] = &sim_t::interactive_run_silent
;
107 funcs
["rp"] = &sim_t::interactive_run_proc_noisy
;
108 funcs
["rps"] = &sim_t::interactive_run_proc_silent
;
109 funcs
["reg"] = &sim_t::interactive_reg
;
110 funcs
["fregs"] = &sim_t::interactive_fregs
;
111 funcs
["fregd"] = &sim_t::interactive_fregd
;
112 funcs
["mem"] = &sim_t::interactive_mem
;
113 funcs
["str"] = &sim_t::interactive_str
;
114 funcs
["until"] = &sim_t::interactive_until
;
115 funcs
["while"] = &sim_t::interactive_until
;
116 funcs
["q"] = &sim_t::interactive_quit
;
121 (this->*funcs
[cmd
])(cmd
, args
);
128 void sim_t::step_all(size_t n
, size_t interleave
, bool noisy
)
130 for(size_t j
= 0; j
< n
; j
+=interleave
)
131 for(int i
= 0; i
< (int)num_cores(); i
++)
132 procs
[i
]->step(interleave
,noisy
);
135 void sim_t::interactive_run_noisy(const std::string
& cmd
, const std::vector
<std::string
>& args
)
137 interactive_run(cmd
,args
,true);
140 void sim_t::interactive_run_silent(const std::string
& cmd
, const std::vector
<std::string
>& args
)
142 interactive_run(cmd
,args
,false);
145 void sim_t::interactive_run(const std::string
& cmd
, const std::vector
<std::string
>& args
, bool noisy
)
148 step_all(atoll(args
[0].c_str()),1,noisy
);
150 while(1) step_all(1,1,noisy
);
153 void sim_t::interactive_run_proc_noisy(const std::string
& cmd
, const std::vector
<std::string
>& args
)
155 interactive_run_proc(cmd
,args
,true);
158 void sim_t::interactive_run_proc_silent(const std::string
& cmd
, const std::vector
<std::string
>& args
)
160 interactive_run_proc(cmd
,args
,false);
163 void sim_t::interactive_run_proc(const std::string
& cmd
, const std::vector
<std::string
>& a
, bool noisy
)
168 int p
= atoi(a
[0].c_str());
169 if(p
>= (int)num_cores())
173 procs
[p
]->step(atoi(a
[1].c_str()),noisy
);
175 while(1) procs
[p
]->step(1,noisy
);
178 void sim_t::interactive_quit(const std::string
& cmd
, const std::vector
<std::string
>& args
)
183 reg_t
sim_t::get_pc(const std::vector
<std::string
>& args
)
186 throw trap_illegal_instruction
;
188 int p
= atoi(args
[0].c_str());
189 if(p
>= (int)num_cores())
190 throw trap_illegal_instruction
;
195 reg_t
sim_t::get_reg(const std::vector
<std::string
>& args
)
198 throw trap_illegal_instruction
;
200 int p
= atoi(args
[0].c_str());
201 int r
= atoi(args
[1].c_str());
202 if(p
>= (int)num_cores() || r
>= NXPR
)
203 throw trap_illegal_instruction
;
205 return procs
[p
]->XPR
[r
];
208 reg_t
sim_t::get_freg(const std::vector
<std::string
>& args
)
211 throw trap_illegal_instruction
;
213 int p
= atoi(args
[0].c_str());
214 int r
= atoi(args
[1].c_str());
215 if(p
>= (int)num_cores() || r
>= NFPR
)
216 throw trap_illegal_instruction
;
218 return procs
[p
]->FPR
[r
];
221 reg_t
sim_t::get_tohost(const std::vector
<std::string
>& args
)
224 throw trap_illegal_instruction
;
226 int p
= atoi(args
[0].c_str());
227 if(p
>= (int)num_cores())
228 throw trap_illegal_instruction
;
230 return procs
[p
]->tohost
;
233 void sim_t::interactive_reg(const std::string
& cmd
, const std::vector
<std::string
>& args
)
235 printf("0x%016llx\n",(unsigned long long)get_reg(args
));
245 void sim_t::interactive_fregs(const std::string
& cmd
, const std::vector
<std::string
>& args
)
248 f
.r
= get_freg(args
);
252 void sim_t::interactive_fregd(const std::string
& cmd
, const std::vector
<std::string
>& args
)
255 f
.r
= get_freg(args
);
259 reg_t
sim_t::get_mem(const std::vector
<std::string
>& args
)
261 if(args
.size() != 1 && args
.size() != 2)
262 throw trap_illegal_instruction
;
264 std::string addr_str
= args
[0];
267 int p
= atoi(args
[0].c_str());
268 if(p
>= (int)num_cores())
269 throw trap_illegal_instruction
;
270 mmu
->set_vm_enabled(!!(procs
[p
]->sr
& SR_VM
));
271 mmu
->set_ptbr(procs
[p
]->mmu
.get_ptbr());
275 reg_t addr
= strtol(addr_str
.c_str(),NULL
,16), val
;
277 addr
= strtoul(addr_str
.c_str(),NULL
,16);
282 val
= mmu
->load_uint64(addr
);
285 val
= mmu
->load_uint32(addr
);
289 val
= mmu
->load_uint16(addr
);
292 val
= mmu
->load_uint8(addr
);
298 void sim_t::interactive_mem(const std::string
& cmd
, const std::vector
<std::string
>& args
)
300 printf("0x%016llx\n",(unsigned long long)get_mem(args
));
303 void sim_t::interactive_str(const std::string
& cmd
, const std::vector
<std::string
>& args
)
306 throw trap_illegal_instruction
;
308 reg_t addr
= strtol(args
[0].c_str(),NULL
,16);
311 while((ch
= mmu
->load_uint8(addr
++)))
317 void sim_t::interactive_until(const std::string
& cmd
, const std::vector
<std::string
>& args
)
322 std::string scmd
= args
[0];
323 reg_t val
= strtol(args
[args
.size()-1].c_str(),NULL
,16);
325 val
= strtoul(args
[args
.size()-1].c_str(),NULL
,16);
327 std::vector
<std::string
> args2
;
328 args2
= std::vector
<std::string
>(args
.begin()+1,args
.end()-1);
334 current
= get_reg(args2
);
335 else if(scmd
== "pc")
336 current
= get_pc(args2
);
337 else if(scmd
== "mem")
338 current
= get_mem(args2
);
339 else if(scmd
== "tohost")
340 current
= get_tohost(args2
);
344 if(cmd
== "until" && current
== val
)
346 if(cmd
== "while" && current
!= val
)