diff options
Diffstat (limited to 'arch/arm/kvm/psci.c')
-rw-r--r-- | arch/arm/kvm/psci.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/arch/arm/kvm/psci.c b/arch/arm/kvm/psci.c index 58cb3248d277..02fa8eff6ae1 100644 --- a/arch/arm/kvm/psci.c +++ b/arch/arm/kvm/psci.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm/cputype.h> | 22 | #include <asm/cputype.h> |
23 | #include <asm/kvm_emulate.h> | 23 | #include <asm/kvm_emulate.h> |
24 | #include <asm/kvm_psci.h> | 24 | #include <asm/kvm_psci.h> |
25 | #include <asm/kvm_host.h> | ||
25 | 26 | ||
26 | /* | 27 | /* |
27 | * This is an implementation of the Power State Coordination Interface | 28 | * This is an implementation of the Power State Coordination Interface |
@@ -66,25 +67,17 @@ static void kvm_psci_vcpu_off(struct kvm_vcpu *vcpu) | |||
66 | static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu) | 67 | static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu) |
67 | { | 68 | { |
68 | struct kvm *kvm = source_vcpu->kvm; | 69 | struct kvm *kvm = source_vcpu->kvm; |
69 | struct kvm_vcpu *vcpu = NULL, *tmp; | 70 | struct kvm_vcpu *vcpu = NULL; |
70 | wait_queue_head_t *wq; | 71 | wait_queue_head_t *wq; |
71 | unsigned long cpu_id; | 72 | unsigned long cpu_id; |
72 | unsigned long context_id; | 73 | unsigned long context_id; |
73 | unsigned long mpidr; | ||
74 | phys_addr_t target_pc; | 74 | phys_addr_t target_pc; |
75 | int i; | ||
76 | 75 | ||
77 | cpu_id = *vcpu_reg(source_vcpu, 1); | 76 | cpu_id = *vcpu_reg(source_vcpu, 1) & MPIDR_HWID_BITMASK; |
78 | if (vcpu_mode_is_32bit(source_vcpu)) | 77 | if (vcpu_mode_is_32bit(source_vcpu)) |
79 | cpu_id &= ~((u32) 0); | 78 | cpu_id &= ~((u32) 0); |
80 | 79 | ||
81 | kvm_for_each_vcpu(i, tmp, kvm) { | 80 | vcpu = kvm_mpidr_to_vcpu(kvm, cpu_id); |
82 | mpidr = kvm_vcpu_get_mpidr(tmp); | ||
83 | if ((mpidr & MPIDR_HWID_BITMASK) == (cpu_id & MPIDR_HWID_BITMASK)) { | ||
84 | vcpu = tmp; | ||
85 | break; | ||
86 | } | ||
87 | } | ||
88 | 81 | ||
89 | /* | 82 | /* |
90 | * Make sure the caller requested a valid CPU and that the CPU is | 83 | * Make sure the caller requested a valid CPU and that the CPU is |
@@ -155,7 +148,7 @@ static unsigned long kvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu) | |||
155 | * then ON else OFF | 148 | * then ON else OFF |
156 | */ | 149 | */ |
157 | kvm_for_each_vcpu(i, tmp, kvm) { | 150 | kvm_for_each_vcpu(i, tmp, kvm) { |
158 | mpidr = kvm_vcpu_get_mpidr(tmp); | 151 | mpidr = kvm_vcpu_get_mpidr_aff(tmp); |
159 | if (((mpidr & target_affinity_mask) == target_affinity) && | 152 | if (((mpidr & target_affinity_mask) == target_affinity) && |
160 | !tmp->arch.pause) { | 153 | !tmp->arch.pause) { |
161 | return PSCI_0_2_AFFINITY_LEVEL_ON; | 154 | return PSCI_0_2_AFFINITY_LEVEL_ON; |