diff options
Diffstat (limited to 'lib/psci')
-rw-r--r-- | lib/psci/psci_on.c | 15 | ||||
-rw-r--r-- | lib/psci/psci_suspend.c | 4 | ||||
-rw-r--r-- | lib/psci/psci_system_off.c | 2 |
3 files changed, 17 insertions, 4 deletions
diff --git a/lib/psci/psci_on.c b/lib/psci/psci_on.c index d5c9843a..d3d0e2ff 100644 --- a/lib/psci/psci_on.c +++ b/lib/psci/psci_on.c @@ -8,8 +8,8 @@ #include <arch_helpers.h> #include <assert.h> #include <bl_common.h> -#include <debug.h> #include <context_mgmt.h> +#include <debug.h> #include <platform.h> #include <stddef.h> #include "psci_private.h" @@ -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; diff --git a/lib/psci/psci_suspend.c b/lib/psci/psci_suspend.c index 47988926..0d1589ee 100644 --- a/lib/psci/psci_suspend.c +++ b/lib/psci/psci_suspend.c @@ -4,10 +4,10 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#include <assert.h> -#include <bl_common.h> #include <arch.h> #include <arch_helpers.h> +#include <assert.h> +#include <bl_common.h> #include <context.h> #include <context_mgmt.h> #include <cpu_data.h> diff --git a/lib/psci/psci_system_off.c b/lib/psci/psci_system_off.c index 4a55248d..ef5d3d1d 100644 --- a/lib/psci/psci_system_off.c +++ b/lib/psci/psci_system_off.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#include <stddef.h> #include <arch_helpers.h> #include <assert.h> #include <console.h> #include <debug.h> #include <platform.h> +#include <stddef.h> #include "psci_private.h" void __dead2 psci_system_off(void) |