diff options
author | Bharat Bhushan <r65777@freescale.com> | 2011-10-13 05:47:08 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-03-05 07:52:24 -0500 |
commit | f9208427f72e6cb52c71767af3bf8c14c43c27ac (patch) | |
tree | 051bd94371fa20d83848237a9a89ff6670a4b466 /arch/powerpc/kernel/kvm_emul.S | |
parent | 95325e6b190bb4ec3383aa1241d10675057bff45 (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/kernel/kvm_emul.S')
-rw-r--r-- | arch/powerpc/kernel/kvm_emul.S | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/kvm_emul.S b/arch/powerpc/kernel/kvm_emul.S index f2b1b2523e61..3d64c5704fd5 100644 --- a/arch/powerpc/kernel/kvm_emul.S +++ b/arch/powerpc/kernel/kvm_emul.S | |||
@@ -167,6 +167,9 @@ maybe_stay_in_guest: | |||
167 | kvm_emulate_mtmsr_reg2: | 167 | kvm_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 | ||
181 | no_mtmsr: | 182 | no_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 */ |