Browse Source

Merge branch 'master' of /project/eecs/parlab/git/projects/riscv

Conflicts:
	sim/riscv/insns/mtpcr.h
	sim/riscv/processor.cc
cs250
Andrew Waterman 16 years ago
parent
commit
5c88aa157b
  1. 2
      riscv/insns/mfpcr.h
  2. 1
      riscv/insns/mtpcr.h
  3. 2
      riscv/processor.cc
  4. 2
      riscv/processor.h
  5. 65
      riscv/sim.cc
  6. 25
      riscv/sim.h

2
riscv/insns/mfpcr.h

@ -28,7 +28,7 @@ switch(insn.rtype.rb)
break; break;
case 17: case 17:
val = sim->get_fromhost(); fromhost = val = sim->get_fromhost();
break; break;
case 24: case 24:

1
riscv/insns/mtpcr.h

@ -20,6 +20,7 @@ switch(insn.rtype.rb)
break; break;
case 16: case 16:
tohost = RA;
sim->set_tohost(RA); sim->set_tohost(RA);
break; break;

2
riscv/processor.cc

@ -21,6 +21,8 @@ processor_t::processor_t(sim_t* _sim, char* _mem, size_t _memsz)
tid = 0; tid = 0;
pcr_k0 = 0; pcr_k0 = 0;
pcr_k1 = 0; pcr_k1 = 0;
tohost = 0;
fromhost = 0;
count = 0; count = 0;
compare = 0; compare = 0;
interrupts_pending = 0; interrupts_pending = 0;

2
riscv/processor.h

@ -27,6 +27,8 @@ private:
reg_t epc; reg_t epc;
reg_t badvaddr; reg_t badvaddr;
reg_t ebase; reg_t ebase;
reg_t tohost;
reg_t fromhost;
reg_t pcr_k0; reg_t pcr_k0;
reg_t pcr_k1; reg_t pcr_k1;
uint32_t id; uint32_t id;

65
riscv/sim.cc

@ -53,7 +53,7 @@ void sim_t::run(bool debug)
char* p = strtok(s," "); char* p = strtok(s," ");
if(!p) if(!p)
{ {
interactive_run_noisy(std::vector<std::string>(1,"1")); interactive_run_noisy(std::string("r"), std::vector<std::string>(1,"1"));
continue; continue;
} }
std::string cmd = p; std::string cmd = p;
@ -63,7 +63,7 @@ void sim_t::run(bool debug)
args.push_back(p); args.push_back(p);
typedef void (sim_t::*interactive_func)(const std::vector<std::string>&); typedef void (sim_t::*interactive_func)(const std::string&, const std::vector<std::string>&);
std::map<std::string,interactive_func> funcs; std::map<std::string,interactive_func> funcs;
funcs["r"] = &sim_t::interactive_run_noisy; funcs["r"] = &sim_t::interactive_run_noisy;
@ -75,12 +75,13 @@ void sim_t::run(bool debug)
funcs["fregd"] = &sim_t::interactive_fregd; funcs["fregd"] = &sim_t::interactive_fregd;
funcs["mem"] = &sim_t::interactive_mem; funcs["mem"] = &sim_t::interactive_mem;
funcs["until"] = &sim_t::interactive_until; funcs["until"] = &sim_t::interactive_until;
funcs["while"] = &sim_t::interactive_until;
funcs["q"] = &sim_t::interactive_quit; funcs["q"] = &sim_t::interactive_quit;
try try
{ {
if(funcs.count(cmd)) if(funcs.count(cmd))
(this->*funcs[cmd])(args); (this->*funcs[cmd])(cmd, args);
} }
catch(trap_t t) {} catch(trap_t t) {}
} }
@ -94,17 +95,17 @@ void sim_t::step_all(size_t n, size_t interleave, bool noisy)
procs[i].step(interleave,noisy); procs[i].step(interleave,noisy);
} }
void sim_t::interactive_run_noisy(const std::vector<std::string>& args) void sim_t::interactive_run_noisy(const std::string& cmd, const std::vector<std::string>& args)
{ {
interactive_run(args,true); interactive_run(cmd,args,true);
} }
void sim_t::interactive_run_silent(const std::vector<std::string>& args) void sim_t::interactive_run_silent(const std::string& cmd, const std::vector<std::string>& args)
{ {
interactive_run(args,false); interactive_run(cmd,args,false);
} }
void sim_t::interactive_run(const std::vector<std::string>& args, bool noisy) void sim_t::interactive_run(const std::string& cmd, const std::vector<std::string>& args, bool noisy)
{ {
if(args.size()) if(args.size())
step_all(atoi(args[0].c_str()),1,noisy); step_all(atoi(args[0].c_str()),1,noisy);
@ -112,17 +113,17 @@ void sim_t::interactive_run(const std::vector<std::string>& args, bool noisy)
while(1) step_all(1,1,noisy); while(1) step_all(1,1,noisy);
} }
void sim_t::interactive_run_proc_noisy(const std::vector<std::string>& args) void sim_t::interactive_run_proc_noisy(const std::string& cmd, const std::vector<std::string>& args)
{ {
interactive_run_proc(args,true); interactive_run_proc(cmd,args,true);
} }
void sim_t::interactive_run_proc_silent(const std::vector<std::string>& args) void sim_t::interactive_run_proc_silent(const std::string& cmd, const std::vector<std::string>& args)
{ {
interactive_run_proc(args,false); interactive_run_proc(cmd,args,false);
} }
void sim_t::interactive_run_proc(const std::vector<std::string>& a, bool noisy) void sim_t::interactive_run_proc(const std::string& cmd, const std::vector<std::string>& a, bool noisy)
{ {
if(a.size() == 0) if(a.size() == 0)
return; return;
@ -137,7 +138,7 @@ void sim_t::interactive_run_proc(const std::vector<std::string>& a, bool noisy)
while(1) procs[p].step(1,noisy); while(1) procs[p].step(1,noisy);
} }
void sim_t::interactive_quit(const std::vector<std::string>& args) void sim_t::interactive_quit(const std::string& cmd, const std::vector<std::string>& args)
{ {
exit(0); exit(0);
} }
@ -180,7 +181,19 @@ reg_t sim_t::get_freg(const std::vector<std::string>& args)
return procs[p].FR[r]; return procs[p].FR[r];
} }
void sim_t::interactive_reg(const std::vector<std::string>& args) reg_t sim_t::get_tohost(const std::vector<std::string>& args)
{
if(args.size() != 1)
throw trap_illegal_instruction;
int p = atoi(args[0].c_str());
if(p >= (int)procs.size())
throw trap_illegal_instruction;
return procs[p].tohost;
}
void sim_t::interactive_reg(const std::string& cmd, const std::vector<std::string>& args)
{ {
printf("0x%016llx\n",(unsigned long long)get_reg(args)); printf("0x%016llx\n",(unsigned long long)get_reg(args));
} }
@ -192,14 +205,14 @@ union fpr
double d; double d;
}; };
void sim_t::interactive_fregs(const std::vector<std::string>& args) void sim_t::interactive_fregs(const std::string& cmd, const std::vector<std::string>& args)
{ {
fpr f; fpr f;
f.r = get_freg(args); f.r = get_freg(args);
printf("%g\n",f.s); printf("%g\n",f.s);
} }
void sim_t::interactive_fregd(const std::vector<std::string>& args) void sim_t::interactive_fregd(const std::string& cmd, const std::vector<std::string>& args)
{ {
fpr f; fpr f;
f.r = get_freg(args); f.r = get_freg(args);
@ -232,17 +245,17 @@ reg_t sim_t::get_mem(const std::vector<std::string>& args)
return val; return val;
} }
void sim_t::interactive_mem(const std::vector<std::string>& args) void sim_t::interactive_mem(const std::string& cmd, const std::vector<std::string>& args)
{ {
printf("0x%016llx\n",(unsigned long long)get_mem(args)); printf("0x%016llx\n",(unsigned long long)get_mem(args));
} }
void sim_t::interactive_until(const std::vector<std::string>& args) void sim_t::interactive_until(const std::string& cmd, const std::vector<std::string>& args)
{ {
if(args.size() < 3) if(args.size() < 3)
return; return;
std::string cmd = args[0]; std::string scmd = args[0];
reg_t val = strtol(args[args.size()-1].c_str(),NULL,16); reg_t val = strtol(args[args.size()-1].c_str(),NULL,16);
std::vector<std::string> args2; std::vector<std::string> args2;
@ -251,16 +264,20 @@ void sim_t::interactive_until(const std::vector<std::string>& args)
while(1) while(1)
{ {
reg_t current; reg_t current;
if(args[0] == "reg") if(scmd == "reg")
current = get_reg(args2); current = get_reg(args2);
else if(args[0] == "pc") else if(scmd == "pc")
current = get_pc(args2); current = get_pc(args2);
else if(args[0] == "mem") else if(scmd == "mem")
current = get_mem(args2); current = get_mem(args2);
else if(scmd == "tohost")
current = get_tohost(args2);
else else
return; return;
if(current == val) if(cmd == "until" && current == val)
break;
if(cmd == "while" && current != val)
break; break;
step_all(1,1,false); step_all(1,1,false);

25
riscv/sim.h

@ -32,26 +32,27 @@ private:
void step_all(size_t n, size_t interleave, bool noisy); void step_all(size_t n, size_t interleave, bool noisy);
void interactive_quit(const std::vector<std::string>& args); void interactive_quit(const std::string& cmd, const std::vector<std::string>& args);
void interactive_run(const std::vector<std::string>& args, bool noisy); void interactive_run(const std::string& cmd, const std::vector<std::string>& args, bool noisy);
void interactive_run_noisy(const std::vector<std::string>& args); void interactive_run_noisy(const std::string& cmd, const std::vector<std::string>& args);
void interactive_run_silent(const std::vector<std::string>& args); void interactive_run_silent(const std::string& cmd, const std::vector<std::string>& args);
void interactive_run_proc(const std::vector<std::string>& args, bool noisy); void interactive_run_proc(const std::string& cmd, const std::vector<std::string>& args, bool noisy);
void interactive_run_proc_noisy(const std::vector<std::string>& args); void interactive_run_proc_noisy(const std::string& cmd, const std::vector<std::string>& args);
void interactive_run_proc_silent(const std::vector<std::string>& args); void interactive_run_proc_silent(const std::string& cmd, const std::vector<std::string>& args);
void interactive_reg(const std::vector<std::string>& args); void interactive_reg(const std::string& cmd, const std::vector<std::string>& args);
void interactive_fregs(const std::vector<std::string>& args); void interactive_fregs(const std::string& cmd, const std::vector<std::string>& args);
void interactive_fregd(const std::vector<std::string>& args); void interactive_fregd(const std::string& cmd, const std::vector<std::string>& args);
void interactive_mem(const std::vector<std::string>& args); void interactive_mem(const std::string& cmd, const std::vector<std::string>& args);
void interactive_until(const std::vector<std::string>& args); void interactive_until(const std::string& cmd, const std::vector<std::string>& args);
reg_t get_reg(const std::vector<std::string>& args); reg_t get_reg(const std::vector<std::string>& args);
reg_t get_freg(const std::vector<std::string>& args); reg_t get_freg(const std::vector<std::string>& args);
reg_t get_mem(const std::vector<std::string>& args); reg_t get_mem(const std::vector<std::string>& args);
reg_t get_pc(const std::vector<std::string>& args); reg_t get_pc(const std::vector<std::string>& args);
reg_t get_tohost(const std::vector<std::string>& args);
friend class appserver_link_t; friend class appserver_link_t;
}; };

Loading…
Cancel
Save