On Wed, Sep 07, 2022 at 11:14:11PM +0530, Jay Khandkar 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 <jaykhandkar2002@gmail.com>
> ---
> hw/intc/apic.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/hw/intc/apic.c b/hw/intc/apic.c
> index 3df11c34d6..be26b5c913 100644
> --- a/hw/intc/apic.c
> +++ b/hw/intc/apic.c
> @@ -793,6 +793,11 @@ static void apic_mem_write(void *opaque, hwaddr addr, uint64_t val,
> break;
> case 0x0f:
> 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:
> @@ -812,6 +817,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.3
>
Ping...?