From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefano Stabellini Subject: [PATCH v2 1/4] xen/arm: trap guest WFI Date: Mon, 18 Feb 2013 16:02:26 +0000 Message-ID: <1361203349-24689-1-git-send-email-stefano.stabellini@eu.citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com Cc: tim@xen.org, Ian.Campbell@citrix.com, Stefano Stabellini List-Id: xen-devel@lists.xenproject.org Trap guest WFI, block the guest VCPU unless it has pending interrupts. Awake the guest vcpu when a new interrupt for it arrrives. Signed-off-by: Stefano Stabellini --- xen/arch/arm/domain_build.c | 2 +- xen/arch/arm/traps.c | 7 +++++++ xen/arch/arm/vgic.c | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 1e9776d..aa0f191 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -331,7 +331,7 @@ int construct_dom0(struct domain *d) WRITE_CP32(SCTLR_BASE, SCTLR); - WRITE_CP32(HCR_PTW|HCR_BSU_OUTER|HCR_AMO|HCR_IMO|HCR_VM, HCR); + WRITE_CP32(HCR_PTW|HCR_BSU_OUTER|HCR_AMO|HCR_IMO|HCR_VM|HCR_TWI, HCR); isb(); local_abort_enable(); diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 5347dce..b313e7a 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -781,6 +782,12 @@ asmlinkage void do_trap_hypervisor(struct cpu_user_regs *regs) case HSR_EC_DATA_ABORT_GUEST: do_trap_data_abort_guest(regs, hsr.dabt); break; + /* at the moment we only trap WFI */ + case HSR_EC_WFI_WFE: + if ( list_empty(¤t->arch.vgic.inflight_irqs) ) + do_sched_op_compat(SCHEDOP_block, 0); + regs->pc += hsr.len ? 4 : 2; + break; default: printk("Hypervisor Trap. HSR=0x%x EC=0x%x IL=%x Syndrome=%"PRIx32"\n", hsr.bits, hsr.ec, hsr.len, hsr.iss); diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index 39b9775..8495384 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -608,12 +608,14 @@ void vgic_vcpu_inject_irq(struct vcpu *v, unsigned int irq, int virtual) { list_add_tail(&n->inflight, &iter->inflight); spin_unlock_irqrestore(&v->arch.vgic.lock, flags); - return; + goto out; } } list_add_tail(&n->inflight, &v->arch.vgic.inflight_irqs); spin_unlock_irqrestore(&v->arch.vgic.lock, flags); /* we have a new higher priority irq, inject it into the guest */ +out: + vcpu_unblock(v); } /* -- 1.7.2.5