hpet: guard IRQ handling with BQL
Commit [1] made qemu fail with abort:
xen_evtchn_set_gsi: Assertion `bql_locked()' failed.
when running ./tests/functional/x86_64/test_kvm_xen.py tests.
To fix it make sure that BQL is held when manipulating IRQs.
Fixes: 7defb58baf (hpet: switch to fine-grained device locking)
Reported-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Link: https://lore.kernel.org/r/20250910142506.86274-1-imammedo@redhat.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
7c83e50156
commit
d99041a203
1 changed files with 8 additions and 0 deletions
|
|
@ -40,6 +40,7 @@
|
|||
#include "qom/object.h"
|
||||
#include "qemu/lockable.h"
|
||||
#include "qemu/seqlock.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "trace.h"
|
||||
|
||||
struct hpet_fw_config hpet_fw_cfg = {.count = UINT8_MAX};
|
||||
|
|
@ -222,12 +223,15 @@ static void update_irq(struct HPETTimer *timer, int set)
|
|||
timer->fsb & 0xffffffff, MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
} else if (timer->config & HPET_TN_TYPE_LEVEL) {
|
||||
BQL_LOCK_GUARD();
|
||||
qemu_irq_raise(s->irqs[route]);
|
||||
} else {
|
||||
BQL_LOCK_GUARD();
|
||||
qemu_irq_pulse(s->irqs[route]);
|
||||
}
|
||||
} else {
|
||||
if (!timer_fsb_route(timer)) {
|
||||
BQL_LOCK_GUARD();
|
||||
qemu_irq_lower(s->irqs[route]);
|
||||
}
|
||||
}
|
||||
|
|
@ -534,10 +538,12 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
|
|||
/* i8254 and RTC output pins are disabled
|
||||
* when HPET is in legacy mode */
|
||||
if (activating_bit(old_val, new_val, HPET_CFG_LEGACY)) {
|
||||
BQL_LOCK_GUARD();
|
||||
qemu_set_irq(s->pit_enabled, 0);
|
||||
qemu_irq_lower(s->irqs[0]);
|
||||
qemu_irq_lower(s->irqs[RTC_ISA_IRQ]);
|
||||
} else if (deactivating_bit(old_val, new_val, HPET_CFG_LEGACY)) {
|
||||
BQL_LOCK_GUARD();
|
||||
qemu_irq_lower(s->irqs[0]);
|
||||
qemu_set_irq(s->pit_enabled, 1);
|
||||
qemu_set_irq(s->irqs[RTC_ISA_IRQ], s->rtc_irq_level);
|
||||
|
|
@ -683,11 +689,13 @@ static void hpet_handle_legacy_irq(void *opaque, int n, int level)
|
|||
|
||||
if (n == HPET_LEGACY_PIT_INT) {
|
||||
if (!hpet_in_legacy_mode(s)) {
|
||||
BQL_LOCK_GUARD();
|
||||
qemu_set_irq(s->irqs[0], level);
|
||||
}
|
||||
} else {
|
||||
s->rtc_irq_level = level;
|
||||
if (!hpet_in_legacy_mode(s)) {
|
||||
BQL_LOCK_GUARD();
|
||||
qemu_set_irq(s->irqs[RTC_ISA_IRQ], level);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue