There are 3 places to change:
* Initialise vMPIDR value in vcpu_initialise()
* Find the vCPU from vMPIDR affinity information when accessing GICD
registers in vGIC
* Find the vCPU from vMPIDR affinity information when booting with vPSCI
in vGIC
- Both PSCI 0.1 and PSCI 0.2 are modified to respect the MPIDR like.
Signed-off-by: Chen Baozi <baozich@gmail.com>
Reviewed-by: Julien Grall <julien.grall@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
v->arch.sctlr = SCTLR_GUEST_INIT;
- /*
- * By default exposes an SMP system with AFF0 set to the VCPU ID
- * TODO: Handle multi-threading processor and cluster
- */
- v->arch.vmpidr = MPIDR_SMP | (v->vcpu_id << MPIDR_AFF0_SHIFT);
+ v->arch.vmpidr = MPIDR_SMP | vcpuid_to_vaffinity(v->vcpu_id);
v->arch.actlr = READ_SYSREG32(ACTLR_EL1);
if ( irouter & GICD_IROUTER_SPI_MODE_ANY )
return d->vcpu[0];
- vcpu_id = irouter & MPIDR_AFF0_MASK;
+ vcpu_id = vaffinity_to_vcpuid(irouter);
if ( vcpu_id >= d->max_vcpus )
return NULL;
int is_thumb = entry_point & 1;
register_t vcpuid;
- if( ver == XEN_PSCI_V_0_2 )
- vcpuid = (target_cpu & MPIDR_HWID_MASK);
- else
- vcpuid = target_cpu;
+ vcpuid = vaffinity_to_vcpuid(target_cpu);
if ( vcpuid >= d->max_vcpus || (v = d->vcpu[vcpuid]) == NULL )
return PSCI_INVALID_PARAMETERS;