From: Alexander Graf <agraf@suse.de>
To: "\"" <kvm-ppc@vger.kernel.org>, " <kvm-ppc@vger.kernel.org>"@suse.de
Cc: "kvm@vger.kernel.org mailing list" <kvm@vger.kernel.org>
Subject: [PATCH 1/4] KVM: PPC: Book3S: PR: Don't clobber our exit handler id
Date: Fri, 29 Nov 2013 03:54:58 +0100 [thread overview]
Message-ID: <1385693701-27632-2-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1385693701-27632-1-git-send-email-agraf@suse.de>
We call a C helper to save all svcpu fields into our vcpu. The C
ABI states that r12 is considered volatile. However, we keep our
exit handler id in r12 currently.
So we need to save it away into a non-volatile register instead
that definitely does get preserved across the C call.
This bug usually didn't hit anyone yet since gcc is smart enough
to generate code that doesn't even need r12 which means it stayed
identical throughout the call by sheer luck. But we can't rely on
that.
Signed-off-by: Alexander Graf <agraf@suse.de>
---
arch/powerpc/kvm/book3s_interrupts.S | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/arch/powerpc/kvm/book3s_interrupts.S b/arch/powerpc/kvm/book3s_interrupts.S
index f4dd041..2f7d571 100644
--- a/arch/powerpc/kvm/book3s_interrupts.S
+++ b/arch/powerpc/kvm/book3s_interrupts.S
@@ -132,9 +132,18 @@ kvm_start_lightweight:
*
*/
+ PPC_LL r3, GPR4(r1) /* vcpu pointer */
+
+ /*
+ * kvmppc_copy_from_svcpu can clobber volatile registers, save
+ * r14 to get a spare scratch register for the exit handler id.
+ */
+ PPC_STL r14, VCPU_GPR(R14)(r3)
+ mr r14, r12
+
/* Transfer reg values from shadow vcpu back to vcpu struct */
/* On 64-bit, interrupts are still off at this point */
- PPC_LL r3, GPR4(r1) /* vcpu pointer */
+
GET_SHADOW_VCPU(r4)
bl FUNC(kvmppc_copy_from_svcpu)
nop
@@ -151,13 +160,11 @@ kvm_start_lightweight:
*/
ld r3, PACA_SPRG3(r13)
mtspr SPRN_SPRG3, r3
-
#endif /* CONFIG_PPC_BOOK3S_64 */
/* R7 = vcpu */
PPC_LL r7, GPR4(r1)
- PPC_STL r14, VCPU_GPR(R14)(r7)
PPC_STL r15, VCPU_GPR(R15)(r7)
PPC_STL r16, VCPU_GPR(R16)(r7)
PPC_STL r17, VCPU_GPR(R17)(r7)
@@ -177,7 +184,7 @@ kvm_start_lightweight:
PPC_STL r31, VCPU_GPR(R31)(r7)
/* Pass the exit number as 3rd argument to kvmppc_handle_exit */
- mr r5, r12
+ mr r5, r14
/* Restore r3 (kvm_run) and r4 (vcpu) */
REST_2GPRS(3, r1)
--
1.8.1.4
next prev parent reply other threads:[~2013-11-29 2:54 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-29 2:54 [PATCH 0/4] KVM: PPC: Book3S: PR: Fix with CONFIG_PREEMPT=y Alexander Graf
2013-11-29 2:54 ` Alexander Graf [this message]
2013-11-30 7:20 ` [PATCH 1/4] KVM: PPC: Book3S: PR: Don't clobber our exit handler id Paul Mackerras
2013-11-30 12:38 ` Alexander Graf
2013-11-29 2:54 ` [PATCH 2/4] KVM: PPC: Book3S: PR: Export kvmppc_copy_to|from_svcpu Alexander Graf
2013-11-29 2:55 ` [PATCH 3/4] KVM: PPC: Book3S: PR: Make svcpu -> vcpu store preempt savvy Alexander Graf
2013-11-29 2:55 ` [PATCH 4/4] KVM: PPC: Book3S: PR: Enable interrupts earlier Alexander Graf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1385693701-27632-2-git-send-email-agraf@suse.de \
--to=agraf@suse.de \
--cc=" <kvm-ppc@vger.kernel.org>"@suse.de \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox