9 sim_t::sim_t(int _nprocs
, size_t _memsz
, appserver_link_t
* _applink
, icsim_t
* default_icache
, icsim_t
* default_dcache
)
12 mem((char*)mmap64(NULL
, memsz
, PROT_WRITE
, MAP_PRIVATE
| MAP_ANON
, -1, 0)),
13 procs(std::vector
<processor_t
>(_nprocs
,processor_t(this,mem
,memsz
)))
15 demand(mem
!= MAP_FAILED
, "couldn't allocate target machine's memory");
17 for(int i
= 0; i
< (int)num_cores(); i
++)
18 procs
[i
].init(i
, default_icache
, default_dcache
);
27 void sim_t::set_tohost(reg_t val
)
31 applink
->wait_for_tohost();
34 reg_t
sim_t::get_fromhost()
36 applink
->wait_for_fromhost();
40 void sim_t::send_ipi(reg_t who
)
43 procs
[who
].deliver_ipi();
46 void sim_t::run(bool debug
)
48 applink
->wait_for_start();
56 step_all(100,100,false);
61 std::cin
.getline(s
,sizeof(s
)-1);
63 char* p
= strtok(s
," ");
66 interactive_run_noisy(std::string("r"), std::vector
<std::string
>(1,"1"));
71 std::vector
<std::string
> args
;
72 while((p
= strtok(NULL
," ")))
76 typedef void (sim_t::*interactive_func
)(const std::string
&, const std::vector
<std::string
>&);
77 std::map
<std::string
,interactive_func
> funcs
;
79 funcs
["r"] = &sim_t::interactive_run_noisy
;
80 funcs
["rs"] = &sim_t::interactive_run_silent
;
81 funcs
["rp"] = &sim_t::interactive_run_proc_noisy
;
82 funcs
["rps"] = &sim_t::interactive_run_proc_silent
;
83 funcs
["reg"] = &sim_t::interactive_reg
;
84 funcs
["fregs"] = &sim_t::interactive_fregs
;
85 funcs
["fregd"] = &sim_t::interactive_fregd
;
86 funcs
["mem"] = &sim_t::interactive_mem
;
87 funcs
["str"] = &sim_t::interactive_str
;
88 funcs
["until"] = &sim_t::interactive_until
;
89 funcs
["while"] = &sim_t::interactive_until
;
90 funcs
["q"] = &sim_t::interactive_quit
;
95 (this->*funcs
[cmd
])(cmd
, args
);
102 void sim_t::step_all(size_t n
, size_t interleave
, bool noisy
)
104 for(size_t j
= 0; j
< n
; j
+=interleave
)
105 for(int i
= 0; i
< (int)num_cores(); i
++)
106 procs
[i
].step(interleave
,noisy
);
109 void sim_t::interactive_run_noisy(const std::string
& cmd
, const std::vector
<std::string
>& args
)
111 interactive_run(cmd
,args
,true);
114 void sim_t::interactive_run_silent(const std::string
& cmd
, const std::vector
<std::string
>& args
)
116 interactive_run(cmd
,args
,false);
119 void sim_t::interactive_run(const std::string
& cmd
, const std::vector
<std::string
>& args
, bool noisy
)
122 step_all(atoll(args
[0].c_str()),1,noisy
);
124 while(1) step_all(1,1,noisy
);
127 void sim_t::interactive_run_proc_noisy(const std::string
& cmd
, const std::vector
<std::string
>& args
)
129 interactive_run_proc(cmd
,args
,true);
132 void sim_t::interactive_run_proc_silent(const std::string
& cmd
, const std::vector
<std::string
>& args
)
134 interactive_run_proc(cmd
,args
,false);
137 void sim_t::interactive_run_proc(const std::string
& cmd
, const std::vector
<std::string
>& a
, bool noisy
)
142 int p
= atoi(a
[0].c_str());
143 if(p
>= (int)num_cores())
147 procs
[p
].step(atoi(a
[1].c_str()),noisy
);
149 while(1) procs
[p
].step(1,noisy
);
152 void sim_t::interactive_quit(const std::string
& cmd
, const std::vector
<std::string
>& args
)
157 reg_t
sim_t::get_pc(const std::vector
<std::string
>& args
)
160 throw trap_illegal_instruction
;
162 int p
= atoi(args
[0].c_str());
163 if(p
>= (int)num_cores())
164 throw trap_illegal_instruction
;
169 reg_t
sim_t::get_reg(const std::vector
<std::string
>& args
)
172 throw trap_illegal_instruction
;
174 int p
= atoi(args
[0].c_str());
175 int r
= atoi(args
[1].c_str());
176 if(p
>= (int)num_cores() || r
>= NXPR
)
177 throw trap_illegal_instruction
;
179 return procs
[p
].XPR
[r
];
182 reg_t
sim_t::get_freg(const std::vector
<std::string
>& args
)
185 throw trap_illegal_instruction
;
187 int p
= atoi(args
[0].c_str());
188 int r
= atoi(args
[1].c_str());
189 if(p
>= (int)num_cores() || r
>= NFPR
)
190 throw trap_illegal_instruction
;
192 return procs
[p
].FPR
[r
];
195 reg_t
sim_t::get_tohost(const std::vector
<std::string
>& args
)
198 throw trap_illegal_instruction
;
200 int p
= atoi(args
[0].c_str());
201 if(p
>= (int)num_cores())
202 throw trap_illegal_instruction
;
204 return procs
[p
].tohost
;
207 void sim_t::interactive_reg(const std::string
& cmd
, const std::vector
<std::string
>& args
)
209 printf("0x%016llx\n",(unsigned long long)get_reg(args
));
219 void sim_t::interactive_fregs(const std::string
& cmd
, const std::vector
<std::string
>& args
)
222 f
.r
= get_freg(args
);
226 void sim_t::interactive_fregd(const std::string
& cmd
, const std::vector
<std::string
>& args
)
229 f
.r
= get_freg(args
);
233 reg_t
sim_t::get_mem(const std::vector
<std::string
>& args
)
235 if(args
.size() != 1 && args
.size() != 2)
236 throw trap_illegal_instruction
;
238 std::string addr_str
= args
[0];
239 mmu_t
mmu(mem
, memsz
);
240 mmu
.set_supervisor(true);
243 int p
= atoi(args
[0].c_str());
244 if(p
>= (int)num_cores())
245 throw trap_illegal_instruction
;
246 mmu
.set_vm_enabled(!!(procs
[p
].sr
& SR_VM
));
247 mmu
.set_ptbr(procs
[p
].mmu
.get_ptbr());
251 reg_t addr
= strtol(addr_str
.c_str(),NULL
,16), val
;
253 addr
= strtoul(addr_str
.c_str(),NULL
,16);
258 val
= mmu
.load_uint64(addr
);
261 val
= mmu
.load_uint32(addr
);
265 val
= mmu
.load_uint16(addr
);
268 val
= mmu
.load_uint8(addr
);
274 void sim_t::interactive_mem(const std::string
& cmd
, const std::vector
<std::string
>& args
)
276 printf("0x%016llx\n",(unsigned long long)get_mem(args
));
279 void sim_t::interactive_str(const std::string
& cmd
, const std::vector
<std::string
>& args
)
282 throw trap_illegal_instruction
;
284 reg_t addr
= strtol(args
[0].c_str(),NULL
,16);
286 mmu_t
mmu(mem
,memsz
);
289 while((ch
= mmu
.load_uint8(addr
++)))
295 void sim_t::interactive_until(const std::string
& cmd
, const std::vector
<std::string
>& args
)
300 std::string scmd
= args
[0];
301 reg_t val
= strtol(args
[args
.size()-1].c_str(),NULL
,16);
303 val
= strtoul(args
[args
.size()-1].c_str(),NULL
,16);
305 std::vector
<std::string
> args2
;
306 args2
= std::vector
<std::string
>(args
.begin()+1,args
.end()-1);
312 current
= get_reg(args2
);
313 else if(scmd
== "pc")
314 current
= get_pc(args2
);
315 else if(scmd
== "mem")
316 current
= get_mem(args2
);
317 else if(scmd
== "tohost")
318 current
= get_tohost(args2
);
322 if(cmd
== "until" && current
== val
)
324 if(cmd
== "while" && current
!= val
)