aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorBharat Bhushan <r65777@freescale.com>2011-10-13 05:47:08 -0400
committerAvi Kivity <avi@redhat.com>2012-03-05 07:52:24 -0500
commitf9208427f72e6cb52c71767af3bf8c14c43c27ac (patch)
tree051bd94371fa20d83848237a9a89ff6670a4b466 /arch/powerpc
parent95325e6b190bb4ec3383aa1241d10675057bff45 (diff)
PPC: Fix race in mtmsr paravirt implementation
The current implementation of mtmsr and mtmsrd are racy in that it does: * check (int_pending == 0) ---> host sets int_pending = 1 <--- * write shared page * done while instead we should check for int_pending after the shared page is written. Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/kernel/kvm_emul.S10
1 files changed, 4 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/kvm_emul.S b/arch/powerpc/kernel/kvm_emul.S
index f2b1b2523e6..3d64c5704fd 100644
--- a/arch/powerpc/kernel/kvm_emul.S
+++ b/arch/powerpc/kernel/kvm_emul.S
@@ -167,6 +167,9 @@ maybe_stay_in_guest:
167kvm_emulate_mtmsr_reg2: 167kvm_emulate_mtmsr_reg2:
168 ori r30, r0, 0 168 ori r30, r0, 0
169 169
170 /* Put MSR into magic page because we don't call mtmsr */
171 STL64(r30, KVM_MAGIC_PAGE + KVM_MAGIC_MSR, 0)
172
170 /* Check if we have to fetch an interrupt */ 173 /* Check if we have to fetch an interrupt */
171 lwz r31, (KVM_MAGIC_PAGE + KVM_MAGIC_INT)(0) 174 lwz r31, (KVM_MAGIC_PAGE + KVM_MAGIC_INT)(0)
172 cmpwi r31, 0 175 cmpwi r31, 0
@@ -174,15 +177,10 @@ kvm_emulate_mtmsr_reg2:
174 177
175 /* Check if we may trigger an interrupt */ 178 /* Check if we may trigger an interrupt */
176 andi. r31, r30, MSR_EE 179 andi. r31, r30, MSR_EE
177 beq no_mtmsr 180 bne do_mtmsr
178
179 b do_mtmsr
180 181
181no_mtmsr: 182no_mtmsr:
182 183
183 /* Put MSR into magic page because we don't call mtmsr */
184 STL64(r30, KVM_MAGIC_PAGE + KVM_MAGIC_MSR, 0)
185
186 SCRATCH_RESTORE 184 SCRATCH_RESTORE
187 185
188 /* Go back to caller */ 186 /* Go back to caller */