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);
bool flush_vcpu_caches;
int shutdown_state;
bool shutdown;
+ unsigned long mpidr;
bool failed;
} __attribute__((aligned(PAGE_SIZE)));
* 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)
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;
+}
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;
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 */
#include <asm/sysregs.h>
#include <jailhouse/control.h>
#include <jailhouse/paging.h>
+#include <jailhouse/processor.h>
#include <jailhouse/string.h>
unsigned int cache_line_size;
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