kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: Christoffer Dall <c.dall@virtualopensystems.com>
Cc: android-virt@lists.cs.columbia.edu, kvm@vger.kernel.org,
	Marc.Zyngier@arm.com, catalin.marinas@arm.com,
	tech@virtualopensystems.com, peter.maydell@linaro.org
Subject: Re: [PATCH v5 07/13] ARM: KVM: Emulation framework and CP15 emulation
Date: Mon, 12 Dec 2011 15:44:23 +0200	[thread overview]
Message-ID: <4EE60537.9050805@redhat.com> (raw)
In-Reply-To: <20111211102502.21693.59537.stgit@localhost>

On 12/11/2011 12:25 PM, Christoffer Dall wrote:
> From: Christoffer Dall <cdall@cs.columbia.edu>
>
> Adds a new important function in the main KVM/ARM code called
> handle_exit() which is called from kvm_arch_vcpu_ioctl_run() on returns
> from guest execution. This function examines the Hyp-Syndrome-Register
> (HSR), which contains information telling KVM what caused the exit from
> the guest.
>
> Some of the reasons for an exit are CP15 accesses, which are
> not allowed from the guest and this commits handles these exits by

commit

> emulating the intented operation in software and skip the guest

intended

> instruction.
>
> @@ -306,6 +307,62 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *v)
>  	return 0;
>  }
>  
> +static inline int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run,
> +			      int exception_index)
> +{
> +	unsigned long hsr_ec;
> +
> +	if (exception_index == ARM_EXCEPTION_IRQ)
> +		return 0;
> +
> +	if (exception_index != ARM_EXCEPTION_HVC) {
> +		kvm_err(-EINVAL, "Unsupported exception type");
> +		return -EINVAL;
> +	}
> +
> +	hsr_ec = (vcpu->arch.hsr & HSR_EC) >> HSR_EC_SHIFT;
> +	switch (hsr_ec) {
> +	case HSR_EC_WFI:
> +		return kvm_handle_wfi(vcpu, run);
> +	case HSR_EC_CP15_32:
> +	case HSR_EC_CP15_64:
> +		return kvm_handle_cp15_access(vcpu, run);
> +	case HSR_EC_CP14_MR:
> +		return kvm_handle_cp14_access(vcpu, run);
> +	case HSR_EC_CP14_LS:
> +		return kvm_handle_cp14_load_store(vcpu, run);
> +	case HSR_EC_CP14_64:
> +		return kvm_handle_cp14_access(vcpu, run);
> +	case HSR_EC_CP_0_13:
> +		return kvm_handle_cp_0_13_access(vcpu, run);
> +	case HSR_EC_CP10_ID:
> +		return kvm_handle_cp10_id(vcpu, run);
> +	case HSR_EC_SVC_HYP:
> +		/* SVC called from Hyp mode should never get here */
> +		kvm_msg("SVC called from Hyp mode shouldn't go here");
> +		BUG();
> +	case HSR_EC_HVC:
> +		kvm_msg("hvc: %x (at %08x)", vcpu->arch.hsr & ((1 << 16) - 1),
> +					     vcpu->arch.regs.pc);
> +		kvm_msg("         HSR: %8x", vcpu->arch.hsr);
> +		break;
> +	case HSR_EC_IABT:
> +	case HSR_EC_DABT:
> +		return kvm_handle_guest_abort(vcpu, run);
> +	case HSR_EC_IABT_HYP:
> +	case HSR_EC_DABT_HYP:
> +		/* The hypervisor should never cause aborts */
> +		kvm_msg("The hypervisor itself shouldn't cause aborts");
> +		BUG();
> +	default:
> +		kvm_msg("Unkown exception class: %08x (%08x)", hsr_ec,
> +				vcpu->arch.hsr);
> +		BUG();
> +	}

x86 uses a function table, which is slightly nicer.

> +
> +	return 0;
> +}
> +
>  /**
>   * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code
>   * @vcpu:	The VCPU pointer
> @@ -333,6 +390,26 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
>  		local_irq_enable();
>  
>  		trace_kvm_exit(vcpu->arch.regs.pc);
> +
> +		ret = handle_exit(vcpu, run, ret);
> +		if (ret) {
> +			kvm_err(ret, "Error in handle_exit");
> +			break;
> +		}
> +
> +		if (run->exit_reason == KVM_EXIT_MMIO)
> +			break;
> +
> +		if (need_resched()) {
> +			vcpu_put(vcpu);
> +			schedule();
> +			vcpu_load(vcpu);
> +		}

I don't think you need the vcpu_put()/vcpu_load() here; you can replace
the whole thing with cond_resched().

> +
> +		if (signal_pending(current) && !(run->exit_reason)) {
> +			run->exit_reason = KVM_EXIT_IRQ_WINDOW_OPEN;

This exit reason doesn't fit with KVM_IRQ_LINE.

With KVM_INTERRUPT, userspace is responsible for determining when to
inject interrupts, so it needs to know when guest interrupts become
enabled (this is KVM_EXIT_IRQ_WINDOWS_OPEN).  With KVM_IRQ_LINE,
userspace just sets the line status, and the kernel takes care of
everything.

Oh, and you need to exit to userspace unconditionally if a signal is
pending.

> +			break;
> +		}
>  	}
>  
> +
> +/******************************************************************************
> + * Co-processor emulation
> + */
> +
> +struct coproc_params {
> +	unsigned long CRm;
> +	unsigned long CRn;
> +	unsigned long Op1;
> +	unsigned long Op2;
> +	unsigned long Rt1;
> +	unsigned long Rt2;
> +	bool is_64bit;
> +	bool is_write;
> +};
> +
> +#define CP15_OP(_vcpu, _params, _cp15_reg) \
> +do { \
> +	if (_params->is_write) \
> +		_vcpu->arch.cp15._cp15_reg = *vcpu_reg(_vcpu, _params->Rt1); \
> +	else \
> +		*vcpu_reg(_vcpu, _params->Rt1) = _vcpu->arch.cp15._cp15_reg; \
> +} while (0);

Ugly.  How about an array of registers instead?



-- 
error compiling committee.c: too many arguments to function


  reply	other threads:[~2011-12-12 13:44 UTC|newest]

Thread overview: 105+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-11 10:24 [PATCH v5 00/13] KVM/ARM Implementation Christoffer Dall
2011-12-11 10:24 ` [PATCH v5 01/13] ARM: KVM: Initial skeleton to compile KVM support Christoffer Dall
2011-12-11 10:24 ` [PATCH v5 02/13] ARM: KVM: Hypervisor identity mapping Christoffer Dall
2011-12-11 10:24 ` [PATCH v5 03/13] ARM: KVM: Add hypervisor inititalization Christoffer Dall
2011-12-11 10:24 ` [PATCH v5 04/13] ARM: KVM: Memory virtualization setup Christoffer Dall
2011-12-12 14:40   ` Avi Kivity
2011-12-12 15:09     ` [Android-virt] " Christoffer Dall
2011-12-12 15:15       ` Avi Kivity
2011-12-12 15:25         ` Peter Maydell
2011-12-12 15:49           ` Avi Kivity
2011-12-12 17:40             ` Christoffer Dall
2011-12-13 17:10             ` Antonios Motakis
2011-12-13 17:13               ` Christoffer Dall
2011-12-11 10:24 ` [PATCH v5 05/13] ARM: KVM: Inject IRQs and FIQs from userspace Christoffer Dall
2011-12-11 15:18   ` Jan Kiszka
2011-12-11 16:03     ` Peter Maydell
2011-12-11 19:30       ` Christoffer Dall
2011-12-11 19:48         ` Peter Maydell
2011-12-11 20:07           ` [Android-virt] " Christoffer Dall
2011-12-11 20:25             ` Peter Maydell
2011-12-11 21:36               ` Christoffer Dall
2011-12-11 22:12                 ` Peter Maydell
2011-12-11 22:35                   ` Peter Maydell
2011-12-11 22:53                     ` Christoffer Dall
2011-12-11 23:01                       ` Jan Kiszka
2011-12-12 16:31                         ` Peter Maydell
2011-12-12 17:40                           ` Avi Kivity
2011-12-29  1:29                             ` Christoffer Dall
2012-02-09  1:15                             ` Peter Maydell
2011-12-12 11:06             ` Marc Zyngier
2011-12-12 12:54               ` Christoffer Dall
2011-12-12  6:35           ` Alexander Graf
2011-12-11 19:16     ` Christoffer Dall
2011-12-12 13:28   ` Avi Kivity
2011-12-12 14:38     ` [Android-virt] " Christoffer Dall
2011-12-12 14:50       ` Avi Kivity
2011-12-12 15:11         ` Christoffer Dall
2011-12-12 15:16           ` Avi Kivity
2011-12-11 10:24 ` [PATCH v5 06/13] ARM: KVM: World-switch implementation Christoffer Dall
2011-12-11 10:25 ` [PATCH v5 07/13] ARM: KVM: Emulation framework and CP15 emulation Christoffer Dall
2011-12-12 13:44   ` Avi Kivity [this message]
2011-12-12 16:17     ` Christoffer Dall
2011-12-11 10:25 ` [PATCH v5 08/13] ARM: KVM: Handle guest faults in KVM Christoffer Dall
2011-12-12 15:05   ` Avi Kivity
2011-12-12 19:53     ` Christoffer Dall
2011-12-13  9:45       ` Avi Kivity
2011-12-13 13:10         ` [Android-virt] " Christoffer Dall
2011-12-13 13:17           ` Marc Zyngier
2011-12-13 13:23           ` Avi Kivity
2011-12-13 13:44             ` Christoffer Dall
2011-12-13 14:27               ` Avi Kivity
2011-12-11 10:25 ` [PATCH v5 09/13] ARM: KVM: Handle I/O aborts Christoffer Dall
2011-12-12 13:54   ` Avi Kivity
2011-12-12 14:56     ` [Android-virt] " Christoffer Dall
2011-12-11 10:25 ` [PATCH v5 10/13] ARM: KVM: Guest wait-for-interrupts (WFI) support Christoffer Dall
2011-12-12 14:12   ` Avi Kivity
2011-12-12 16:20     ` Christoffer Dall
2011-12-12 17:44       ` Avi Kivity
2011-12-12 19:21         ` [Android-virt] " Christoffer Dall
2011-12-13  9:41           ` Avi Kivity
2011-12-11 10:25 ` [PATCH v5 11/13] ARM: KVM: Support SMP hosts Christoffer Dall
2011-12-12 14:30   ` Avi Kivity
2011-12-12 17:37     ` Christoffer Dall
2011-12-12 17:56       ` Avi Kivity
2011-12-12 19:38         ` [Android-virt] " Christoffer Dall
     [not found]         ` <CAEDV+gJ=zeDpfp0kS2uBvmgRMyCpsV1LitjKR66R4W9Y3VGgWw@mail.gmail.com>
     [not found]           ` <4EE71CF1.5080705@redhat.com>
2011-12-13 13:36             ` Christoffer Dall
2011-12-13 14:17               ` Avi Kivity
2011-12-13 14:36                 ` Christoffer Dall
2011-12-13 14:17               ` Marc Zyngier
2011-12-19  6:15   ` Antonios Motakis
2011-12-19 14:57     ` [Android-virt] " Christoffer Dall
2011-12-19 15:19       ` Marc Zyngier
2011-12-19 15:30         ` Antonios Motakis
2011-12-19 15:37           ` Marc Zyngier
2011-12-19 15:40             ` Christoffer Dall
2011-12-19 15:42               ` Antonios Motakis
2011-12-19 15:45                 ` Marc Zyngier
     [not found]                   ` <CAEDV+gL929Hpa=PncVWeHRNAa5fBuorNNYFC=iix=PO+5aO2cg@mail.gmail.com>
2011-12-19 17:19                     ` Peter Maydell
2011-12-19 17:24                       ` Christoffer Dall
2011-12-19 17:36                         ` Peter Maydell
2011-12-19 17:40                           ` Christoffer Dall
2011-12-11 10:25 ` [PATCH v5 12/13] ARM: KVM: Fix guest view of MPIDR Christoffer Dall
2011-12-12 14:32   ` Avi Kivity
2011-12-12 17:39     ` Christoffer Dall
2011-12-12 17:44       ` Marc Zyngier
2011-12-12 19:43         ` Christoffer Dall
2011-12-13  9:46           ` Avi Kivity
2011-12-13 13:38             ` Christoffer Dall
2011-12-11 10:25 ` [PATCH v5 13/13] ARM: KVM: Support SMP guests Christoffer Dall
2011-12-11 11:32 ` [PATCH v5 00/13] KVM/ARM Implementation Peter Maydell
2011-12-11 19:23   ` Christoffer Dall
2011-12-11 19:27     ` Peter Maydell
2012-01-11 16:48     ` Peter Maydell
2012-01-12  3:29       ` Christoffer Dall
2012-01-12  8:19         ` Peter Maydell
2012-01-12 16:15           ` [Android-virt] " Christoffer Dall
2012-01-20  2:59             ` Christoffer Dall
2012-01-30 22:46               ` Peter Maydell
2012-01-30 23:02                 ` Alexander Graf
2012-01-31 14:39                 ` Antonios Motakis
2012-02-01 12:11                 ` Marc Zyngier
2012-02-01 12:20                   ` Peter Maydell
2012-02-01 13:40                     ` Marc Zyngier
2012-02-01 13:57                       ` Peter Maydell
2012-02-01 13:59                       ` Christoffer Dall

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=4EE60537.9050805@redhat.com \
    --to=avi@redhat.com \
    --cc=Marc.Zyngier@arm.com \
    --cc=android-virt@lists.cs.columbia.edu \
    --cc=c.dall@virtualopensystems.com \
    --cc=catalin.marinas@arm.com \
    --cc=kvm@vger.kernel.org \
    --cc=peter.maydell@linaro.org \
    --cc=tech@virtualopensystems.com \
    /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).