Skip to content

Commit a8f6bdd

Browse files
Shuo A Liuwenlingz
authored andcommitted
hv: Add vlapic_has_pending_intr of apicv to check pending interrupts
Sometimes HV wants to know if there are pending interrupts of one vcpu. Add .has_pending_intr interface in acrn_apicv_ops and return the pending interrupts status by check IRRs of apicv. Tracked-On: #4329 Signed-off-by: Shuo A Liu <shuo.a.liu@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
1 parent e3c3033 commit a8f6bdd

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

hypervisor/arch/x86/guest/vlapic.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,6 +1755,11 @@ static bool ptapic_has_pending_delivery_intr(__unused struct acrn_vcpu *vcpu)
17551755
return false;
17561756
}
17571757

1758+
static bool ptapic_has_pending_intr(__unused struct acrn_vcpu *vcpu)
1759+
{
1760+
return false;
1761+
}
1762+
17581763
static bool ptapic_invalid(__unused uint32_t offset)
17591764
{
17601765
return false;
@@ -1764,6 +1769,7 @@ static const struct acrn_apicv_ops ptapic_ops = {
17641769
.accept_intr = ptapic_accept_intr,
17651770
.inject_intr = ptapic_inject_intr,
17661771
.has_pending_delivery_intr = ptapic_has_pending_delivery_intr,
1772+
.has_pending_intr = ptapic_has_pending_intr,
17671773
.apic_read_access_may_valid = ptapic_invalid,
17681774
.apic_write_access_may_valid = ptapic_invalid,
17691775
.x2apic_read_msr_may_valid = ptapic_invalid,
@@ -2390,6 +2396,27 @@ bool vlapic_has_pending_delivery_intr(struct acrn_vcpu *vcpu)
23902396
return vlapic->ops->has_pending_delivery_intr(vcpu);
23912397
}
23922398

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+
23932420
static bool apicv_basic_apic_read_access_may_valid(__unused uint32_t offset)
23942421
{
23952422
return true;
@@ -2603,6 +2630,7 @@ static const struct acrn_apicv_ops apicv_basic_ops = {
26032630
.accept_intr = apicv_basic_accept_intr,
26042631
.inject_intr = apicv_basic_inject_intr,
26052632
.has_pending_delivery_intr = apicv_basic_has_pending_delivery_intr,
2633+
.has_pending_intr = apicv_basic_has_pending_intr,
26062634
.apic_read_access_may_valid = apicv_basic_apic_read_access_may_valid,
26072635
.apic_write_access_may_valid = apicv_basic_apic_write_access_may_valid,
26082636
.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 = {
26132641
.accept_intr = apicv_advanced_accept_intr,
26142642
.inject_intr = apicv_advanced_inject_intr,
26152643
.has_pending_delivery_intr = apicv_advanced_has_pending_delivery_intr,
2644+
.has_pending_intr = apicv_advanced_has_pending_intr,
26162645
.apic_read_access_may_valid = apicv_advanced_apic_read_access_may_valid,
26172646
.apic_write_access_may_valid = apicv_advanced_apic_write_access_may_valid,
26182647
.x2apic_read_msr_may_valid = apicv_advanced_x2apic_read_msr_may_valid,

hypervisor/include/arch/x86/guest/vlapic.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ struct acrn_apicv_ops {
100100
void (*accept_intr)(struct acrn_vlapic *vlapic, uint32_t vector, bool level);
101101
bool (*inject_intr)(struct acrn_vlapic *vlapic, bool guest_irq_enabled, bool injected);
102102
bool (*has_pending_delivery_intr)(struct acrn_vcpu *vcpu);
103+
bool (*has_pending_intr)(struct acrn_vcpu *vcpu);
103104
bool (*apic_read_access_may_valid)(uint32_t offset);
104105
bool (*apic_write_access_may_valid)(uint32_t offset);
105106
bool (*x2apic_read_msr_may_valid)(uint32_t offset);
@@ -119,6 +120,7 @@ void vlapic_set_apicv_ops(void);
119120

120121
bool vlapic_inject_intr(struct acrn_vlapic *vlapic, bool guest_irq_enabled, bool injected);
121122
bool vlapic_has_pending_delivery_intr(struct acrn_vcpu *vcpu);
123+
bool vlapic_has_pending_intr(struct acrn_vcpu *vcpu);
122124

123125
/**
124126
* @brief Get physical address to PIR description.

0 commit comments

Comments
 (0)