Hello! > > + /* > > + * When KVM is in use, psci is emulated in-kernel and not by qemu. > > + * In order for it to work correctly we should use correct MPIDR > > values, > > + * which appear to be inherited from the host. > why it must be inherited from host? > Could you point out to KVM code that depends on it?
It is PSCI, i have tested this and experienced this problem. In KVM guest PSCI is handled by "hvc" call and is done entirely in kernel, no qemu code is involved. If i supply wrong IDs the processors will simply not power up. I have checked how kvmtool (found here: git://linux-arm.org/linux-ap.git, tools/kvm) handles this. Related parts are: tools/kvm/arm/fdt.c - generate_cpu_nodes() - "reg" property assignment: --- cut --- static void generate_cpu_nodes(void *fdt, struct kvm *kvm) { int cpu; _FDT(fdt_begin_node(fdt, "cpus")); _FDT(fdt_property_cell(fdt, "#address-cells", 0x1)); _FDT(fdt_property_cell(fdt, "#size-cells", 0x0)); for (cpu = 0; cpu < kvm->nrcpus; ++cpu) { char cpu_name[CPU_NAME_MAX_LEN]; struct kvm_cpu *vcpu = kvm->cpus[cpu]; unsigned long mpidr = kvm_cpu__get_vcpu_mpidr(vcpu); mpidr &= ARM_MPIDR_HWID_BITMASK; snprintf(cpu_name, CPU_NAME_MAX_LEN, "cpu@%lx", mpidr); _FDT(fdt_begin_node(fdt, cpu_name)); _FDT(fdt_property_string(fdt, "device_type", "cpu")); _FDT(fdt_property_string(fdt, "compatible", vcpu->cpu_compatible)); if (kvm->nrcpus > 1) _FDT(fdt_property_string(fdt, "enable-method", "psci")); _FDT(fdt_property_cell(fdt, "reg", mpidr)); _FDT(fdt_end_node(fdt)); } _FDT(fdt_end_node(fdt)); } --- cut --- tools/kvm/arm/aarch64/kvm-cpu.c - kvm_cpu__get_vcpu_mpidr() - obtains CPU ID from the kernel: --- cut --- unsigned long kvm_cpu__get_vcpu_mpidr(struct kvm_cpu *vcpu) { struct kvm_one_reg reg; u64 mpidr; reg.id = ARM64_SYS_REG(ARM_CPU_ID, ARM_CPU_ID_MPIDR); reg.addr = (u64)&mpidr; if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) die("KVM_GET_ONE_REG failed (get_mpidr vcpu%ld", vcpu->cpu_id); return mpidr; } --- cut --- So i just decided to do the same thing in KVM. However, to tell the truth, i actually do not know whether it is possible to do it in reverse and assign MPIDR to VCPUs using KVM_SET_ONE_REG ioctl instead. I can try it if you think it's more appropriate. Kind regards, Pavel Fedin Expert Engineer Samsung Electronics Research center Russia