diff --git a/arm/aarch32/cortex-a15.c b/arm/aarch32/cortex-a15.c index 8031747..4030e53 100644 --- a/arm/aarch32/cortex-a15.c +++ b/arm/aarch32/cortex-a15.c @@ -20,16 +20,11 @@ static void generate_cpu_nodes(void *fdt, struct kvm *kvm) for (cpu = 0; cpu < kvm->nrcpus; ++cpu) { char cpu_name[CPU_NAME_MAX_LEN]; - if (kvm->cpus[cpu]->cpu_type != KVM_ARM_TARGET_CORTEX_A15) { - pr_warning("Ignoring unknown type for CPU %d\n", cpu); - continue; - } - snprintf(cpu_name, CPU_NAME_MAX_LEN, "cpu@%d", cpu); _FDT(fdt_begin_node(fdt, cpu_name)); _FDT(fdt_property_string(fdt, "device_type", "cpu")); - _FDT(fdt_property_string(fdt, "compatible", "arm,cortex-a15")); + _FDT(fdt_property_string(fdt, "compatible", kvm->cpus[cpu]->cpu_compatible)); if (kvm->nrcpus > 1) _FDT(fdt_property_string(fdt, "enable-method", "psci")); @@ -83,8 +78,9 @@ static int cortex_a15__vcpu_init(struct kvm_cpu *vcpu) } static struct kvm_arm_target target_cortex_a15 = { - .id = KVM_ARM_TARGET_CORTEX_A15, - .init = cortex_a15__vcpu_init, + .id = KVM_ARM_TARGET_CORTEX_A15, + .compatible = "arm,cortex-a15", + .init = cortex_a15__vcpu_init, }; static int cortex_a15__core_init(struct kvm *kvm) diff --git a/arm/aarch64/cortex-a57.c b/arm/aarch64/cortex-a57.c index 4fd11ba..f636ef7 100644 --- a/arm/aarch64/cortex-a57.c +++ b/arm/aarch64/cortex-a57.c @@ -20,16 +20,11 @@ static void generate_cpu_nodes(void *fdt, struct kvm *kvm) for (cpu = 0; cpu < kvm->nrcpus; ++cpu) { char cpu_name[CPU_NAME_MAX_LEN]; - if (kvm->cpus[cpu]->cpu_type != KVM_ARM_TARGET_CORTEX_A57) { - pr_warning("Ignoring unknown type for CPU %d\n", cpu); - continue; - } - snprintf(cpu_name, CPU_NAME_MAX_LEN, "cpu@%d", cpu); _FDT(fdt_begin_node(fdt, cpu_name)); _FDT(fdt_property_string(fdt, "device_type", "cpu")); - _FDT(fdt_property_string(fdt, "compatible", "arm,cortex-a57")); + _FDT(fdt_property_string(fdt, "compatible", kvm->cpus[cpu]->cpu_compatible)); if (kvm->nrcpus > 1) _FDT(fdt_property_string(fdt, "enable-method", "psci")); @@ -84,8 +79,9 @@ static int cortex_a57__vcpu_init(struct kvm_cpu *vcpu) } static struct kvm_arm_target target_cortex_a57 = { - .id = KVM_ARM_TARGET_CORTEX_A57, - .init = cortex_a57__vcpu_init, + .id = KVM_ARM_TARGET_CORTEX_A57, + .compatible = "arm,cortex-a57", + .init = cortex_a57__vcpu_init, }; static int cortex_a57__core_init(struct kvm *kvm) diff --git a/arm/include/arm-common/kvm-cpu-arch.h b/arm/include/arm-common/kvm-cpu-arch.h index 351fbe6..b514dd5 100644 --- a/arm/include/arm-common/kvm-cpu-arch.h +++ b/arm/include/arm-common/kvm-cpu-arch.h @@ -12,6 +12,7 @@ struct kvm_cpu { unsigned long cpu_id; unsigned long cpu_type; + const char *cpu_compatible; struct kvm *kvm; int vcpu_fd; @@ -28,8 +29,9 @@ struct kvm_cpu { }; struct kvm_arm_target { - u32 id; - int (*init)(struct kvm_cpu *vcpu); + u32 id; + const char *compatible; + int (*init)(struct kvm_cpu *vcpu); }; int kvm_cpu__register_kvm_arm_target(struct kvm_arm_target *target); diff --git a/arm/kvm-cpu.c b/arm/kvm-cpu.c index 2716690..6d4f306 100644 --- a/arm/kvm-cpu.c +++ b/arm/kvm-cpu.c @@ -30,6 +30,7 @@ int kvm_cpu__register_kvm_arm_target(struct kvm_arm_target *target) struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id) { + struct kvm_arm_target *target; struct kvm_cpu *vcpu; int coalesced_offset, mmap_size, err = -1; unsigned int i; @@ -58,13 +59,14 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id) for (i = 0; i < ARRAY_SIZE(kvm_arm_targets); ++i) { if (!kvm_arm_targets[i]) continue; - vcpu_init.target = kvm_arm_targets[i]->id; + target = kvm_arm_targets[i]; + vcpu_init.target = target->id; err = ioctl(vcpu->vcpu_fd, KVM_ARM_VCPU_INIT, &vcpu_init); if (!err) break; } - if (err || kvm_arm_targets[i]->init(vcpu)) + if (err || target->init(vcpu)) die("Unable to initialise ARM vcpu"); coalesced_offset = ioctl(kvm->sys_fd, KVM_CHECK_EXTENSION, @@ -76,7 +78,8 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id) /* Populate the vcpu structure. */ vcpu->kvm = kvm; vcpu->cpu_id = cpu_id; - vcpu->cpu_type = vcpu_init.target; + vcpu->cpu_type = target->id; + vcpu->cpu_compatible = target->compatible; vcpu->is_running = true; return vcpu; }