mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-19 20:22:46 +00:00
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>
This commit is contained in:
parent
e3c303363b
commit
a8f6bdd479
@ -1755,6 +1755,11 @@ static bool ptapic_has_pending_delivery_intr(__unused struct acrn_vcpu *vcpu)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool ptapic_has_pending_intr(__unused struct acrn_vcpu *vcpu)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool ptapic_invalid(__unused uint32_t offset)
|
||||
{
|
||||
return false;
|
||||
@ -1764,6 +1769,7 @@ static const struct acrn_apicv_ops ptapic_ops = {
|
||||
.accept_intr = ptapic_accept_intr,
|
||||
.inject_intr = ptapic_inject_intr,
|
||||
.has_pending_delivery_intr = ptapic_has_pending_delivery_intr,
|
||||
.has_pending_intr = ptapic_has_pending_intr,
|
||||
.apic_read_access_may_valid = ptapic_invalid,
|
||||
.apic_write_access_may_valid = ptapic_invalid,
|
||||
.x2apic_read_msr_may_valid = ptapic_invalid,
|
||||
@ -2390,6 +2396,27 @@ bool vlapic_has_pending_delivery_intr(struct acrn_vcpu *vcpu)
|
||||
return vlapic->ops->has_pending_delivery_intr(vcpu);
|
||||
}
|
||||
|
||||
static bool apicv_basic_has_pending_intr(struct acrn_vcpu *vcpu)
|
||||
{
|
||||
struct acrn_vlapic *vlapic = vcpu_vlapic(vcpu);
|
||||
uint32_t vector;
|
||||
|
||||
vector = vlapic_find_highest_irr(vlapic);
|
||||
|
||||
return vector != 0UL;
|
||||
}
|
||||
|
||||
static bool apicv_advanced_has_pending_intr(struct acrn_vcpu *vcpu)
|
||||
{
|
||||
return apicv_basic_has_pending_intr(vcpu);
|
||||
}
|
||||
|
||||
bool vlapic_has_pending_intr(struct acrn_vcpu *vcpu)
|
||||
{
|
||||
struct acrn_vlapic *vlapic = vcpu_vlapic(vcpu);
|
||||
return vlapic->ops->has_pending_intr(vcpu);
|
||||
}
|
||||
|
||||
static bool apicv_basic_apic_read_access_may_valid(__unused uint32_t offset)
|
||||
{
|
||||
return true;
|
||||
@ -2603,6 +2630,7 @@ static const struct acrn_apicv_ops apicv_basic_ops = {
|
||||
.accept_intr = apicv_basic_accept_intr,
|
||||
.inject_intr = apicv_basic_inject_intr,
|
||||
.has_pending_delivery_intr = apicv_basic_has_pending_delivery_intr,
|
||||
.has_pending_intr = apicv_basic_has_pending_intr,
|
||||
.apic_read_access_may_valid = apicv_basic_apic_read_access_may_valid,
|
||||
.apic_write_access_may_valid = apicv_basic_apic_write_access_may_valid,
|
||||
.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 = {
|
||||
.accept_intr = apicv_advanced_accept_intr,
|
||||
.inject_intr = apicv_advanced_inject_intr,
|
||||
.has_pending_delivery_intr = apicv_advanced_has_pending_delivery_intr,
|
||||
.has_pending_intr = apicv_advanced_has_pending_intr,
|
||||
.apic_read_access_may_valid = apicv_advanced_apic_read_access_may_valid,
|
||||
.apic_write_access_may_valid = apicv_advanced_apic_write_access_may_valid,
|
||||
.x2apic_read_msr_may_valid = apicv_advanced_x2apic_read_msr_may_valid,
|
||||
|
@ -100,6 +100,7 @@ struct acrn_apicv_ops {
|
||||
void (*accept_intr)(struct acrn_vlapic *vlapic, uint32_t vector, bool level);
|
||||
bool (*inject_intr)(struct acrn_vlapic *vlapic, bool guest_irq_enabled, bool injected);
|
||||
bool (*has_pending_delivery_intr)(struct acrn_vcpu *vcpu);
|
||||
bool (*has_pending_intr)(struct acrn_vcpu *vcpu);
|
||||
bool (*apic_read_access_may_valid)(uint32_t offset);
|
||||
bool (*apic_write_access_may_valid)(uint32_t offset);
|
||||
bool (*x2apic_read_msr_may_valid)(uint32_t offset);
|
||||
@ -119,6 +120,7 @@ void vlapic_set_apicv_ops(void);
|
||||
|
||||
bool vlapic_inject_intr(struct acrn_vlapic *vlapic, bool guest_irq_enabled, bool injected);
|
||||
bool vlapic_has_pending_delivery_intr(struct acrn_vcpu *vcpu);
|
||||
bool vlapic_has_pending_intr(struct acrn_vcpu *vcpu);
|
||||
|
||||
/**
|
||||
* @brief Get physical address to PIR description.
|
||||
|
Loading…
Reference in New Issue
Block a user