Ping? On Tue, 12 Jul 2022, 19:49 Jay Khandkar, <jaykhandkar2...@gmail.com> wrote:
> When the local APIC is in a software disabled state, all local interrupt > sources must be masked and all attempts to unmask them should be > ignored. Currently, we don't do either. Fix this by handling it > correctly in apic_mem_write(). > > Signed-off-by: Jay Khandkar <jaykhandkar2...@gmail.com> > --- > hw/intc/apic.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > diff --git a/hw/intc/apic.c b/hw/intc/apic.c > index 3df11c34d6..493c70af62 100644 > --- a/hw/intc/apic.c > +++ b/hw/intc/apic.c > @@ -792,9 +792,16 @@ static void apic_mem_write(void *opaque, hwaddr addr, > uint64_t val, > s->dest_mode = val >> 28; > break; > case 0x0f: > - s->spurious_vec = val & 0x1ff; > - apic_update_irq(s); > - break; > + { > + s->spurious_vec = val & 0x1ff; > + if (!(val & APIC_SPURIO_ENABLED)) { > + for (int i = 0; i < APIC_LVT_NB; i++) { > + s->lvt[i] |= APIC_LVT_MASKED; > + } > + } > + apic_update_irq(s); > + break; > + } > case 0x10 ... 0x17: > case 0x18 ... 0x1f: > case 0x20 ... 0x27: > @@ -812,6 +819,9 @@ static void apic_mem_write(void *opaque, hwaddr addr, > uint64_t val, > case 0x32 ... 0x37: > { > int n = index - 0x32; > + if (!(s->spurious_vec & APIC_SPURIO_ENABLED)) { > + val |= APIC_LVT_MASKED; > + } > s->lvt[n] = val; > if (n == APIC_LVT_TIMER) { > apic_timer_update(s, > qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); > -- > 2.37.0 > >