arch, arm: Return s1Req upon fault in s2Lookup
authorAnouk Van Laer <anouk.vanlaer@arm.com>
Wed, 24 Oct 2018 08:49:53 +0000 (09:49 +0100)
committerAnouk Van Laer <anouk.vanlaer@arm.com>
Mon, 5 Nov 2018 09:56:37 +0000 (09:56 +0000)
When a s2Lookup object is created, a new request is created, based
upon the original, stage 1 request sent out by the CPU. When a fault
occurs during the second stage of translation, this new request is
returned. This can lead to issues with the O3 CPU. The O3 fetch stage
will not acknowledge the fault as it is a different request than the
one it sent out and does not contain a contextID. This commit
rectifies this.

Change-Id: I21cb7377a59aed9d90d99f048b2106eaf219e93a
Reviewed-by: Ciro Santilli <ciro.santilli@arm.com>
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/13782
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

src/arch/arm/stage2_lookup.cc

index e74ec9071c35e23c4385ca7f80abe15dd2efbcb7..b5e11638bbb6bca5526ba83c372d9345923c2da2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2013, 2016 ARM Limited
+ * Copyright (c) 2010-2013, 2016, 2018 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -191,7 +191,8 @@ Stage2LookUp::finish(const Fault &_fault, const RequestPtr &req,
     mergeTe(req, mode);
 
     if (fault != NoFault) {
-        transState->finish(fault, req, tc, mode);
+        // Returning with a fault requires the original request
+        transState->finish(fault, s1Req, tc, mode);
     } else if (timing) {
         // Now notify the original stage 1 translation that we finally have
         // a result