static struct vgic_lr vgic_v3_get_lr(const struct kvm_vcpu *vcpu, int lr) { struct vgic_lr lr_desc; u64 val = vcpu->arch.vgic_cpu.vgic_v3.vgic_lr[LR_INDEX(lr)]; if (vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) lr_desc.irq = val & ICH_LR_VIRTUALID_MASK; else lr_desc.irq = val & GICH_LR_VIRTUALID; lr_desc.source = 0; if (lr_desc.irq <= 15 && vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V2) lr_desc.source = (val >> GICH_LR_PHYSID_CPUID_SHIFT) & 0x7; lr_desc.state = 0; if (val & ICH_LR_PENDING_BIT) lr_desc.state |= LR_STATE_PENDING; if (val & ICH_LR_ACTIVE_BIT) lr_desc.state |= LR_STATE_ACTIVE; if (val & ICH_LR_EOI) lr_desc.state |= LR_EOI_INT; if (val & ICH_LR_HW) { lr_desc.state |= LR_HW; lr_desc.hwirq = (val >> ICH_LR_PHYS_ID_SHIFT) & GENMASK(9, 0); }
static void vgic_v3_set_lr(struct kvm_vcpu *vcpu, int lr, struct vgic_lr lr_desc) { u64 lr_val; lr_val = lr_desc.irq; /* * Currently all guest IRQs are Group1, as Group0 would result * in a FIQ in the guest, which it wouldn't expect. * Eventually we want to make this configurable, so we may revisit * this in the future. */ if (vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) lr_val |= ICH_LR_GROUP; else lr_val |= (u32)lr_desc.source << GICH_LR_PHYSID_CPUID_SHIFT; if (lr_desc.state & LR_STATE_PENDING) lr_val |= ICH_LR_PENDING_BIT; if (lr_desc.state & LR_STATE_ACTIVE) lr_val |= ICH_LR_ACTIVE_BIT; if (lr_desc.state & LR_EOI_INT) lr_val |= ICH_LR_EOI; vcpu->arch.vgic_cpu.vgic_v3.vgic_lr[LR_INDEX(lr)] = lr_val; }
static struct vgic_lr vgic_v3_get_lr(const struct kvm_vcpu *vcpu, int lr) { struct vgic_lr lr_desc; u64 val = vcpu->arch.vgic_cpu.vgic_v3.vgic_lr[LR_INDEX(lr)]; lr_desc.irq = val & GICH_LR_VIRTUALID; if (lr_desc.irq <= 15) lr_desc.source = (val >> GICH_LR_PHYSID_CPUID_SHIFT) & 0x7; else