linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 18/30] arm64: KVM: Exit handling
Date: Tue, 26 Mar 2013 17:01:13 +0000	[thread overview]
Message-ID: <1364317285-20937-19-git-send-email-marc.zyngier@arm.com> (raw)
In-Reply-To: <1364317285-20937-1-git-send-email-marc.zyngier@arm.com>

Handle the exit of a VM, decoding the exit reason from HYP mode
and calling the corresponding handler.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
 arch/arm64/kvm/handle_exit.c | 119 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 119 insertions(+)
 create mode 100644 arch/arm64/kvm/handle_exit.c

diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c
new file mode 100644
index 0000000..0e1fa4e
--- /dev/null
+++ b/arch/arm64/kvm/handle_exit.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2012 - ARM Ltd
+ * Author: Marc Zyngier <marc.zyngier@arm.com>
+ *
+ * Derived from arch/arm/kvm/handle_exit.c:
+ * Copyright (C) 2012 - Virtual Open Systems and Columbia University
+ * Author: Christoffer Dall <c.dall@virtualopensystems.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/kvm.h>
+#include <linux/kvm_host.h>
+#include <asm/kvm_emulate.h>
+#include <asm/kvm_coproc.h>
+#include <asm/kvm_mmu.h>
+
+typedef int (*exit_handle_fn)(struct kvm_vcpu *, struct kvm_run *);
+
+static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run)
+{
+	/*
+	 * Guest called HVC instruction:
+	 * Let it know we don't want that by injecting an undefined exception.
+	 */
+	kvm_debug("hvc: %x (at %08lx)", kvm_vcpu_get_hsr(vcpu) & ((1 << 16) - 1),
+		  *vcpu_pc(vcpu));
+	kvm_debug("         HSR: %8x", kvm_vcpu_get_hsr(vcpu));
+	kvm_inject_undefined(vcpu);
+	return 1;
+}
+
+static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run)
+{
+	/* We don't support SMC; don't do that. */
+	kvm_debug("smc:@%08lx", *vcpu_pc(vcpu));
+	kvm_inject_undefined(vcpu);
+	return 1;
+}
+
+/**
+ * kvm_handle_wfi - handle a wait-for-interrupts instruction executed by a guest
+ * @vcpu:	the vcpu pointer
+ *
+ * Simply call kvm_vcpu_block(), which will halt execution of
+ * world-switches and schedule other host processes until there is an
+ * incoming IRQ or FIQ to the VM.
+ */
+static int kvm_handle_wfi(struct kvm_vcpu *vcpu, struct kvm_run *run)
+{
+	kvm_vcpu_block(vcpu);
+	return 1;
+}
+
+static exit_handle_fn arm_exit_handlers[] = {
+	[ESR_EL2_EC_WFI]	= kvm_handle_wfi,
+	[ESR_EL2_EC_HVC64]	= handle_hvc,
+	[ESR_EL2_EC_SMC64]	= handle_smc,
+	[ESR_EL2_EC_SYS64]	= kvm_handle_sys_reg,
+	[ESR_EL2_EC_IABT]	= kvm_handle_guest_abort,
+	[ESR_EL2_EC_DABT]	= kvm_handle_guest_abort,
+};
+
+static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu)
+{
+	u8 hsr_ec = kvm_vcpu_trap_get_class(vcpu);
+
+	if (hsr_ec >= ARRAY_SIZE(arm_exit_handlers) ||
+	    !arm_exit_handlers[hsr_ec]) {
+		kvm_err("Unkown exception class: hsr: %#08x\n",
+			(unsigned int)kvm_vcpu_get_hsr(vcpu));
+		BUG();
+	}
+
+	return arm_exit_handlers[hsr_ec];
+}
+
+/*
+ * Return > 0 to return to guest, < 0 on error, 0 (and set exit_reason) on
+ * proper exit to userspace.
+ */
+int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run,
+		       int exception_index)
+{
+	exit_handle_fn exit_handler;
+
+	switch (exception_index) {
+	case ARM_EXCEPTION_IRQ:
+		return 1;
+	case ARM_EXCEPTION_TRAP:
+		/*
+		 * See ARM ARM B1.14.1: "Hyp traps on instructions
+		 * that fail their condition code check"
+		 */
+		if (!kvm_condition_valid(vcpu)) {
+			kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
+			return 1;
+		}
+
+		exit_handler = kvm_get_exit_handler(vcpu);
+
+		return exit_handler(vcpu, run);
+	default:
+		kvm_pr_unimpl("Unsupported exception type: %d",
+			      exception_index);
+		run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
+		return 0;
+	}
+}
-- 
1.8.1.4

  parent reply	other threads:[~2013-03-26 17:01 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-26 17:00 [PATCH v2 00/30] Port of KVM to arm64 Marc Zyngier
2013-03-26 17:00 ` [PATCH v2 01/30] arm64: add explicit symbols to ESR_EL1 decoding Marc Zyngier
2013-03-27 13:51   ` Catalin Marinas
2013-03-27 14:05     ` Marc Zyngier
2013-03-26 17:00 ` [PATCH v2 02/30] arm64: KVM: define HYP and Stage-2 translation page flags Marc Zyngier
2013-03-27 14:11   ` Catalin Marinas
2013-03-27 14:20     ` Marc Zyngier
2013-03-26 17:00 ` [PATCH v2 03/30] arm64: KVM: HYP mode idmap support Marc Zyngier
2013-03-26 17:00 ` [PATCH v2 04/30] arm64: KVM: EL2 register definitions Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 05/30] arm64: KVM: system register definitions for 64bit guests Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 06/30] arm64: KVM: Basic ESR_EL2 helpers and vcpu register access Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 07/30] arm64: KVM: fault injection into a guest Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 08/30] arm64: KVM: architecture specific MMU backend Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 09/30] arm64: KVM: user space interface Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 10/30] arm64: KVM: system register handling Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 11/30] arm64: KVM: CPU specific system registers handling Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 12/30] arm64: KVM: virtual CPU reset Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 13/30] arm64: KVM: kvm_arch and kvm_vcpu_arch definitions Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 14/30] arm64: KVM: MMIO access backend Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 15/30] arm64: KVM: guest one-reg interface Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 16/30] arm64: KVM: hypervisor initialization code Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 17/30] arm64: KVM: HYP mode world switch implementation Marc Zyngier
2013-03-26 17:01 ` Marc Zyngier [this message]
2013-03-26 17:01 ` [PATCH v2 19/30] arm64: KVM: Plug the VGIC Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 20/30] arm64: KVM: Plug the arch timer Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 21/30] arm64: KVM: PSCI implementation Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 22/30] arm64: KVM: Build system integration Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 23/30] arm64: KVM: define 32bit specific registers Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 24/30] arm64: KVM: 32bit GP register access Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 25/30] arm64: KVM: 32bit conditional execution emulation Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 26/30] arm64: KVM: 32bit handling of coprocessor traps Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 27/30] arm64: KVM: CPU specific 32bit coprocessor access Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 28/30] arm64: KVM: 32bit specific register world switch Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 29/30] arm64: KVM: 32bit guest fault injection Marc Zyngier
2013-03-26 17:01 ` [PATCH v2 30/30] arm64: KVM: enable initialization of a 32bit vcpu Marc Zyngier
2013-03-29 14:57 ` [PATCH v2 00/30] Port of KVM to arm64 Christopher Covington
2013-03-29 18:37   ` Marc Zyngier

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=1364317285-20937-19-git-send-email-marc.zyngier@arm.com \
    --to=marc.zyngier@arm.com \
    --cc=linux-arm-kernel@lists.infradead.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;
as well as URLs for NNTP newsgroup(s).