@@ -1755,6 +1755,11 @@ static bool ptapic_has_pending_delivery_intr(__unused struct acrn_vcpu *vcpu)
1755
1755
return false;
1756
1756
}
1757
1757
1758
+ static bool ptapic_has_pending_intr (__unused struct acrn_vcpu * vcpu )
1759
+ {
1760
+ return false;
1761
+ }
1762
+
1758
1763
static bool ptapic_invalid (__unused uint32_t offset )
1759
1764
{
1760
1765
return false;
@@ -1764,6 +1769,7 @@ static const struct acrn_apicv_ops ptapic_ops = {
1764
1769
.accept_intr = ptapic_accept_intr ,
1765
1770
.inject_intr = ptapic_inject_intr ,
1766
1771
.has_pending_delivery_intr = ptapic_has_pending_delivery_intr ,
1772
+ .has_pending_intr = ptapic_has_pending_intr ,
1767
1773
.apic_read_access_may_valid = ptapic_invalid ,
1768
1774
.apic_write_access_may_valid = ptapic_invalid ,
1769
1775
.x2apic_read_msr_may_valid = ptapic_invalid ,
@@ -2390,6 +2396,27 @@ bool vlapic_has_pending_delivery_intr(struct acrn_vcpu *vcpu)
2390
2396
return vlapic -> ops -> has_pending_delivery_intr (vcpu );
2391
2397
}
2392
2398
2399
+ static bool apicv_basic_has_pending_intr (struct acrn_vcpu * vcpu )
2400
+ {
2401
+ struct acrn_vlapic * vlapic = vcpu_vlapic (vcpu );
2402
+ uint32_t vector ;
2403
+
2404
+ vector = vlapic_find_highest_irr (vlapic );
2405
+
2406
+ return vector != 0UL ;
2407
+ }
2408
+
2409
+ static bool apicv_advanced_has_pending_intr (struct acrn_vcpu * vcpu )
2410
+ {
2411
+ return apicv_basic_has_pending_intr (vcpu );
2412
+ }
2413
+
2414
+ bool vlapic_has_pending_intr (struct acrn_vcpu * vcpu )
2415
+ {
2416
+ struct acrn_vlapic * vlapic = vcpu_vlapic (vcpu );
2417
+ return vlapic -> ops -> has_pending_intr (vcpu );
2418
+ }
2419
+
2393
2420
static bool apicv_basic_apic_read_access_may_valid (__unused uint32_t offset )
2394
2421
{
2395
2422
return true;
@@ -2603,6 +2630,7 @@ static const struct acrn_apicv_ops apicv_basic_ops = {
2603
2630
.accept_intr = apicv_basic_accept_intr ,
2604
2631
.inject_intr = apicv_basic_inject_intr ,
2605
2632
.has_pending_delivery_intr = apicv_basic_has_pending_delivery_intr ,
2633
+ .has_pending_intr = apicv_basic_has_pending_intr ,
2606
2634
.apic_read_access_may_valid = apicv_basic_apic_read_access_may_valid ,
2607
2635
.apic_write_access_may_valid = apicv_basic_apic_write_access_may_valid ,
2608
2636
.x2apic_read_msr_may_valid = apicv_basic_x2apic_read_msr_may_valid ,
@@ -2613,6 +2641,7 @@ static const struct acrn_apicv_ops apicv_advanced_ops = {
2613
2641
.accept_intr = apicv_advanced_accept_intr ,
2614
2642
.inject_intr = apicv_advanced_inject_intr ,
2615
2643
.has_pending_delivery_intr = apicv_advanced_has_pending_delivery_intr ,
2644
+ .has_pending_intr = apicv_advanced_has_pending_intr ,
2616
2645
.apic_read_access_may_valid = apicv_advanced_apic_read_access_may_valid ,
2617
2646
.apic_write_access_may_valid = apicv_advanced_apic_write_access_may_valid ,
2618
2647
.x2apic_read_msr_may_valid = apicv_advanced_x2apic_read_msr_may_valid ,
0 commit comments