Added feature where if halt is performed by writing to 'tohost', then
the code that is written to '31..1' of 'tohost' is used as the program
exit code.
PiperOrigin-RevId: 708063430
Change-Id: I678ff01a5fa0be3f52809babe0b37149b215aa1e
diff --git a/cheriot/mpact_cheriot.cc b/cheriot/mpact_cheriot.cc
index 74efd2c..edc3006 100644
--- a/cheriot/mpact_cheriot.cc
+++ b/cheriot/mpact_cheriot.cc
@@ -243,6 +243,7 @@
int main(int argc, char **argv) {
absl::SetProgramUsageMessage(argv[0]);
auto arg_vec = absl::ParseCommandLine(argc, argv);
+ int exit_code = 0;
if (arg_vec.size() > 2) {
std::cerr << "Only a single input file allowed" << std::endl;
@@ -342,12 +343,14 @@
auto status = cheriot_top.tagged_watcher()->SetStoreWatchCallback(
TaggedMemoryWatcher::AddressRange{
tohost_addr, tohost_addr + 2 * sizeof(uint32_t) - 1},
- [tagged_memory, tohost_addr, &db, &cheriot_top](uint64_t, int) {
+ [tagged_memory, tohost_addr, &db, &cheriot_top, &exit_code](uint64_t,
+ int) {
if (db == nullptr) return;
tagged_memory->Load(tohost_addr, db, nullptr, nullptr);
uint32_t code = db->Get<uint32_t>(0);
if (code & 0x1) {
code >>= 1;
+ exit_code = code;
std::cerr << absl::StrCat("Simulation halted: exit ",
absl::Hex(code), "\n");
(void)cheriot_top.Halt();
@@ -626,4 +629,5 @@
delete memory_use_profiler;
delete semihost;
if (db != nullptr) db->DecRef();
+ return exit_code;
}