[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Xen-devel] [PATCH v4 1/4] xen/arm: observe itargets setting in vgic_enable_irqs and vgic_disable_irqs
Hi Stefano,
On 06/06/14 18:48, Stefano Stabellini wrote:
return 0;
}
@@ -369,6 +377,22 @@ read_as_zero:
return 1;
}
+struct vcpu *vgic_get_target_vcpu(struct vcpu *v, unsigned int irq)
+{
+ int target;
+ struct vgic_irq_rank *rank;
+ struct vcpu *v_target;
+
+ rank = vgic_irq_rank(v, 1, irq/32);
+ vgic_lock_rank(v, rank);
+ target = byte_read(rank->itargets[(irq%32)/4], 0, irq % 4);
+ /* just return the first vcpu in the mask */
+ target = find_next_bit((const unsigned long *) &target, 8, 0);
int* and unsigned long* doesn't have the same alignment on aarch64. This
may end up to a data abort for Xen side.
IIRC, Ian has fixed a similar issue in commit 5224a733.
[..]
}
if ( p->desc != NULL )
{
@@ -502,6 +530,7 @@ static int vgic_distr_mmio_write(struct vcpu *v,
mmio_info_t *info)
int offset = (int)(info->gpa - v->domain->arch.vgic.dbase);
int gicd_reg = REG(offset);
uint32_t tr;
+ int i;
switch ( gicd_reg )
{
@@ -585,6 +614,21 @@ static int vgic_distr_mmio_write(struct vcpu *v,
mmio_info_t *info)
rank = vgic_irq_rank(v, 8, gicd_reg - GICD_ITARGETSR);
if ( rank == NULL) goto write_ignore;
vgic_lock_rank(v, rank);
+ tr = *r & ~(rank->itargets[REG_RANK_INDEX(8, gicd_reg -
GICD_ITARGETSR)]);
Write in GICD_ITARGETSR can be either half-word or word. If I'm not
mistaken you sanity check only handle word access.
Regards,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|