Enabled data caches.
Fixes some issues:
  - Failure when using tagged loads/stores
  - Write allocation was done regardless of the configuration

PiperOrigin-RevId: 681988267
Change-Id: I1418f8f37f77f2e437f06638fa329585526bb652
diff --git a/cheriot/cheriot_renode.cc b/cheriot/cheriot_renode.cc
index da29a83..4ab981b 100644
--- a/cheriot/cheriot_renode.cc
+++ b/cheriot/cheriot_renode.cc
@@ -469,6 +469,10 @@
     auto *cfg = cheriot_top_->GetConfig("dcache");
     auto status = cfg->Import(&dcache_value);
     if (!status.ok()) return status;
+    // Hook the cache into the memory port.
+    auto *dcache = cheriot_top_->dcache();
+    dcache->set_tagged_memory(cheriot_top_->state()->tagged_memory());
+    cheriot_top_->state()->set_tagged_memory(dcache);
   }
   return absl::OkStatus();
 }
diff --git a/cheriot/cheriot_top.cc b/cheriot/cheriot_top.cc
index d683b61..8643188 100644
--- a/cheriot/cheriot_top.cc
+++ b/cheriot/cheriot_top.cc
@@ -103,6 +103,7 @@
   if (branch_trace_db_ != nullptr) branch_trace_db_->DecRef();
 
   delete icache_;
+  delete dcache_;
   if (inst_db_) inst_db_->DecRef();
   delete rv_bp_manager_;
   delete cheriot_decode_cache_;
diff --git a/cheriot/mpact_cheriot.cc b/cheriot/mpact_cheriot.cc
index dc6185f..ced488d 100644
--- a/cheriot/mpact_cheriot.cc
+++ b/cheriot/mpact_cheriot.cc
@@ -156,8 +156,9 @@
 ABSL_FLAG(uint64_t, clint, 0x0200'0000ULL, "Base address of clint");
 ABSL_FLAG(uint64_t, uart, 0x1000'0000ULL, "Base address of uart");
 
-// Flag to enable and configure the instruction cache.
+// Flag to enable and configure the instruction and data caches.
 ABSL_FLAG(std::string, icache, "", "Instruction cache configuration");
+ABSL_FLAG(std::string, dcache, "", "Data cache configuration");
 
 constexpr char kStackEndSymbolName[] = "__stack_end";
 constexpr char kStackSizeSymbolName[] = "__stack_size";
@@ -301,7 +302,18 @@
     if (!status.ok()) return -1;
   }
 
-  // TODO: enable dcache.
+  if (!absl::GetFlag(FLAGS_dcache).empty()) {
+    ComponentValueEntry dcache_value;
+    dcache_value.set_name("dcache");
+    dcache_value.set_string_value(absl::GetFlag(FLAGS_dcache));
+    auto *cfg = cheriot_top.GetConfig("dcache");
+    auto status = cfg->Import(&dcache_value);
+    if (!status.ok()) return -1;
+    // Hook the cache into the memory port.
+    auto *dcache = cheriot_top.dcache();
+    dcache->set_memory(cheriot_top.state()->tagged_memory());
+    cheriot_top.state()->set_tagged_memory(dcache);
+  }
 
   // Enable instruction profiling if the flag is set.
   InstructionProfiler *inst_profiler = nullptr;