No public description
PiperOrigin-RevId: 637938358
Change-Id: If5f5dc906f46565e4233580553263594231aa091
diff --git a/cheriot/cheriot_register.cc b/cheriot/cheriot_register.cc
index af76381..d4c64f3 100644
--- a/cheriot/cheriot_register.cc
+++ b/cheriot/cheriot_register.cc
@@ -294,6 +294,7 @@
raw_ = compressed;
is_dirty_ = false;
is_null_ = false;
+ raw_ = compressed;
}
void CheriotRegister::Validate() {
diff --git a/cheriot/cheriot_state.cc b/cheriot/cheriot_state.cc
index 95c795e..49e8183 100644
--- a/cheriot/cheriot_state.cc
+++ b/cheriot/cheriot_state.cc
@@ -655,6 +655,7 @@
// Update the PC from the mtvec_ capability. Update the address in case of
// vectored mode.
pcc()->CopyFrom(*mtcc_);
+ pcc()->set_address(trap_target);
set_branch(true);
// TODO(torerik): set next pc
mstatus_->Submit();
diff --git a/cheriot/cheriot_top.cc b/cheriot/cheriot_top.cc
index 7bdbc8d..f829a88 100644
--- a/cheriot/cheriot_top.cc
+++ b/cheriot/cheriot_top.cc
@@ -334,15 +334,16 @@
// Step the simulator forward until the number of steps have been achieved, or
// there is a halt request.
- // This holds the value of the current pc, and post-loop, the address of
- // the most recently executed instruction.
- uint64_t pc;
+ // Clear the halt reason.
+ halt_reason_ = *HaltReason::kNone;
// At the top of the loop this holds the address of the instruction to be
// executed next. Post-loop it holds the address of the next instruction to
// be executed.
uint64_t next_pc = pcc_->data_buffer()->Get<uint32_t>(0);
+ // This holds the value of the current pc, and post-loop, the address of
+ // the most recently executed instruction.
+ uint64_t pc = next_pc;
while (!halted_ && (count < num)) {
- pc = next_pc;
SetPc(pc);
auto *inst = cheriot_decode_cache_->GetDecodedInstruction(pc);
// Set the next_pc to the next sequential instruction.
@@ -377,7 +378,10 @@
halt_reason_ = *HaltReason::kHardwareBreakpoint;
}
}
- if (!halted_) continue;
+ if (!halted_) {
+ pc = next_pc;
+ continue;
+ }
// If it's an action point, just step over and continue.
if (halt_reason_ == *HaltReason::kActionPoint) {
auto status = StepPastBreakpoint();
@@ -420,6 +424,7 @@
if (!status.ok()) return status;
}
run_status_ = RunStatus::kRunning;
+ halt_reason_ = *HaltReason::kNone;
halted_ = false;
// The simulator is now run in a separate thread so as to allow a user
@@ -428,15 +433,14 @@
run_halted_ = new absl::Notification();
// The thread is detached so it executes without having to be joined.
std::thread([this]() {
- // This holds the value of the current pc, and post-loop, the address of
- // the most recently executed instruction.
- uint64_t pc;
// At the top of the loop this holds the address of the instruction to be
// executed next. Post-loop it holds the address of the next instruction to
// be executed.
uint64_t next_pc = pcc_->data_buffer()->Get<uint32_t>(0);
+ // This holds the value of the current pc, and post-loop, the address of
+ // the most recently executed instruction.
+ uint64_t pc = next_pc;
while (!halted_) {
- pc = next_pc;
auto *inst = cheriot_decode_cache_->GetDecodedInstruction(pc);
SetPc(pc);
// Set the PC destination operand to next_seq_pc. Any branch that is
@@ -474,7 +478,10 @@
halt_reason_ = *HaltReason::kHardwareBreakpoint;
}
}
- if (!halted_) continue;
+ if (!halted_) {
+ pc = next_pc;
+ continue;
+ }
// If it's an action point, just step over and continue executing, as
// this is not a full breakpoint.
if (halt_reason_ == *HaltReason::kActionPoint) {
diff --git a/cheriot/riscv_cheriot_instructions.cc b/cheriot/riscv_cheriot_instructions.cc
index 09ccc3d..b97e720 100644
--- a/cheriot/riscv_cheriot_instructions.cc
+++ b/cheriot/riscv_cheriot_instructions.cc
@@ -15,7 +15,6 @@
#include "cheriot/riscv_cheriot_instructions.h"
#include <any>
-#include <bit>
#include <cstdint>
#include <type_traits>