Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1690503
| Path | csiph.com!news.redatomik.org!aioe.org!bofh.it!news.nic.it!robomod |
|---|---|
| From | Jintack Lim <jintack.lim@linaro.org> |
| Newsgroups | linux.kernel |
| Subject | [RFC PATCH v2 11/38] KVM: arm64: Set vcpu context depending on the guest exception level |
| Date | Tue, 18 Jul 2017 19:20:03 +0200 |
| Message-ID | <u4Ekb-5e8-29@gated-at.bofh.it> (permalink) |
| References | <u4E0O-4S6-19@gated-at.bofh.it> |
| X-Original-To | kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org, marc.zyngier@arm.com |
| Dkim-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zEdP97lvEH1nBpbDgkV+Dg1HDKn/fGRjSSjAx+SHR0M=; b=NABViPUGnKlJ5uaHRBfYQrBEXL0b4mY+AdBA1ecaovZsSa6riIusYn9cWnIOvhnzvi +vrUG1ie7qwvE4sqA3rpBWSWOfolIvw0B9+txLvUi6IefTcHDWprt914FsR6WiPzhQE0 M22k7teVZDfcmXFDQ05/N5IWDmB1eGc3GIkK4= |
| X-Google-Dkim-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=zEdP97lvEH1nBpbDgkV+Dg1HDKn/fGRjSSjAx+SHR0M=; b=KgCsNjK0stIWRvyPSDbaRUA4R4zJGgLfbHre/ojnNUEPC4k/w/SQh9Qbzr0WZWOV6e pHo534XEETgEivaltlW1wd/+tknAvMjha9SA86Kn0gqKq03VPVk38FFj7kipcxpdM2J8 +vMmoZETLT6YEW1rGC7EH7iNrOZBteZtDpU5ASp+Dx4c0RJSLsBuRRKWnEP8AeVmuHNg p6ec7EMXo9oOCrYaV9lPtfIZxnH1IwHpzonJPsdLt+EwtseRP1+z99q8MWJ+LfdanWzO 9ZpDlhbSg6wnxqamk3emRyDT08GinfRts68FzmVKcHY9ht0oSw08eUUTSUw0p0W8gfbh faBw== |
| X-Gm-Message-State | AIVw112zK+JP7iX5+j+IhuKeiTnPYNyvxXUqf5QcE6V8VK7ed9zjsmSL mnFr5ypNq+E4uvIO |
| X-Received | by 10.107.205.136 with SMTP id d130mr2614845iog.109.1500397193105; Tue, 18 Jul 2017 09:59:53 -0700 (PDT) |
| X-Mailer | git-send-email 1.9.1 |
| Sender | robomod@news.nic.it |
| List-ID | <linux-kernel.vger.kernel.org> |
| X-Mailing-List | linux-kernel@vger.kernel.org |
| Approved | robomod@news.nic.it |
| Lines | 112 |
| Organization | linux.* mail to news gateway |
| X-Original-Cc | corbet@lwn.net, pbonzini@redhat.com, rkrcmar@redhat.com, linux@armlinux.org.uk, catalin.marinas@arm.com, will.deacon@arm.com, akpm@linux-foundation.org, mchehab@kernel.org, cov@codeaurora.org, daniel.lezcano@linaro.org, david.daney@cavium.com, mark.rutland@arm.com, suzuki.poulose@arm.com, stefan@hello-penguin.com, andy.gross@linaro.org, wcohen@redhat.com, ard.biesheuvel@linaro.org, shankerd@codeaurora.org, vladimir.murzin@arm.com, james.morse@arm.com, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Jintack Lim <jintack.lim@linaro.org> |
| X-Original-Date | Tue, 18 Jul 2017 11:58:37 -0500 |
| X-Original-Message-ID | <1500397144-16232-12-git-send-email-jintack.lim@linaro.org> |
| X-Original-References | <1500397144-16232-1-git-send-email-jintack.lim@linaro.org> |
| X-Original-Sender | linux-kernel-owner@vger.kernel.org |
| Xref | csiph.com linux.kernel:1690503 |
Show key headers only | View raw
If the guest exception level is EL2, then set up the shadow context of
the virtual EL2 to hardware. Otherwise, set the regular EL0/EL1 context.
Note that the shadow context content will be prepared in subsequent
patches.
Signed-off-by: Jintack Lim <jintack.lim@linaro.org>
---
arch/arm64/kvm/context.c | 74 +++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 64 insertions(+), 10 deletions(-)
diff --git a/arch/arm64/kvm/context.c b/arch/arm64/kvm/context.c
index bc43e66..2645787 100644
--- a/arch/arm64/kvm/context.c
+++ b/arch/arm64/kvm/context.c
@@ -18,11 +18,29 @@
#include <linux/kvm_host.h>
#include <asm/kvm_emulate.h>
-/**
- * kvm_arm_setup_shadow_state -- prepare shadow state based on emulated mode
- * @vcpu: The VCPU pointer
- */
-void kvm_arm_setup_shadow_state(struct kvm_vcpu *vcpu)
+static void flush_shadow_special_regs(struct kvm_vcpu *vcpu)
+{
+ struct kvm_cpu_context *ctxt = &vcpu->arch.ctxt;
+
+ ctxt->hw_pstate = *vcpu_cpsr(vcpu) & ~PSR_MODE_MASK;
+ /*
+ * We can emulate the guest's configuration of which
+ * stack pointer to use when executing in virtual EL2 by
+ * using the equivalent feature in EL1 to point to
+ * either the EL1 or EL0 stack pointer.
+ */
+ if ((*vcpu_cpsr(vcpu) & PSR_MODE_MASK) == PSR_MODE_EL2h)
+ ctxt->hw_pstate |= PSR_MODE_EL1h;
+ else
+ ctxt->hw_pstate |= PSR_MODE_EL1t;
+
+ ctxt->hw_sys_regs = ctxt->shadow_sys_regs;
+ ctxt->hw_sp_el1 = vcpu_el2_sreg(vcpu, SP_EL2);
+ ctxt->hw_elr_el1 = vcpu_el2_sreg(vcpu, ELR_EL2);
+ ctxt->hw_spsr_el1 = vcpu_el2_sreg(vcpu, SPSR_EL2);
+}
+
+static void flush_special_regs(struct kvm_vcpu *vcpu)
{
struct kvm_cpu_context *ctxt = &vcpu->arch.ctxt;
@@ -33,11 +51,18 @@ void kvm_arm_setup_shadow_state(struct kvm_vcpu *vcpu)
ctxt->hw_spsr_el1 = ctxt->gp_regs.spsr[KVM_SPSR_EL1];
}
-/**
- * kvm_arm_restore_shadow_state -- write back shadow state from guest
- * @vcpu: The VCPU pointer
- */
-void kvm_arm_restore_shadow_state(struct kvm_vcpu *vcpu)
+static void sync_shadow_special_regs(struct kvm_vcpu *vcpu)
+{
+ struct kvm_cpu_context *ctxt = &vcpu->arch.ctxt;
+
+ *vcpu_cpsr(vcpu) &= PSR_MODE_MASK;
+ *vcpu_cpsr(vcpu) |= ctxt->hw_pstate & ~PSR_MODE_MASK;
+ vcpu_el2_sreg(vcpu, SP_EL2) = ctxt->hw_sp_el1;
+ vcpu_el2_sreg(vcpu, ELR_EL2) = ctxt->hw_elr_el1;
+ vcpu_el2_sreg(vcpu, SPSR_EL2) = ctxt->hw_spsr_el1;
+}
+
+static void sync_special_regs(struct kvm_vcpu *vcpu)
{
struct kvm_cpu_context *ctxt = &vcpu->arch.ctxt;
@@ -47,6 +72,35 @@ void kvm_arm_restore_shadow_state(struct kvm_vcpu *vcpu)
ctxt->gp_regs.spsr[KVM_SPSR_EL1] = ctxt->hw_spsr_el1;
}
+/**
+ * kvm_arm_setup_shadow_state -- prepare shadow state based on emulated mode
+ * @vcpu: The VCPU pointer
+ */
+void kvm_arm_setup_shadow_state(struct kvm_vcpu *vcpu)
+{
+ struct kvm_cpu_context *ctxt = &vcpu->arch.ctxt;
+
+ if (unlikely(vcpu_mode_el2(vcpu))) {
+ flush_shadow_special_regs(vcpu);
+ ctxt->hw_sys_regs = ctxt->shadow_sys_regs;
+ } else {
+ flush_special_regs(vcpu);
+ ctxt->hw_sys_regs = ctxt->sys_regs;
+ }
+}
+
+/**
+ * kvm_arm_restore_shadow_state -- write back shadow state from guest
+ * @vcpu: The VCPU pointer
+ */
+void kvm_arm_restore_shadow_state(struct kvm_vcpu *vcpu)
+{
+ if (unlikely(vcpu_mode_el2(vcpu)))
+ sync_shadow_special_regs(vcpu);
+ else
+ sync_special_regs(vcpu);
+}
+
void kvm_arm_init_cpu_context(kvm_cpu_context_t *cpu_ctxt)
{
/* This is to set hw_sys_regs of host_cpu_context */
--
1.9.1
Back to linux.kernel | Previous | Next | Find similar | Unroll thread
[RFC PATCH v2 11/38] KVM: arm64: Set vcpu context depending on the guest exception level Jintack Lim <jintack.lim@linaro.org> - 2017-07-18 19:20 +0200
csiph-web