register breakpoint: MMR0-3
This commit is contained in:
parent
ffe36af9b4
commit
1344440a04
3 changed files with 53 additions and 4 deletions
|
@ -16,15 +16,55 @@ breakpoint_register::~breakpoint_register()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string breakpoint_register::get_name(hwreg_t reg) const
|
||||||
|
{
|
||||||
|
if (reg < 8)
|
||||||
|
return format("R%d", reg);
|
||||||
|
|
||||||
|
switch(reg) {
|
||||||
|
case hr_mmr0:
|
||||||
|
return "mmr0";
|
||||||
|
case hr_mmr1:
|
||||||
|
return "mmr1";
|
||||||
|
case hr_mmr2:
|
||||||
|
return "mmr2";
|
||||||
|
case hr_mmr3:
|
||||||
|
return "mmr3";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<std::string> breakpoint_register::is_triggered() const
|
std::optional<std::string> breakpoint_register::is_triggered() const
|
||||||
{
|
{
|
||||||
uint16_t v = c->getRegister(register_nr); // TODO run-mode
|
uint16_t v = 0;
|
||||||
|
|
||||||
|
if (register_nr < 8)
|
||||||
|
v = c->getRegister(register_nr); // TODO run-mode
|
||||||
|
else {
|
||||||
|
hwreg_t reg = hwreg_t(register_nr);
|
||||||
|
|
||||||
|
switch(reg) {
|
||||||
|
case hr_mmr0:
|
||||||
|
v = b->getMMR0();
|
||||||
|
break;
|
||||||
|
case hr_mmr1:
|
||||||
|
v = b->getMMR1();
|
||||||
|
break;
|
||||||
|
case hr_mmr2:
|
||||||
|
v = b->getMMR2();
|
||||||
|
break;
|
||||||
|
case hr_mmr3:
|
||||||
|
v = b->getMMR3();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto it = values.find(v);
|
auto it = values.find(v);
|
||||||
if (it == values.end())
|
if (it == values.end())
|
||||||
return { };
|
return { };
|
||||||
|
|
||||||
return format("R%d=%06o", register_nr, v);
|
return get_name(hwreg_t(register_nr)) + format("%06o", v);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<breakpoint_register *, std::optional<std::string> > breakpoint_register::parse(bus *const b, const std::string & in)
|
std::pair<breakpoint_register *, std::optional<std::string> > breakpoint_register::parse(bus *const b, const std::string & in)
|
||||||
|
@ -56,6 +96,11 @@ std::pair<breakpoint_register *, std::optional<std::string> > breakpoint_registe
|
||||||
else if (key == "PC" || key == "pc") {
|
else if (key == "PC" || key == "pc") {
|
||||||
return { new breakpoint_register(b, 7, values), { } };
|
return { new breakpoint_register(b, 7, values), { } };
|
||||||
}
|
}
|
||||||
|
else if (key.substr(0, 3) == "MMR" or key.substr(0, 3) == "mmr") {
|
||||||
|
int which = key[3] - '0';
|
||||||
|
|
||||||
|
return { new breakpoint_register(b, hr_mmr0 + which, values), { } };
|
||||||
|
}
|
||||||
|
|
||||||
return { nullptr, { } };
|
return { nullptr, { } };
|
||||||
}
|
}
|
||||||
|
@ -66,7 +111,7 @@ std::string breakpoint_register::emit() const
|
||||||
|
|
||||||
for(auto & v: values) {
|
for(auto & v: values) {
|
||||||
if (out.empty())
|
if (out.empty())
|
||||||
out = format("R%d", register_nr) + "=";
|
out = get_name(hwreg_t(register_nr)) + "=";
|
||||||
else
|
else
|
||||||
out += ",";
|
out += ",";
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,10 @@ private:
|
||||||
int register_nr { -1 };
|
int register_nr { -1 };
|
||||||
std::set<uint16_t> values;
|
std::set<uint16_t> values;
|
||||||
|
|
||||||
|
enum hwreg_t { hr_mmr0 = 100, hr_mmr1, hr_mmr2, hr_mmr3 };
|
||||||
|
|
||||||
|
std::string get_name(hwreg_t reg) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
breakpoint_register(bus *const b, const int register_nr, const std::set<uint16_t> & values);
|
breakpoint_register(bus *const b, const int register_nr, const std::set<uint16_t> & values);
|
||||||
virtual ~breakpoint_register();
|
virtual ~breakpoint_register();
|
||||||
|
|
|
@ -1026,7 +1026,7 @@ void debugger(console *const cnsl, bus *const b, std::atomic_uint32_t *const sto
|
||||||
cnsl->put_string_lf("sbp/cbp/lbp - set/clear/list breakpoint(s)");
|
cnsl->put_string_lf("sbp/cbp/lbp - set/clear/list breakpoint(s)");
|
||||||
cnsl->put_string_lf(" e.g.: (pc=0123 and memwv[04000]=0200,0300 and (r4=07,05 or r5=0456))");
|
cnsl->put_string_lf(" e.g.: (pc=0123 and memwv[04000]=0200,0300 and (r4=07,05 or r5=0456))");
|
||||||
cnsl->put_string_lf(" values seperated by ',', char after mem is w/b (word/byte), then");
|
cnsl->put_string_lf(" values seperated by ',', char after mem is w/b (word/byte), then");
|
||||||
cnsl->put_string_lf(" follows v/p (virtual/physical), all octal values");
|
cnsl->put_string_lf(" follows v/p (virtual/physical), all octal values, mmr0-3 are registers");
|
||||||
cnsl->put_string_lf("trace/t - toggle tracing");
|
cnsl->put_string_lf("trace/t - toggle tracing");
|
||||||
cnsl->put_string_lf("turbo - toggle turbo mode (cannot be interrupted)");
|
cnsl->put_string_lf("turbo - toggle turbo mode (cannot be interrupted)");
|
||||||
cnsl->put_string_lf("strace - start tracing from address - invoke without address to disable");
|
cnsl->put_string_lf("strace - start tracing from address - invoke without address to disable");
|
||||||
|
|
Loading…
Add table
Reference in a new issue