@@ -27,13 +27,6 @@ static bool group1_trap;
27
27
static bool common_trap ;
28
28
static bool gicv4_enable ;
29
29
30
- void vgic_v3_set_npie (struct kvm_vcpu * vcpu )
31
- {
32
- struct vgic_v3_cpu_if * cpuif = & vcpu -> arch .vgic_cpu .vgic_v3 ;
33
-
34
- cpuif -> vgic_hcr |= ICH_HCR_NPIE ;
35
- }
36
-
37
30
void vgic_v3_set_underflow (struct kvm_vcpu * vcpu )
38
31
{
39
32
struct vgic_v3_cpu_if * cpuif = & vcpu -> arch .vgic_cpu .vgic_v3 ;
@@ -55,17 +48,23 @@ void vgic_v3_fold_lr_state(struct kvm_vcpu *vcpu)
55
48
int lr ;
56
49
unsigned long flags ;
57
50
58
- cpuif -> vgic_hcr &= ~( ICH_HCR_UIE | ICH_HCR_NPIE ) ;
51
+ cpuif -> vgic_hcr &= ~ICH_HCR_UIE ;
59
52
60
53
for (lr = 0 ; lr < vgic_cpu -> used_lrs ; lr ++ ) {
61
54
u64 val = cpuif -> vgic_lr [lr ];
62
- u32 intid ;
55
+ u32 intid , cpuid ;
63
56
struct vgic_irq * irq ;
57
+ bool is_v2_sgi = false;
64
58
65
- if (model == KVM_DEV_TYPE_ARM_VGIC_V3 )
59
+ cpuid = val & GICH_LR_PHYSID_CPUID ;
60
+ cpuid >>= GICH_LR_PHYSID_CPUID_SHIFT ;
61
+
62
+ if (model == KVM_DEV_TYPE_ARM_VGIC_V3 ) {
66
63
intid = val & ICH_LR_VIRTUAL_ID_MASK ;
67
- else
64
+ } else {
68
65
intid = val & GICH_LR_VIRTUALID ;
66
+ is_v2_sgi = vgic_irq_is_sgi (intid );
67
+ }
69
68
70
69
/* Notify fds when the guest EOI'ed a level-triggered IRQ */
71
70
if (lr_signals_eoi_mi (val ) && vgic_valid_spi (vcpu -> kvm , intid ))
@@ -81,18 +80,16 @@ void vgic_v3_fold_lr_state(struct kvm_vcpu *vcpu)
81
80
/* Always preserve the active bit */
82
81
irq -> active = !!(val & ICH_LR_ACTIVE_BIT );
83
82
83
+ if (irq -> active && is_v2_sgi )
84
+ irq -> active_source = cpuid ;
85
+
84
86
/* Edge is the only case where we preserve the pending bit */
85
87
if (irq -> config == VGIC_CONFIG_EDGE &&
86
88
(val & ICH_LR_PENDING_BIT )) {
87
89
irq -> pending_latch = true;
88
90
89
- if (vgic_irq_is_sgi (intid ) &&
90
- model == KVM_DEV_TYPE_ARM_VGIC_V2 ) {
91
- u32 cpuid = val & GICH_LR_PHYSID_CPUID ;
92
-
93
- cpuid >>= GICH_LR_PHYSID_CPUID_SHIFT ;
91
+ if (is_v2_sgi )
94
92
irq -> source |= (1 << cpuid );
95
- }
96
93
}
97
94
98
95
/*
@@ -133,10 +130,20 @@ void vgic_v3_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr)
133
130
{
134
131
u32 model = vcpu -> kvm -> arch .vgic .vgic_model ;
135
132
u64 val = irq -> intid ;
136
- bool allow_pending = true;
133
+ bool allow_pending = true, is_v2_sgi ;
137
134
138
- if (irq -> active )
135
+ is_v2_sgi = (vgic_irq_is_sgi (irq -> intid ) &&
136
+ model == KVM_DEV_TYPE_ARM_VGIC_V2 );
137
+
138
+ if (irq -> active ) {
139
139
val |= ICH_LR_ACTIVE_BIT ;
140
+ if (is_v2_sgi )
141
+ val |= irq -> active_source << GICH_LR_PHYSID_CPUID_SHIFT ;
142
+ if (vgic_irq_is_multi_sgi (irq )) {
143
+ allow_pending = false;
144
+ val |= ICH_LR_EOI ;
145
+ }
146
+ }
140
147
141
148
if (irq -> hw ) {
142
149
val |= ICH_LR_HW ;
@@ -174,8 +181,10 @@ void vgic_v3_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr)
174
181
BUG_ON (!src );
175
182
val |= (src - 1 ) << GICH_LR_PHYSID_CPUID_SHIFT ;
176
183
irq -> source &= ~(1 << (src - 1 ));
177
- if (irq -> source )
184
+ if (irq -> source ) {
178
185
irq -> pending_latch = true;
186
+ val |= ICH_LR_EOI ;
187
+ }
179
188
}
180
189
}
181
190
0 commit comments