Commit 2f5aaded authored by Soby Mathew's avatar Soby Mathew
Browse files

PSCI: Check early for invalid CPU state during CPU ON

This patch moves the check for valid CPU state during
PSCI_CPU_ON to before the non secure entry point is programmed
so as to enable it to return early on error.

Change-Id: I1b1a21be421e2b2a6e33db236e91dee8688efffa
parent e146f4cc
...@@ -48,13 +48,8 @@ typedef int (*afflvl_on_handler_t)(unsigned long target_cpu, ...@@ -48,13 +48,8 @@ typedef int (*afflvl_on_handler_t)(unsigned long target_cpu,
* This function checks whether a cpu which has been requested to be turned on * This function checks whether a cpu which has been requested to be turned on
* is OFF to begin with. * is OFF to begin with.
******************************************************************************/ ******************************************************************************/
static int cpu_on_validate_state(aff_map_node_t *node) static int cpu_on_validate_state(unsigned int psci_state)
{ {
unsigned int psci_state;
/* Get the raw psci state */
psci_state = psci_get_state(node);
if (psci_state == PSCI_STATE_ON || psci_state == PSCI_STATE_SUSPEND) if (psci_state == PSCI_STATE_ON || psci_state == PSCI_STATE_SUSPEND)
return PSCI_E_ALREADY_ON; return PSCI_E_ALREADY_ON;
...@@ -83,14 +78,6 @@ static int psci_afflvl0_on(unsigned long target_cpu, ...@@ -83,14 +78,6 @@ static int psci_afflvl0_on(unsigned long target_cpu,
/* Sanity check to safeguard against data corruption */ /* Sanity check to safeguard against data corruption */
assert(cpu_node->level == MPIDR_AFFLVL0); assert(cpu_node->level == MPIDR_AFFLVL0);
/*
* Generic management: Ensure that the cpu is off to be
* turned on
*/
rc = cpu_on_validate_state(cpu_node);
if (rc != PSCI_E_SUCCESS)
return rc;
/* /*
* Call the cpu on handler registered by the Secure Payload Dispatcher * Call the cpu on handler registered by the Secure Payload Dispatcher
* to let it do any bookeeping. If the handler encounters an error, it's * to let it do any bookeeping. If the handler encounters an error, it's
...@@ -290,6 +277,15 @@ int psci_afflvl_on(unsigned long target_cpu, ...@@ -290,6 +277,15 @@ int psci_afflvl_on(unsigned long target_cpu,
end_afflvl, end_afflvl,
target_cpu_nodes); target_cpu_nodes);
/*
* Generic management: Ensure that the cpu is off to be
* turned on.
*/
rc = cpu_on_validate_state(psci_get_state(
(aff_map_node_t *)target_cpu_nodes[MPIDR_AFFLVL0]));
if (rc != PSCI_E_SUCCESS)
goto exit;
/* Perform generic, architecture and platform specific handling. */ /* Perform generic, architecture and platform specific handling. */
rc = psci_call_on_handlers(target_cpu_nodes, rc = psci_call_on_handlers(target_cpu_nodes,
start_afflvl, start_afflvl,
...@@ -309,6 +305,7 @@ int psci_afflvl_on(unsigned long target_cpu, ...@@ -309,6 +305,7 @@ int psci_afflvl_on(unsigned long target_cpu,
target_cpu_nodes, target_cpu_nodes,
PSCI_STATE_ON_PENDING); PSCI_STATE_ON_PENDING);
exit:
/* /*
* This loop releases the lock corresponding to each affinity level * This loop releases the lock corresponding to each affinity level
* in the reverse order to which they were acquired. * in the reverse order to which they were acquired.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment