On Tue, Jun 26, 2012 at 8:40 AM, Marc Zyngier <marc.zyngier at arm.com> wrote: > On 25/06/12 22:14, Christoffer Dall wrote: >> On Mon, May 14, 2012 at 9:07 AM, Marc Zyngier <marc.zyngier at arm.com> wrote: >>> When a timer interrupt occurs for the guest, it is necessary >>> to find out which VCPU was running at that point. >>> >>> Thankfully, the VGIC code already keeps track of this, so it is >>> only a matter of exposing the information. The returned pointer >>> is only valid in the interrupt handler. >>> >>> Signed-off-by: Marc Zyngier <marc.zyngier at arm.com> >>> --- >>> ?arch/arm/include/asm/kvm_vgic.h | ? ?6 ++++++ >>> ?arch/arm/kvm/vgic.c ? ? ? ? ? ? | ? ?5 +++++ >>> ?2 files changed, 11 insertions(+), 0 deletions(-) >>> >>> diff --git a/arch/arm/include/asm/kvm_vgic.h b/arch/arm/include/asm/kvm_vgic.h >>> index 4e7f6c3..1690c6d 100644 >>> --- a/arch/arm/include/asm/kvm_vgic.h >>> +++ b/arch/arm/include/asm/kvm_vgic.h >>> @@ -148,6 +148,7 @@ void kvm_vgic_sync_from_cpu(struct kvm_vcpu *vcpu); >>> ?int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, const struct kvm_irq_level *irq); >>> ?int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu); >>> ?int vgic_handle_mmio(struct kvm_vcpu *vcpu, struct kvm_run *run); >>> +struct kvm_vcpu *kvm_vgic_get_current_vcpu(void); >>> >>> ?#define irqchip_in_kernel(k) ? (!!((k)->arch.vgic.vctrl_base)) >>> ?#else >>> @@ -175,6 +176,11 @@ static inline int vgic_handle_mmio(struct kvm_vcpu *vcpu, struct kvm_run *run) >>> ? ? ? ?return KVM_EXIT_MMIO; >>> ?} >>> >>> +static inline struct kvm_vcpu *kvm_vgic_get_current_vcpu(void) >>> +{ >>> + ? ? ? return NULL; >>> +} >>> + >>> ?static inline int irqchip_in_kernel(struct kvm *kvm) >>> ?{ >>> ? ? ? ?return 0; >>> diff --git a/arch/arm/kvm/vgic.c b/arch/arm/kvm/vgic.c >>> index 1b4f6b7..c8bcc9e 100644 >>> --- a/arch/arm/kvm/vgic.c >>> +++ b/arch/arm/kvm/vgic.c >>> @@ -687,6 +687,11 @@ void kvm_vgic_sync_from_cpu(struct kvm_vcpu *vcpu) >>> ? ? ? ?*__this_cpu_ptr(vgic_vcpus) = NULL; >>> ?} >>> >>> +struct kvm_vcpu *kvm_vgic_get_current_vcpu(void) >>> +{ >>> + ? ? ? return *__this_cpu_ptr(vgic_vcpus); >>> +} >>> + >>> ?int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu) >>> ?{ >>> ? ? ? ?struct vgic_dist *dist = &vcpu->kvm->arch.vgic; >>> -- >>> 1.7.7.1 >>> >> I think this should be factored out to generic code instead. It's not >> vgic-specific is it? > > No it is not, but I don't know if other architectures have a similar > need. Will investigate. > or just factor it out to be kvm/arm specifici and not vgic specific is actually what I meant. -Christoffer