--- nono/debugger/debugger.cpp 2026/04/29 17:05:24 1.1.1.15 +++ nono/debugger/debugger.cpp 2026/04/29 17:05:32 1.1.1.17 @@ -63,13 +63,13 @@ Debugger::Debugger() pVectorTable.reset(new VectorTable(gMainApp.GetVMType())); // ブレークポイントモニタ - bpoint_monitor.func = ToMonitorCallback(&Debugger::MonitorUpdateBpoint); - bpoint_monitor.SetSize(60, 9); - bpoint_monitor.Regist(ID_MONITOR_BREAKPOINT); + bpoint_monitor = gMonitorManager->Regist(ID_MONITOR_BREAKPOINT, this); + bpoint_monitor->func = ToMonitorCallback(&Debugger::MonitorUpdateBpoint); + bpoint_monitor->SetSize(60, 9); // メモリダンプモニタ for (int i = 0, end = memdump_monitor.size(); i < end; i++) { - int objid = OBJ_MPU_MEMDUMP(i); + uint objid = OBJ_MPU_MEMDUMP(i); int monid = ID_MONITOR_MEMDUMP(i); memdump_monitor[i].reset(new MemdumpMonitor(objid, monid)); } @@ -77,7 +77,7 @@ Debugger::Debugger() if (gMainApp.Has(VMCap::LUNA)) { // XP 空間のメモリダンプモニタ for (int i = 0, end = xpmemdump_monitor.size(); i < end; i++) { - int objid = OBJ_XP_MEMDUMP(i); + uint objid = OBJ_XP_MEMDUMP(i); int monid = ID_MONITOR_XPMEMDUMP(i); xpmemdump_monitor[i].reset(new MemdumpMonitor(objid, monid)); } @@ -202,7 +202,14 @@ Debugger::Init() } // を取り出す - if (!ParseVerbHex(addrstr.c_str(), &bp.addr)) { + if (ParseVerbHex(addrstr.c_str(), &bp.addr)) { + bp.type = BreakpointType::Address; + } else if (addrstr[0] == 'v' + && ParseVector( + ParseCPU(cpustr), &(addrstr.c_str()[1]), (uint32 *)&bp.vec1)) { + bp.type = BreakpointType::Exception; + bp.vec2 = bp.vec1; + } else { warnx("\"%s\": Invalid breakpoint address", str.c_str()); return false; } @@ -211,7 +218,6 @@ Debugger::Init() bp.skip = atoi(skipstr.c_str()); } // 登録 - bp.type = BreakpointType::Address; AddBreakpoint(bp, cpustr); } @@ -241,6 +247,8 @@ Debugger::Init() void Debugger::ThreadRun() { + SetThreadAffinityHint(AffinityClass::Light); + // disp_regs の初期値設定。 // 再接続でも継続してていいような気がするのでループ外で初期化。 disp_regs.clear(); @@ -330,14 +338,16 @@ Debugger::Terminate() static int readfunc(void *cookie, char *buf, int bufsize) { - return ((Debugger *)cookie)->ReadFunc(buf, bufsize); + auto debugger = reinterpret_cast(cookie); + return debugger->ReadFunc(buf, bufsize); } // funopen の write コールバック static int writefunc(void *cookie, const char *buf, int len) { - return ((Debugger *)cookie)->WriteFunc(buf, len); + auto debugger = reinterpret_cast(cookie); + return debugger->WriteFunc(buf, len); } // funopen の read コールバックの本体 @@ -885,7 +895,9 @@ Debugger::CheckBreakpointInst(breakpoint // bi_inst_bytes が読み込んだバイト数(bi_inst の左からの有効バイト数)。 // bi_need_bytes が現在のブレークポイントで読み込む必要のあるバイト数。 - busaddr laddr(bp.md->GetPC(), busaddr::Fetch, bp.md->IsSuper()); + busaddr laddr = busaddr(bp.md->GetPC()) + | BusAddr::Fetch + | busaddr::SU(bp.md->IsSuper()); DebuggerMemoryStream mem(bp.md, laddr); // 必要なバイト数に達するまで読み足す @@ -1713,9 +1725,9 @@ Debugger::cmd_bv() int bi = AddBreakpoint(bp, cpustr); if (bi == -1) { fprintf(cons, "no free breakpoints\n"); - } else { - fprintf(cons, "breakpoint #%d added\n", bi); + return CmdAct::Stay; } + fprintf(cons, "breakpoint #%d added\n", bi); // この CPU 側に、すでに来ている例外をクリア。 // ブレークポイント設定の有無に関わらず例外が起きたら CPU 側から常に @@ -2007,8 +2019,8 @@ Debugger::cmd_hist_common(BranchHistory& int lines = std::min(used, maxlines) + 1; // MonitorUpdate() は TextScreen 高さに合わせて出力してくれる。 - auto& histmon = hist.monitor; - auto size = histmon.GetSize(); + auto *histmon = hist.monitor; + auto size = histmon->GetSize(); TextScreen screen; screen.Init(size.width, lines); @@ -2191,15 +2203,15 @@ Debugger::GetAddr(busaddr *sa, bool defa if (mod_prog < 0) { mod_prog = !default_data; } - sa->SetSuper(mod_super); - sa->SetData(!mod_prog); + sa->ChangeSuper(mod_super); + sa->ChangeData(!mod_prog); // アドレス if (ParseAddr(str.c_str() + addrpos, &addr) == false) { return false; } // 命令境界に丸める - sa->SetAddr(addr & ~(curmd->inst_bytes - 1)); + sa->ChangeAddr(addr & ~(curmd->inst_bytes - 1)); return true; } @@ -2240,7 +2252,9 @@ Debugger::cmd_z() } else { // 可変長なら逆アセンブルしてみるしか。 - busaddr laddr(curmd->GetPC(), busaddr::Fetch, curmd->IsSuper()); + busaddr laddr = busaddr(curmd->GetPC()) + | BusAddr::Fetch + | busaddr::SU(curmd->IsSuper()); DebuggerMemoryStream mem(curmd, laddr); // XXX 失敗したらどうすべ curmd->Disassemble(mem); @@ -2267,22 +2281,22 @@ void Debugger::ResetStickyAddr() { pc = curmd->GetPC(); - m_last_addr.Set(pc, busaddr::Read, curmd->IsSuper()); - d_last_addr.Set(pc, busaddr::Fetch, curmd->IsSuper()); + m_last_addr = busaddr(pc) | BusAddr::Read | busaddr::SU(curmd->IsSuper()); + d_last_addr = busaddr(pc) | BusAddr::Fetch | busaddr::SU(curmd->IsSuper()); } // 逆アセンブル: d [[SU:] []] (論理) Debugger::CmdAct Debugger::cmd_d() { - return cmd_d_common(busaddr::Logical); + return cmd_d_common(BusAddr::Logical); } // 逆アセンブル: D [ []] (物理) Debugger::CmdAct Debugger::cmd_D() { - return cmd_d_common(busaddr::Physical); + return cmd_d_common(BusAddr::Physical); } // 逆アセンブル共通 @@ -2407,14 +2421,14 @@ Debugger::cmd_L() Debugger::CmdAct Debugger::cmd_m() { - return cmd_m_common(busaddr::Logical); + return cmd_m_common(BusAddr::Logical); } // メモリダンプ: M [ []] (物理) Debugger::CmdAct Debugger::cmd_M() { - return cmd_m_common(busaddr::Physical); + return cmd_m_common(BusAddr::Physical); } // メモリダンプ共通 @@ -2478,7 +2492,9 @@ Debugger::cmd_minus() std::string addrbuf; std::string textbuf; - busaddr laddr(pc, busaddr::Fetch, curmd->IsSuper()); + busaddr laddr = busaddr(pc) + | BusAddr::Fetch + | busaddr::SU(curmd->IsSuper()); DebuggerMemoryStream mem(curmd, laddr); // アドレス if (mem.FormatAddr(addrbuf) == false) { @@ -2539,7 +2555,9 @@ Debugger::cmd_n_common(bool trace) void Debugger::SetNBreakpoint() { - busaddr laddr(curmd->GetPC(), busaddr::Fetch, curmd->IsSuper()); + busaddr laddr = busaddr(curmd->GetPC()) + | BusAddr::Fetch + | busaddr::SU(curmd->IsSuper()); DebuggerMemoryStream mem(curmd, laddr); // 命令がサブルーチンやトラップなどステップインできる命令か。 @@ -2586,12 +2604,12 @@ Debugger::CmdAct Debugger::cmd_show() { if (args.size() != 2) { - std::vector list; + std::vector list; // 登録されているモニタだけを列挙 // (登録されていてもサブウィンドウの ID を持っているものは除外) for (const auto mon : gMonitorManager->GetList()) { - int id = mon->GetId(); + uint id = mon->GetId(); if (id <= ID_MONITOR_END) { list.push_back(id); } @@ -2609,7 +2627,7 @@ Debugger::cmd_show() std::string name = args[1]; for (auto mon : gMonitorManager->GetList()) { - int id = mon->GetId(); + uint id = mon->GetId(); const auto& aliases = gMonitorManager->GetAliases(id); bool matched = false; @@ -2633,7 +2651,7 @@ Debugger::cmd_show() fprintf(cons, "unknown monitor name: \"%s\"\n", name.c_str()); } else if (candidates.size() == 1) { // 確定した - Monitor& mon = *(candidates[0]); + Monitor *mon = candidates[0]; ShowMonitor(mon); } else { // 候補が複数あった @@ -2651,12 +2669,12 @@ Debugger::cmd_show() // モニタを更新して表示。 void -Debugger::ShowMonitor(Monitor& monitor) +Debugger::ShowMonitor(Monitor *monitor) { // モニタを更新 TextScreen ts; - auto size = monitor.GetSize(); + auto size = monitor->GetSize(); ts.Init(size.width, size.height); MONITOR_UPDATE(monitor, ts); @@ -2849,11 +2867,6 @@ Debugger::ParseAddr(const char *arg, uin uint64 r; r = curmd->GetRegAddr(arg + 1); if ((int64)r < 0) { -#if 0 // not yet - fprintf(cons, "valid register name are: %s%s\n", - "%d0-%d7,%a0-%a7,%sp,%usp,%isp,%pc", - ",%msp,%vbr,%srp,%crp"); -#endif fprintf(cons, "invalid register name\n"); return false; }