Re: Few general questions on kvm-arm

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jun 03 2014 at  6:59:25 am BST, Mathew Li <mathew.li100@xxxxxxxxx> wrote:
> Hi,
>
> I was just trying to understand the KVM-ARM code and ran into the
> following questions. I'm sorry if my questions are really naive. I
> would highly appreciate if someone could shed some light here:
>
> 1. Looking at arch/arm/kvm/arm.c::kvm_arch_vcpu_ioctl_run() function:
>
> ...
>        local_irq_disable();   <=== Disable interrupts here.
>
>  ...
>
>         /**************************************************************
>          * Enter the guest
>          */
>         trace_kvm_entry(*vcpu_pc(vcpu));
>         kvm_guest_enter();
>         vcpu->mode = IN_GUEST_MODE;
>
>         ret = kvm_call_hyp(__kvm_vcpu_run, vcpu);
>
>         vcpu->mode = OUTSIDE_GUEST_MODE;
>         vcpu->arch.last_pcpu = smp_processor_id();
>         kvm_guest_exit();
>         trace_kvm_exit(*vcpu_pc(vcpu));
>         /*
>          * We may have taken a host interrupt in HYP mode (ie
>          * while executing the guest). This interrupt is still
>          * pending, as we haven't serviced it yet!
>          *
>          * We're now back in SVC mode, with interrupts
>          * disabled.  Enabling the interrupts now will have
>          * the effect of taking the interrupt again, in SVC
>          * mode this time.
>          */
>         local_irq_enable();  <=== Enable interrupts here.
>
>         /*
>          * Back from guest
>          *************************************************************/
>
> So in the code above, we disable the interrupts and then run the guest
> code, meaning guest is running while interrupts are disabled if that
> is the case then as per the comment above how can "We may have taken a
> host interrupt in HYP mode", I mean interrupts were not even enabled
> so how can the pcpu running the guest be interrupted?

Here, we've disabled interrupts at EL1. We then jump to EL2 using HVC,
interrupts are disabled by virtue of interrupts being turned off on
exception entry.

When we configure the system to enter the guest, we sety the HCR to
handle physical interrupt at EL2. We then ERET into the guest. At that
point physical interrupts will be taken directly into EL2, exiting the
guest.

> 2. Looking at the code in virt/kvm/arm/vgic.c, it looks like we use
> maintenance interrupt to update our in-memory data structures when
> guest EOIs the interrupt. That would mean, we would exit the VM every
> time guest does an EOI. Is that correct?

Only when we use level interrupts.

> 3. What is vmid? Why is it needed? Sorry to ask if it is obvious but I
> cannot seem to get my head around that?

I think you need to read a bit of the ARM ARM. Basically, they serve the
same purpose as ASIDs, at the VM level.

> 4. While injecting an interrupt into the guest, we update our in
> memory data structures and then call vgic_kick_vcpus(). If the vcpu is
> already running then this function sends an IPI to the the pcpu
> running the vcpu which basically forces vcpu to exit and on the way
> back to continuing the guest we update the guest's interrupts' view
> leading to raising a virtual interrupt to the guest. Is my
> understanding correct here?

Yes.

	M.
-- 
Jazz is not dead. It just smells funny.
_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm




[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux