aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Cunado <david.cunado@arm.com>2017-07-19 12:14:07 +0100
committerDavid Cunado <david.cunado@arm.com>2017-07-26 11:59:00 +0100
commit71341d23668b1700cd50c0abd74073e4351acbd9 (patch)
treeed5c313c132d0769b12c30332bc16e528ebe59f0 /lib
parentaa965e1583349b36ce7edd2b3fe9f1f461ef8b23 (diff)
downloadarm-trusted-firmware-71341d23668b1700cd50c0abd74073e4351acbd9.tar.gz
Address edge case for stale PSCI CPU data in cache
There is a theoretical edge case during CPU_ON where the cache may contain stale data for the target CPU data - this can occur under the following conditions: - the target CPU is in another cluster from the current - the target CPU was the last CPU to shutdown on its cluster - the cluster was removed from coherency as part of the CPU shutdown In this case the cache maintenace that was performed as part of the target CPUs shutdown was not seen by the current CPU's cluster. And so the cache may contain stale data for the target CPU. This patch adds a cache maintenance operation (flush) for the cache-line containing the target CPU data - this ensures that the target CPU data is read from main memory. Change-Id: If8cfd42639b03174f60669429b7f7a757027d0fb Signed-off-by: David Cunado <david.cunado@arm.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/psci/psci_on.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/psci/psci_on.c b/lib/psci/psci_on.c
index 16b22c2a..d3d0e2ff 100644
--- a/lib/psci/psci_on.c
+++ b/lib/psci/psci_on.c
@@ -64,7 +64,20 @@ int psci_cpu_on_start(u_register_t target_cpu,
/*
* Generic management: Ensure that the cpu is off to be
* turned on.
+ * Perform cache maintanence ahead of reading the target CPU state to
+ * ensure that the data is not stale.
+ * There is a theoretical edge case where the cache may contain stale
+ * data for the target CPU data - this can occur under the following
+ * conditions:
+ * - the target CPU is in another cluster from the current
+ * - the target CPU was the last CPU to shutdown on its cluster
+ * - the cluster was removed from coherency as part of the CPU shutdown
+ *
+ * In this case the cache maintenace that was performed as part of the
+ * target CPUs shutdown was not seen by the current CPU's cluster. And
+ * so the cache may contain stale data for the target CPU.
*/
+ flush_cpu_data_by_index(target_idx, psci_svc_cpu_data.aff_info_state);
rc = cpu_on_validate_state(psci_get_aff_info_state_by_idx(target_idx));
if (rc != PSCI_E_SUCCESS)
goto exit;