Updated how epochs are counted.
PiperOrigin-RevId: 709111444
Change-Id: If90e2275b935f0d44c0ef81a3344d83b7ab81ac2
diff --git a/cheriot/cheriot_ibex_hw_revoker.cc b/cheriot/cheriot_ibex_hw_revoker.cc
index 4df1238..46b4b2a 100644
--- a/cheriot/cheriot_ibex_hw_revoker.cc
+++ b/cheriot/cheriot_ibex_hw_revoker.cc
@@ -251,14 +251,14 @@
void CheriotIbexHWRevoker::Revoke() {
if (!sweep_in_progress_) return;
- // Increment the epoch.
- epoch_++;
uint64_t cap_address = start_address_ + (current_cap_++ << 3);
// Align address to the capability size.
cap_address &= ~0b111ULL;
ProcessCapability(cap_address);
// Check to see if we have reached the end of the region.
if (cap_address >= end_address_) {
+ // Increment the epoch.
+ epoch_++;
sweep_in_progress_ = false;
SetInterrupt(true);
}
diff --git a/cheriot/test/cheriot_ibex_hw_revoker_test.cc b/cheriot/test/cheriot_ibex_hw_revoker_test.cc
index cb5c7f6..8f89c5d 100644
--- a/cheriot/test/cheriot_ibex_hw_revoker_test.cc
+++ b/cheriot/test/cheriot_ibex_hw_revoker_test.cc
@@ -286,13 +286,13 @@
for (int i = 0; i < num; ++i) {
AdvanceRevoker();
EXPECT_EQ(GetLoadAddress(), kSweepBase + (i << 3));
- EXPECT_EQ(GetEpoch(), ((i + 1) << 1) | 1);
+ EXPECT_EQ(GetEpoch(), 1);
EXPECT_EQ(GetStatus(), 0);
}
// Step through the next capability. The sweep should be done.
AdvanceRevoker();
// Notice the in progress bit is cleared.
- EXPECT_EQ(GetEpoch(), ((num + 1) << 1) | 0);
+ EXPECT_EQ(GetEpoch(), (1 << 1) | 0);
// Interrupt status should be 0, as interrupt enable is off.
EXPECT_EQ(GetStatus(), 0);
}