8 sim_t::sim_t(int _nprocs
, size_t _memsz
, appserver_link_t
* _applink
)
11 mem((char*)mmap64(NULL
, memsz
, PROT_WRITE
, MAP_PRIVATE
| MAP_ANON
, -1, 0)),
12 procs(std::vector
<processor_t
>(_nprocs
,processor_t(this,mem
,memsz
)))
14 demand(mem
!= MAP_FAILED
, "couldn't allocate target machine's memory");
16 for(int i
= 0; i
< (int)procs
.size(); i
++)
26 void sim_t::set_tohost(reg_t val
)
32 reg_t
sim_t::get_fromhost()
35 applink
->wait_for_packet();
39 void sim_t::run(bool debug
)
41 applink
->wait_for_start();
46 step_all(100,100,false);
51 std::cin
.getline(s
,sizeof(s
)-1);
53 char* p
= strtok(s
," ");
56 interactive_run_noisy(std::vector
<std::string
>(1,"1"));
61 std::vector
<std::string
> args
;
62 while((p
= strtok(NULL
," ")))
66 typedef void (sim_t::*interactive_func
)(const std::vector
<std::string
>&);
67 std::map
<std::string
,interactive_func
> funcs
;
69 funcs
["r"] = &sim_t::interactive_run_noisy
;
70 funcs
["rs"] = &sim_t::interactive_run_silent
;
71 funcs
["rp"] = &sim_t::interactive_run_proc_noisy
;
72 funcs
["rps"] = &sim_t::interactive_run_proc_silent
;
73 funcs
["reg"] = &sim_t::interactive_reg
;
74 funcs
["fregs"] = &sim_t::interactive_fregs
;
75 funcs
["fregd"] = &sim_t::interactive_fregd
;
76 funcs
["mem"] = &sim_t::interactive_mem
;
77 funcs
["until"] = &sim_t::interactive_until
;
78 funcs
["q"] = &sim_t::interactive_quit
;
83 (this->*funcs
[cmd
])(args
);
90 void sim_t::step_all(size_t n
, size_t interleave
, bool noisy
)
92 for(size_t j
= 0; j
< n
; j
+=interleave
)
93 for(int i
= 0; i
< (int)procs
.size(); i
++)
94 procs
[i
].step(interleave
,noisy
);
97 void sim_t::interactive_run_noisy(const std::vector
<std::string
>& args
)
99 interactive_run(args
,true);
102 void sim_t::interactive_run_silent(const std::vector
<std::string
>& args
)
104 interactive_run(args
,false);
107 void sim_t::interactive_run(const std::vector
<std::string
>& args
, bool noisy
)
110 step_all(atoi(args
[0].c_str()),1,noisy
);
112 while(1) step_all(1,1,noisy
);
115 void sim_t::interactive_run_proc_noisy(const std::vector
<std::string
>& args
)
117 interactive_run_proc(args
,true);
120 void sim_t::interactive_run_proc_silent(const std::vector
<std::string
>& args
)
122 interactive_run_proc(args
,false);
125 void sim_t::interactive_run_proc(const std::vector
<std::string
>& a
, bool noisy
)
130 int p
= atoi(a
[0].c_str());
131 if(p
>= (int)procs
.size())
135 procs
[p
].step(atoi(a
[1].c_str()),noisy
);
137 while(1) procs
[p
].step(1,noisy
);
140 void sim_t::interactive_quit(const std::vector
<std::string
>& args
)
145 reg_t
sim_t::get_pc(const std::vector
<std::string
>& args
)
148 throw trap_illegal_instruction
;
150 int p
= atoi(args
[0].c_str());
151 if(p
>= (int)procs
.size())
152 throw trap_illegal_instruction
;
157 reg_t
sim_t::get_reg(const std::vector
<std::string
>& args
)
160 throw trap_illegal_instruction
;
162 int p
= atoi(args
[0].c_str());
163 int r
= atoi(args
[1].c_str());
164 if(p
>= (int)procs
.size() || r
>= NGPR
)
165 throw trap_illegal_instruction
;
167 return procs
[p
].R
[r
];
170 reg_t
sim_t::get_freg(const std::vector
<std::string
>& args
)
173 throw trap_illegal_instruction
;
175 int p
= atoi(args
[0].c_str());
176 int r
= atoi(args
[1].c_str());
177 if(p
>= (int)procs
.size() || r
>= NFPR
)
178 throw trap_illegal_instruction
;
180 return procs
[p
].FR
[r
];
183 void sim_t::interactive_reg(const std::vector
<std::string
>& args
)
185 printf("0x%016llx\n",(unsigned long long)get_reg(args
));
195 void sim_t::interactive_fregs(const std::vector
<std::string
>& args
)
198 f
.r
= get_freg(args
);
202 void sim_t::interactive_fregd(const std::vector
<std::string
>& args
)
205 f
.r
= get_freg(args
);
209 reg_t
sim_t::get_mem(const std::vector
<std::string
>& args
)
212 throw trap_illegal_instruction
;
214 reg_t addr
= strtol(args
[0].c_str(),NULL
,16), val
;
215 mmu_t
mmu(mem
,memsz
);
219 val
= mmu
.load_uint64(addr
);
222 val
= mmu
.load_uint32(addr
);
226 val
= mmu
.load_uint16(addr
);
229 val
= mmu
.load_uint8(addr
);
235 void sim_t::interactive_mem(const std::vector
<std::string
>& args
)
237 printf("0x%016llx\n",(unsigned long long)get_mem(args
));
240 void sim_t::interactive_until(const std::vector
<std::string
>& args
)
245 std::string cmd
= args
[0];
246 reg_t val
= strtol(args
[args
.size()-1].c_str(),NULL
,16);
248 std::vector
<std::string
> args2
;
249 args2
= std::vector
<std::string
>(args
.begin()+1,args
.end()-1);
255 current
= get_reg(args2
);
256 else if(args
[0] == "pc")
257 current
= get_pc(args2
);
258 else if(args
[0] == "mem")
259 current
= get_mem(args2
);