No public description

PiperOrigin-RevId: 640616489
Change-Id: I4caaca70b807805aced7863e8140089650df5dbd
diff --git a/cheriot/cheriot_top.cc b/cheriot/cheriot_top.cc
index 2a5edae..3557f96 100644
--- a/cheriot/cheriot_top.cc
+++ b/cheriot/cheriot_top.cc
@@ -193,7 +193,7 @@
   rv_bp_manager_ = new riscv::RiscVBreakpointManager(
       rv_action_point_manager_,
       [this](HaltReason halt_reason) { RequestHalt(halt_reason, nullptr); });
-  // Set the software breakpoint callback.
+  // Set the software action callback.
   state_->AddEbreakHandler([this](const Instruction *inst) {
     if (rv_action_point_manager_->IsActionPointActive(inst->address())) {
       // Need to request a halt so that the action point can be stepped past
@@ -275,7 +275,6 @@
 
 absl::Status CheriotTop::StepPastBreakpoint() {
   uint64_t pc = state_->pc_operand()->AsUint64(0);
-  uint64_t bpt_pc = pc;
   // Disable the breakpoint.
   rv_action_point_manager_->WriteOriginalInstruction(pc);
   // Execute the real instruction.
@@ -294,11 +293,11 @@
   real_inst->DecRef();
   // Re-enable the breakpoint.
   // Re-enable the breakpoint.
-  rv_action_point_manager_->WriteBreakpointInstruction(bpt_pc);
+  rv_action_point_manager_->WriteBreakpointInstruction(pc);
   // Get the next pc value.
-  uint64_t pcc_val = pcc_->data_buffer()->Get<uint32_t>(0);
   if (state_->branch()) {
     state_->set_branch(false);
+    uint64_t pcc_val = pcc_->data_buffer()->Get<uint32_t>(0);
     AddToBranchTrace(pc, pcc_val);
     next_pc = pcc_val;
     if (break_on_control_flow_change_) {
@@ -350,7 +349,7 @@
     SetPc(pc);
     auto *inst = cheriot_decode_cache_->GetDecodedInstruction(pc);
     // Set the next_pc to the next sequential instruction.
-    next_pc += inst->size();
+    next_pc = pc + inst->size();
     bool executed = false;
     do {
       executed = ExecuteInstruction(inst);
@@ -452,7 +451,7 @@
       SetPc(pc);
       // Set the PC destination operand to next_seq_pc. Any branch that is
       // executed will overwrite this.
-      next_pc += inst->size();
+      next_pc = pc + inst->size();
       bool executed = false;
       do {
         // Try executing the instruction. If it fails, advance a cycle
diff --git a/cheriot/riscv_cheriot_i_instructions.cc b/cheriot/riscv_cheriot_i_instructions.cc
index 16bf8cc..062879d 100644
--- a/cheriot/riscv_cheriot_i_instructions.cc
+++ b/cheriot/riscv_cheriot_i_instructions.cc
@@ -42,7 +42,8 @@
   db->DecRef();
   // See if the instruction is interpreted as 32 or 16 bit instruction.
   if ((inst_word & 0b11) != 0b11) inst_word &= 0xffff;
-  LOG(INFO) << "RiscVIllegalInstruction: " << std::hex << inst_word;
+  LOG(INFO) << "RiscVIllegalInstruction at: [" << std::hex << inst->address()
+            << "] " << inst_word;
   state->Trap(/*is_interrupt=*/false, /*trap_value=*/inst_word,
               *EC::kIllegalInstruction,
               /*epc=*/inst->address(), inst);