cpu: Failure to restore RAS during squash
authorSungkeun Kim <ksungkeun84@tamu.edu>
Sat, 22 Aug 2020 20:55:33 +0000 (15:55 -0500)
committerSungkeun Kim <danguria@gmail.com>
Fri, 4 Sep 2020 22:12:33 +0000 (22:12 +0000)
During squash of branch predictor history, RAS recovery mess up the
stack because of function "restore" in RAS (src/cpu/pred/ras.cc). In
restore function, it does not update "usedEntries" variable resulting in
restore failure.

To be specific, in order to remove mispredicted call, it uses pop() and
it updates tos. However in order to restore mispredicted ret
instruction, it uses restore() but it does not update tos. This pair of
function call mess up the RAS resulting in many misspeculation.

The solution is to update usedEntries variable as “push” function does.
This is possible because restoration is done with reverse order of push
and pop.

Jira Issue: https://gem5.atlassian.net/browse/GEM5-732

Change-Id: Ia14e71c26d20b2795fd55a6a0dd3284c03570614
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/33214
Reviewed-by: Trivikram Reddy <tvreddy@ucdavis.edu>
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/cpu/pred/ras.cc

index e07ac6aa95a738901a347bbb1584ce85b512261b..33eec0ea41867b7128edf5e44ea34c0c4341d75e 100644 (file)
@@ -74,4 +74,8 @@ ReturnAddrStack::restore(unsigned top_entry_idx,
     tos = top_entry_idx;
 
     addrStack[tos] = restored;
+
+    if (usedEntries != numEntries) {
+        ++usedEntries;
+    }
 }