if (!kvm_arm_hyp_service_available(ARM_SMCCC_KVM_FUNC_DISCOVER_IMPL_VER) ||
!kvm_arm_hyp_service_available(ARM_SMCCC_KVM_FUNC_DISCOVER_IMPL_CPUS)) return;
arm_smccc_1_1_invoke(ARM_SMCCC_VENDOR_HYP_KVM_DISCOVER_IMPL_VER_FUNC_ID,
0, &res); if (res.a0 != SMCCC_RET_SUCCESS) return;
/* Version info is in lower 32 bits and is in SMMCCC_VERSION format */
ver = lower_32_bits(res.a1); if (PSCI_VERSION_MAJOR(ver) != 1) {
pr_warn("Unsupported target CPU implementation version v%d.%d\n",
PSCI_VERSION_MAJOR(ver), PSCI_VERSION_MINOR(ver)); return;
}
if (!res.a2) {
pr_warn("No target implementation CPUs specified\n"); return;
}
max_cpus = res.a2;
target = memblock_alloc(sizeof(*target) * max_cpus, __alignof__(*target)); if (!target) {
pr_warn("Not enough memory for struct target_impl_cpu\n"); return;
}
for (i = 0; i < max_cpus; i++) {
arm_smccc_1_1_invoke(ARM_SMCCC_VENDOR_HYP_KVM_DISCOVER_IMPL_CPUS_FUNC_ID,
i, 0, 0, &res); if (res.a0 != SMCCC_RET_SUCCESS) {
pr_warn("Discovering target implementation CPUs failed\n"); goto mem_free;
}
target[i].midr = res.a1;
target[i].revidr = res.a2;
target[i].aidr = res.a3;
}
if (!cpu_errata_set_target_impl(max_cpus, target)) {
pr_warn("Failed to set target implementation CPUs\n"); goto mem_free;
}
pr_info("Number of target implementation CPUs is %lld\n", max_cpus); return;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.