No public description PiperOrigin-RevId: 638332171 Change-Id: I0e1b753bc26aa43039368e1554ec4598eef621e9
diff --git a/cheriot/cheriot_renode.cc b/cheriot/cheriot_renode.cc index 505dc77..5db8b7f 100644 --- a/cheriot/cheriot_renode.cc +++ b/cheriot/cheriot_renode.cc
@@ -233,31 +233,33 @@ entry_pt = res.value(); } auto res = program_loader_->GetSymbol("tohost"); - // if 'tohost' is not found, just return entry_pt. - if (!res.ok()) return entry_pt; - // If there is a 'tohost' symbol, set up a write watchpoint on that address - // to catch writes that mark program exit. - uint64_t tohost_addr = res.value().first; - // Add to_host watchpoint that halts the execution when program exit is - // signaled. - auto *db = cheriot_top_->state()->db_factory()->Allocate<uint32_t>(2); - auto status = cheriot_top_->tagged_watcher()->SetStoreWatchCallback( - TaggedMemoryWatcher::AddressRange{tohost_addr, - tohost_addr + 2 * sizeof(uint32_t) - 1}, - [this, tohost_addr, db](uint64_t addr, int sz) { - static DataBuffer *load_db = db; - if (load_db == nullptr) return; - tagged_memory_->Load(tohost_addr, load_db, nullptr, nullptr); - uint32_t code = load_db->Get<uint32_t>(0); - if (code & 0x1) { - // The return code is in the upper 31 bits. - code >>= 1; - LOG(INFO) << absl::StrCat( - "Simulation halting due to tohost write: exit ", absl::Hex(code)); - (void)cheriot_top_->RequestHalt(HaltReason::kProgramDone, nullptr); - load_db->DecRef(); - } - }); + // Add watchpoint for tohost if the symbol exists. + if (!res.ok()) { + // If there is a 'tohost' symbol, set up a write watchpoint on that address + // to catch writes that mark program exit. + uint64_t tohost_addr = res.value().first; + // Add to_host watchpoint that halts the execution when program exit is + // signaled. + auto *db = cheriot_top_->state()->db_factory()->Allocate<uint32_t>(2); + auto status = cheriot_top_->tagged_watcher()->SetStoreWatchCallback( + TaggedMemoryWatcher::AddressRange{ + tohost_addr, tohost_addr + 2 * sizeof(uint32_t) - 1}, + [this, tohost_addr, db](uint64_t addr, int sz) { + static DataBuffer *load_db = db; + if (load_db == nullptr) return; + tagged_memory_->Load(tohost_addr, load_db, nullptr, nullptr); + uint32_t code = load_db->Get<uint32_t>(0); + if (code & 0x1) { + // The return code is in the upper 31 bits. + code >>= 1; + LOG(INFO) << absl::StrCat( + "Simulation halting due to tohost write: exit ", + absl::Hex(code)); + (void)cheriot_top_->RequestHalt(HaltReason::kProgramDone, nullptr); + load_db->DecRef(); + } + }); + } // Add instruction profiler it hasn't already been added. if (inst_profiler_ == nullptr) { inst_profiler_ = new Profiler(*program_loader_, 2);