diff options
author | Achin Gupta <achin.gupta@arm.com> | 2013-11-25 18:45:02 +0000 |
---|---|---|
committer | Dan Handley <dan.handley@arm.com> | 2013-12-05 12:28:50 +0000 |
commit | c8afc789196cdd568e29aa1e54cb5d24be5adf70 (patch) | |
tree | c29ea6f222a2f76cda944ed976b6e734e393732e /plat/fvp | |
parent | 994dfceb449a7b2fe34a1febd765cc5291172b39 (diff) | |
download | arm-trusted-firmware-c8afc789196cdd568e29aa1e54cb5d24be5adf70.tar.gz |
psci: fix error due to a non zero context id
In the previous psci implementation, the psci_afflvl_power_on_finish()
function would run into an error condition if the value of the context
id parameter in the cpu_on and cpu_suspend psci calls was != 0. The
parameter was being restored as the return value of the affinity level
0 finisher function. A non zero context id would be treated as an
error condition. This would prevent successful wake up of the cpu from
a power down state. Also, the contents of the general purpose
registers were not being cleared upon return to the non-secure world
after a cpu power up. This could potentially allow the non-secure
world to view secure data.
This patch ensures that all general purpose registers are set to ~0
prior to the final eret that drops the execution to the non-secure
world. The context id is used to initialize the general purpose
register x0 prior to re-entry into the non-secure world and is no
longer restored as a function return value. A platform helper
(platform_get_stack()) has been introduced to facilitate this change.
Change-Id: I2454911ffd75705d6aa8609a5d250d9b26fa097c
Diffstat (limited to 'plat/fvp')
-rw-r--r-- | plat/fvp/platform.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/plat/fvp/platform.h b/plat/fvp/platform.h index 399a772..38bd558 100644 --- a/plat/fvp/platform.h +++ b/plat/fvp/platform.h @@ -331,6 +331,7 @@ extern unsigned long platform_get_cfgvar(unsigned int); extern int platform_config_setup(void); extern void plat_report_exception(unsigned long); extern unsigned long plat_get_ns_image_entrypoint(void); +extern unsigned long platform_get_stack(unsigned long mpidr); /* Declarations for fvp_topology.c */ extern int plat_setup_topology(void); |