VirtualBox

Opened 15 years ago

Closed 14 years ago

#2573 closed defect (fixed)

Local APIC timer dies

Reported by: Vladimir Owned by:
Component: other Version: VirtualBox 2.0.4
Keywords: Cc:
Guest type: other Host type: other

Description (last modified by Frank Mehnert)

An APIC timer is initialized as periodic:

// lapic_base: u32_t *lapic_base;

    // Disable timer first
    lapic_base[APIC_DWREG_LVT_TMR]      = APIC_TIMER_VECTOR |
                                          APIC_LVT_D_STAT_IDLE |
                                          APIC_LVT_TMR_PERIODIC |
                                          APIC_LVT_TRIGGER_LEVEL |
                                          APIC_LVT_MASK;
    // Write counters
    lapic_base[APIC_DWREG_TMR_DIVIDE]   = div;
    lapic_base[APIC_DWREG_TMR_INIT]     = counter;

    // Enable if it is enabled in configruation
    if (enabled)
        lapic_base[APIC_DWREG_LVT_TMR]  = APIC_TIMER_VECTOR |
                                          APIC_LVT_D_STAT_IDLE |
                                          APIC_LVT_TRIGGER_LEVEL |
                                          APIC_LVT_TMR_PERIODIC;

Timer interrupt is ok (a counter in a handler is periodically incremented). Then a system is sending INIT IPI:

lapic_base[APIC_DWREG_ICR0] = APIC_ICR0_DST_ALL_NO_SELF |
                              APIC_ICR0_D_MODE_INIT;

And whoops... A timer dies. And no timer re-initialization helps.

Change History (4)

comment:1 by Frank Mehnert, 15 years ago

Description: modified (diff)

comment:2 by Vladimir, 15 years ago

Defined constants:

#define APIC_DWREG_LVT_TMR          0x00c8  /* LVT Timer Register                   */

#define APIC_ICR0_D_MODE_INIT       0x00000500  /* Delivery mode: INIT                  */
#define APIC_ICR0_DST_ALL_NO_SELF   0x000c0000  /* Destination: All excluding self      */

// LVT Register flags
#define APIC_LVT_D_STAT_IDLE        0x00000000  /* Delivery status: Idle                */
#define APIC_LVT_TRIGGER_LEVEL      0x00008000  /* Trigger Mode: Level                  */
#define APIC_LVT_MASK               0x00010000  /* Interrupt Mask                       */
#define APIC_LVT_TMR_PERIODIC       0x00020000  /* Timer: Periodic                      */

A constant APIC_LVT_TRIGGER_LEVEL takes no effect (if it is used or not) and is described in timer's LVT entry as reserved. So you can ignore it.

comment:3 by Sander van Leeuwen, 15 years ago

Thanks for the detailed reported. We'll have a look at it next week.

comment:4 by Frank Mehnert, 14 years ago

Resolution: fixed
Status: newclosed

Please reopen if still reproducible with VBox 3.1.6.

Note: See TracTickets for help on using tickets.

© 2023 Oracle
ContactPrivacy policyTerms of Use