From: Antonios Motakis <[email protected]> PSCI actually takes CPU parameters by the MPIDR id, which may differ from the logical id of the CPU. This patch is the first step into properly handling the CPU affinity levels in the MPIDR.
Signed-off-by: Antonios Motakis <[email protected]> --- hypervisor/arch/arm/include/asm/control.h | 1 + hypervisor/arch/arm/include/asm/percpu.h | 1 + hypervisor/arch/arm/lib.c | 14 ++++++++++++++ hypervisor/arch/arm/psci.c | 5 ++--- hypervisor/arch/arm/setup.c | 1 + 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/hypervisor/arch/arm/include/asm/control.h b/hypervisor/arch/arm/include/asm/control.h index f050e76..1d64b98 100644 --- a/hypervisor/arch/arm/include/asm/control.h +++ b/hypervisor/arch/arm/include/asm/control.h @@ -38,6 +38,7 @@ struct registers* arch_handle_exit(struct per_cpu *cpu_data, bool arch_handle_phys_irq(struct per_cpu *cpu_data, u32 irqn); void arch_reset_self(struct per_cpu *cpu_data); void arch_shutdown_self(struct per_cpu *cpu_data); +unsigned int arm_cpu_by_mpidr(struct cell *cell, unsigned long mpidr); void __attribute__((noreturn)) vmreturn(struct registers *guest_regs); void __attribute__((noreturn)) arch_shutdown_mmu(struct per_cpu *cpu_data); diff --git a/hypervisor/arch/arm/include/asm/percpu.h b/hypervisor/arch/arm/include/asm/percpu.h index ae026c4..0e9eac8 100644 --- a/hypervisor/arch/arm/include/asm/percpu.h +++ b/hypervisor/arch/arm/include/asm/percpu.h @@ -62,6 +62,7 @@ struct per_cpu { bool flush_vcpu_caches; int shutdown_state; bool shutdown; + unsigned long mpidr; bool failed; } __attribute__((aligned(PAGE_SIZE))); diff --git a/hypervisor/arch/arm/lib.c b/hypervisor/arch/arm/lib.c index 038bf9a..2fdcbe6 100644 --- a/hypervisor/arch/arm/lib.c +++ b/hypervisor/arch/arm/lib.c @@ -10,9 +10,12 @@ * the COPYING file in the top-level directory. */ +#include <jailhouse/control.h> #include <jailhouse/processor.h> #include <jailhouse/string.h> #include <jailhouse/types.h> +#include <asm/control.h> +#include <asm/percpu.h> #include <asm/sysregs.h> unsigned long phys_processor_id(void) @@ -22,3 +25,14 @@ unsigned long phys_processor_id(void) arm_read_sysreg(MPIDR_EL1, mpidr); return mpidr & MPIDR_CPUID_MASK; } + +unsigned int arm_cpu_by_mpidr(struct cell *cell, unsigned long mpidr) +{ + unsigned int cpu; + + for_each_cpu(cpu, cell->cpu_set) + if (mpidr == (per_cpu(cpu)->mpidr & MPIDR_CPUID_MASK)) + return cpu; + + return -1; +} diff --git a/hypervisor/arch/arm/psci.c b/hypervisor/arch/arm/psci.c index 3ebbd50..e0a6703 100644 --- a/hypervisor/arch/arm/psci.c +++ b/hypervisor/arch/arm/psci.c @@ -78,11 +78,10 @@ int psci_wait_cpu_stopped(unsigned int cpu_id) static long psci_emulate_cpu_on(struct per_cpu *cpu_data, struct trap_context *ctx) { - unsigned int target = ctx->regs[1]; unsigned int cpu; struct psci_mbox *mbox; - cpu = arm_cpu_virt2phys(cpu_data->cell, target); + cpu = arm_cpu_by_mpidr(cpu_data->cell, ctx->regs[1]); if (cpu == -1) /* Virtual id not in set */ return PSCI_DENIED; @@ -97,7 +96,7 @@ static long psci_emulate_cpu_on(struct per_cpu *cpu_data, static long psci_emulate_affinity_info(struct per_cpu *cpu_data, struct trap_context *ctx) { - unsigned int cpu = arm_cpu_virt2phys(cpu_data->cell, ctx->regs[1]); + unsigned int cpu = arm_cpu_by_mpidr(cpu_data->cell, ctx->regs[1]); if (cpu == -1) /* Virtual id not in set */ diff --git a/hypervisor/arch/arm/setup.c b/hypervisor/arch/arm/setup.c index f9f59d8..d11b9db 100644 --- a/hypervisor/arch/arm/setup.c +++ b/hypervisor/arch/arm/setup.c @@ -56,6 +56,7 @@ int arch_cpu_init(struct per_cpu *cpu_data) cpu_data->psci_mbox.entry = 0; cpu_data->virt_id = cpu_data->cpu_id; + cpu_data->mpidr = phys_processor_id(); /* * Copy the registers to restore from the linux stack here, because we -- 2.8.0.rc3 -- You received this message because you are subscribed to the Google Groups "Jailhouse" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
