diff options
author | Olivier Deprez <olivier.deprez@arm.com> | 2023-11-07 13:35:30 +0100 |
---|---|---|
committer | TrustedFirmware Code Review <review@review.trustedfirmware.org> | 2023-11-07 13:35:30 +0100 |
commit | e0c7d8f56c4a9dc92f89d2999d600986ed99acb3 (patch) | |
tree | 6e92dce9fc937947f947a01f302f10cd04470d4b /lib | |
parent | 5a4c3f0baab2059c159995525fd92d59aac6ea43 (diff) | |
parent | e60c18471fc7488cc0bf1dc7eae3b43be77045a4 (diff) |
Merge "fix(smccc): ensure that mpidr passed through SMC is valid" into integration
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pmf/pmf_main.c | 2 | ||||
-rw-r--r-- | lib/pmf/pmf_smc.c | 4 | ||||
-rw-r--r-- | lib/psci/psci_common.c | 14 | ||||
-rw-r--r-- | lib/psci/psci_main.c | 26 | ||||
-rw-r--r-- | lib/psci/psci_on.c | 10 | ||||
-rw-r--r-- | lib/psci/psci_private.h | 1 | ||||
-rw-r--r-- | lib/psci/psci_stat.c | 14 |
7 files changed, 30 insertions, 41 deletions
diff --git a/lib/pmf/pmf_main.c b/lib/pmf/pmf_main.c index bf0ad8388..b33f49c82 100644 --- a/lib/pmf/pmf_main.c +++ b/lib/pmf/pmf_main.c @@ -165,7 +165,7 @@ int pmf_get_timestamp_smc(unsigned int tid, /* Search for registered service. */ svc_desc = get_service(tid); - if ((svc_desc == NULL) || (plat_core_pos_by_mpidr(mpidr) < 0)) { + if (svc_desc == NULL) { *ts_value = 0; return -EINVAL; } else { diff --git a/lib/pmf/pmf_smc.c b/lib/pmf/pmf_smc.c index 71486dfcb..f3dd11276 100644 --- a/lib/pmf/pmf_smc.c +++ b/lib/pmf/pmf_smc.c @@ -26,6 +26,10 @@ uintptr_t pmf_smc_handler(unsigned int smc_fid, int rc; unsigned long long ts_value; + /* Determine if the cpu exists of not */ + if (!is_valid_mpidr(x2)) + return PSCI_E_INVALID_PARAMS; + if (((smc_fid >> FUNCID_CC_SHIFT) & FUNCID_CC_MASK) == SMC_32) { x1 = (uint32_t)x1; diff --git a/lib/psci/psci_common.c b/lib/psci/psci_common.c index 70bf77e2d..f9de432b2 100644 --- a/lib/psci/psci_common.c +++ b/lib/psci/psci_common.c @@ -818,20 +818,6 @@ void psci_release_pwr_domain_locks(unsigned int end_pwrlvl, } /******************************************************************************* - * Simple routine to determine whether a mpidr is valid or not. - ******************************************************************************/ -int psci_validate_mpidr(u_register_t mpidr) -{ - int pos = plat_core_pos_by_mpidr(mpidr); - - if ((pos < 0) || ((unsigned int)pos >= PLATFORM_CORE_COUNT)) { - return PSCI_E_INVALID_PARAMS; - } - - return PSCI_E_SUCCESS; -} - -/******************************************************************************* * This function determines the full entrypoint information for the requested * PSCI entrypoint on power on/resume and returns it. ******************************************************************************/ diff --git a/lib/psci/psci_main.c b/lib/psci/psci_main.c index 326f125b6..a01553128 100644 --- a/lib/psci/psci_main.c +++ b/lib/psci/psci_main.c @@ -29,9 +29,8 @@ int psci_cpu_on(u_register_t target_cpu, int rc; entry_point_info_t ep; - /* Determine if the cpu exists of not */ - rc = psci_validate_mpidr(target_cpu); - if (rc != PSCI_E_SUCCESS) + /* Validate the target CPU */ + if (!is_valid_mpidr(target_cpu)) return PSCI_E_INVALID_PARAMS; /* Validate the entry point and get the entry_point_info */ @@ -245,19 +244,18 @@ int psci_cpu_off(void) int psci_affinity_info(u_register_t target_affinity, unsigned int lowest_affinity_level) { - int ret; unsigned int target_idx; + /* Validate the target affinity */ + if (!is_valid_mpidr(target_affinity)) + return PSCI_E_INVALID_PARAMS; + /* We dont support level higher than PSCI_CPU_PWR_LVL */ if (lowest_affinity_level > PSCI_CPU_PWR_LVL) return PSCI_E_INVALID_PARAMS; /* Calculate the cpu index of the target */ - ret = plat_core_pos_by_mpidr(target_affinity); - if (ret == -1) { - return PSCI_E_INVALID_PARAMS; - } - target_idx = (unsigned int)ret; + target_idx = (unsigned int) plat_core_pos_by_mpidr(target_affinity); /* * Generic management: @@ -285,6 +283,10 @@ int psci_migrate(u_register_t target_cpu) int rc; u_register_t resident_cpu_mpidr; + /* Validate the target cpu */ + if (!is_valid_mpidr(target_cpu)) + return PSCI_E_INVALID_PARAMS; + rc = psci_spd_migrate_info(&resident_cpu_mpidr); if (rc != PSCI_TOS_UP_MIG_CAP) return (rc == PSCI_TOS_NOT_UP_MIG_CAP) ? @@ -298,8 +300,7 @@ int psci_migrate(u_register_t target_cpu) return PSCI_E_NOT_PRESENT; /* Check the validity of the specified target cpu */ - rc = psci_validate_mpidr(target_cpu); - if (rc != PSCI_E_SUCCESS) + if (!is_valid_mpidr(target_cpu)) return PSCI_E_INVALID_PARAMS; assert((psci_spd_pm != NULL) && (psci_spd_pm->svc_migrate != NULL)); @@ -339,8 +340,7 @@ int psci_node_hw_state(u_register_t target_cpu, int rc; /* Validate target_cpu */ - rc = psci_validate_mpidr(target_cpu); - if (rc != PSCI_E_SUCCESS) + if (!is_valid_mpidr(target_cpu)) return PSCI_E_INVALID_PARAMS; /* Validate power_level against PLAT_MAX_PWR_LVL */ diff --git a/lib/psci/psci_on.c b/lib/psci/psci_on.c index 31875ff3d..b2797749f 100644 --- a/lib/psci/psci_on.c +++ b/lib/psci/psci_on.c @@ -61,15 +61,7 @@ int psci_cpu_on_start(u_register_t target_cpu, { int rc; aff_info_state_t target_aff_state; - int ret = plat_core_pos_by_mpidr(target_cpu); - unsigned int target_idx; - - /* Calling function must supply valid input arguments */ - assert(ret >= 0); - assert((unsigned int)ret < PLATFORM_CORE_COUNT); - assert(ep != NULL); - - target_idx = (unsigned int)ret; + unsigned int target_idx = (unsigned int)plat_core_pos_by_mpidr(target_cpu); /* * This function must only be called on platforms where the diff --git a/lib/psci/psci_private.h b/lib/psci/psci_private.h index 04f93bd08..2eb4a9b70 100644 --- a/lib/psci/psci_private.h +++ b/lib/psci/psci_private.h @@ -286,7 +286,6 @@ extern const spd_pm_ops_t *psci_spd_pm; int psci_validate_power_state(unsigned int power_state, psci_power_state_t *state_info); void psci_query_sys_suspend_pwrstate(psci_power_state_t *state_info); -int psci_validate_mpidr(u_register_t mpidr); void psci_init_req_local_pwr_states(void); #if PSCI_OS_INIT_MODE void psci_update_req_local_pwr_states(unsigned int end_pwrlvl, diff --git a/lib/psci/psci_stat.c b/lib/psci/psci_stat.c index ad88d0708..bedb816df 100644 --- a/lib/psci/psci_stat.c +++ b/lib/psci/psci_stat.c @@ -181,10 +181,8 @@ static int psci_get_stat(u_register_t target_cpu, unsigned int power_state, psci_power_state_t state_info = { {PSCI_LOCAL_STATE_RUN} }; plat_local_state_t local_state; - /* Validate the target_cpu parameter and determine the cpu index */ + /* Determine the cpu index */ target_idx = (unsigned int) plat_core_pos_by_mpidr(target_cpu); - if (target_idx == (unsigned int) -1) - return PSCI_E_INVALID_PARAMS; /* Validate the power_state parameter */ if (psci_plat_pm_ops->translate_power_state_by_mpidr == NULL) @@ -228,6 +226,11 @@ u_register_t psci_stat_residency(u_register_t target_cpu, unsigned int power_state) { psci_stat_t psci_stat; + + /* Validate the target cpu */ + if (!is_valid_mpidr(target_cpu)) + return 0; + int rc = psci_get_stat(target_cpu, power_state, &psci_stat); if (rc == PSCI_E_SUCCESS) @@ -241,6 +244,11 @@ u_register_t psci_stat_count(u_register_t target_cpu, unsigned int power_state) { psci_stat_t psci_stat; + + /* Validate the target cpu */ + if (!is_valid_mpidr(target_cpu)) + return 0; + int rc = psci_get_stat(target_cpu, power_state, &psci_stat); if (rc == PSCI_E_SUCCESS) |