本文軟件分析使用arm-trust-firmwire v1.3版本。基於公開的fvp platform分析流程
cpu off的api是提供給hotplug使用的,主要是將cpu core powerdown。
psci 接口cpu off是在32bit的接口裏面,以前沒關注過這些,又翻看來一下kernel psci接口。
如下是kernel的psci接口設置函數,對應cpu off是直接賦予參數PSCI_0_2_FN_CPU_OFF
,其他的是通過PSCI_FN_NATIVE
接口賦予的。
static void __init psci_0_2_set_functions(void)
{
pr_info("Using standard PSCI v0.2 function IDs\n");
psci_function_id[PSCI_FN_CPU_SUSPEND] =
PSCI_FN_NATIVE(0_2, CPU_SUSPEND);
psci_ops.cpu_suspend = psci_cpu_suspend;
psci_function_id[PSCI_FN_CPU_OFF] = PSCI_0_2_FN_CPU_OFF;
psci_ops.cpu_off = psci_cpu_off;
psci_function_id[PSCI_FN_CPU_ON] = PSCI_FN_NATIVE(0_2, CPU_ON);
psci_ops.cpu_on = psci_cpu_on;
psci_function_id[PSCI_FN_MIGRATE] = PSCI_FN_NATIVE(0_2, MIGRATE);
psci_ops.migrate = psci_migrate;
psci_ops.affinity_info = psci_affinity_info;
psci_ops.migrate_info_type = psci_migrate_info_type;
arm_pm_restart = psci_sys_reset;
pm_power_off = psci_sys_poweroff;
}
此PSCI_FN_NATIVE
區分64bit與32bit,參數的具體定義在kernel psci.h的頭文件中。
#ifdef CONFIG_64BIT
#define PSCI_FN_NATIVE(version, name) PSCI_##version##_FN64_##name
#else
#define PSCI_FN_NATIVE(version, name) PSCI_##version##_FN_##name
#endif
分析下來cpu suspend/cpu on/migrate/affinity_info/system_suspend(ver>1.0)等使用64bit api,cpu off/sys_reset/sys_poweroff等使用32bit。kernel的解釋:雖然64bit os可以使用smc32 api,但對於某些調用,有必要使用smc64 api傳遞或返回64bit值。
*具體hotplug cpu off的ATF flow如下:*