VirtualBox

Ignore:
Timestamp:
May 7, 2009 10:55:17 AM (16 years ago)
Author:
vboxsync
Message:

VMM: sending init IPI

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevAPIC.cpp

    r19468 r19475  
    363363                                                 getCpuFromLapic(dev, s));
    364364}
     365
    365366#ifdef IN_RING3
    366367DECLINLINE(void) cpuSendSipi(APICDeviceInfo* dev, APICState *s, int vector)
     
    371372                                 getCpuFromLapic(dev, s),
    372373                                 vector);
     374}
     375
     376DECLINLINE(void) cpuSendInitIpi(APICDeviceInfo* dev, APICState *s)
     377{
     378    Log2(("apic: send init IPI\n"));
     379
     380    dev->pApicHlpR3->pfnSendInitIpi(dev->pDevInsR3,
     381                                    getCpuFromLapic(dev, s));
    373382}
    374383#endif
     
    416425#endif /* !VBOX */
    417426
    418 static void apic_init_ipi(APICState *s);
     427static void apic_init_ipi(APICDeviceInfo* dev, APICState *s);
    419428static void apic_set_irq(APICDeviceInfo* dev, APICState *s, int vector_num, int trigger_mode);
    420429static bool apic_update_irq(APICDeviceInfo* dev, APICState *s);
     
    431440PDMBOTHCBDECL(void) apicSetTPR(PPDMDEVINS pDevIns, uint8_t val);
    432441PDMBOTHCBDECL(uint8_t) apicGetTPR(PPDMDEVINS pDevIns);
    433 PDMBOTHCBDECL(void) apicBusDeliverCallback(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode,
     442PDMBOTHCBDECL(int) apicBusDeliverCallback(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode,
    434443                                           uint8_t u8DeliveryMode, uint8_t iVector, uint8_t u8Polarity,
    435444                                           uint8_t u8TriggerMode);
     
    451460    APICState *apic_iter;
    452461#else /* VBOX */
    453 static void apic_bus_deliver(APICDeviceInfo* dev,
    454                              uint32_t deliver_bitmask, uint8_t delivery_mode,
    455                              uint8_t vector_num, uint8_t polarity,
    456                              uint8_t trigger_mode)
     462static int apic_bus_deliver(APICDeviceInfo* dev,
     463                            uint32_t deliver_bitmask, uint8_t delivery_mode,
     464                            uint8_t vector_num, uint8_t polarity,
     465                            uint8_t trigger_mode)
    457466{
    458467#endif /* VBOX */
     
    470479                apic_set_irq(dev, apic, vector_num, trigger_mode);
    471480            }
    472             return;
     481            return VINF_SUCCESS;
    473482        }
    474483        case APIC_DM_FIXED:
     
    480489            foreach_apic(dev, deliver_bitmask,
    481490                         cpuSetInterrupt(dev, apic));
    482             return;
     491            return VINF_SUCCESS;
    483492
    484493        case APIC_DM_NMI:
     
    486495            foreach_apic(dev, deliver_bitmask,
    487496                         cpuSetInterrupt(dev, apic));
    488             return;
     497            return VINF_SUCCESS;
    489498
    490499        case APIC_DM_INIT:
    491500            /* normal INIT IPI sent to processors */
    492501#ifdef VBOX
     502#ifdef IN_RING3
    493503            foreach_apic(dev, deliver_bitmask,
    494                          apic_init_ipi(apic));
     504                         apic_init_ipi(dev, apic));
     505            return VINF_SUCCESS;
     506#else
     507            /* We shall send init IPI only in R3, R0 calls should be
     508               rescheduled to R3 */
     509            return  VINF_IOM_HC_MMIO_READ_WRITE;
     510#endif /* IN_RING3 */
     511
    495512#else
    496513            for (apic_iter = first_local_apic; apic_iter != NULL;
     
    499516            }
    500517#endif
    501             return;
    502518
    503519        case APIC_DM_EXTINT:
     
    506522
    507523        default:
    508             return;
     524            return VINF_SUCCESS;
    509525    }
    510526
     
    512528    foreach_apic(dev, deliver_bitmask,
    513529                       apic_set_irq (dev, apic, vector_num, trigger_mode));
     530    return VINF_SUCCESS;
    514531#else  /* VBOX */
    515532    for (apic_iter = first_local_apic; apic_iter != NULL;
     
    672689{
    673690    APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    674     int rv = VINF_SUCCESS;
     691    int rc = VINF_SUCCESS;
    675692
    676693    if (dev->enmVersion < PDMAPICVERSION_X2APIC)
     
    718735            apic->icr[0] = (uint32_t)u64Value;
    719736            apic->icr[1] = (uint32_t)(u64Value >> 32);
    720             rv = apic_deliver(dev, apic, (apic->icr[1] >> 24) & 0xff, (apic->icr[0] >> 11) & 1,
     737            rc = apic_deliver(dev, apic, (apic->icr[1] >> 24) & 0xff, (apic->icr[0] >> 11) & 1,
    721738                             (apic->icr[0] >>  8) & 7, (apic->icr[0] & 0xff),
    722739                             (apic->icr[0] >> 14) & 1, (apic->icr[0] >> 15) & 1);
     
    750767            /* Self IPI, see x2APIC book 2.4.5 */
    751768            int vector = u64Value & 0xff;
    752             apic_bus_deliver(dev,
    753                              1 << getLapicById(dev, idCpu)->id /* Self */,
    754                              0 /* Delivery mode - fixed */,
    755                              vector,
    756                              0 /* Polarity - conform to the bus */,
    757                              0 /* Trigger mode - edge */);
     769            rc = apic_bus_deliver(dev,
     770                                  1 << getLapicById(dev, idCpu)->id /* Self */,
     771                                  0 /* Delivery mode - fixed */,
     772                                  vector,
     773                                  0 /* Polarity - conform to the bus */,
     774                                  0 /* Trigger mode - edge */);
    758775            break;
    759776        }
     
    764781    }
    765782
    766     return rv;
     783    return rc;
    767784}
    768785PDMBOTHCBDECL(int) apicReadMSR(PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t *pu64Value)
     
    854871 * for connecting the two devices.
    855872 */
    856 PDMBOTHCBDECL(void) apicBusDeliverCallback(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode,
     873PDMBOTHCBDECL(int) apicBusDeliverCallback(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode,
    857874                                           uint8_t u8DeliveryMode, uint8_t iVector, uint8_t u8Polarity,
    858875                                           uint8_t u8TriggerMode)
     
    861878    LogFlow(("apicBusDeliverCallback: pDevIns=%p u8Dest=%#x u8DestMode=%#x u8DeliveryMode=%#x iVector=%#x u8Polarity=%#x u8TriggerMode=%#x\n",
    862879             pDevIns, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode));
    863     apic_bus_deliver(dev, apic_get_delivery_bitmask(dev, u8Dest, u8DestMode),
    864                      u8DeliveryMode, iVector, u8Polarity, u8TriggerMode);
     880    return apic_bus_deliver(dev, apic_get_delivery_bitmask(dev, u8Dest, u8DestMode),
     881                            u8DeliveryMode, iVector, u8Polarity, u8TriggerMode);
    865882}
    866883
     
    10531070}
    10541071
    1055 static void apic_init_ipi(APICState *s)
     1072#ifdef IN_RING3
     1073static void apic_init_ipi(APICDeviceInfo* dev, APICState *s)
    10561074{
    10571075    int i;
     
    10751093
    10761094#ifdef VBOX
    1077     /** @todo reset CPU, activate wait for sipi mode for application processors */
    1078     /** Must be dealt with in ring 3 */
    1079 #endif
    1080 }
    1081 
    1082 #ifdef IN_RING3
     1095    cpuSendInitIpi(dev, s);
     1096#endif
     1097}
     1098
    10831099/* send a SIPI message to the CPU to start it */
    10841100static void apic_startup(APICDeviceInfo* dev, APICState *s, int vector_num)
     
    10981114#endif
    10991115}
    1100 #endif
     1116#endif /* IN_RING3 */
    11011117
    11021118static int  apic_deliver(APICDeviceInfo* dev, APICState *s,
     
    11421158                int level = (s->icr[0] >> 14) & 1;
    11431159                if (level == 0 && trig_mode == 1) {
    1144 #ifdef VBOX
    11451160                    foreach_apic(dev, deliver_bitmask,
    11461161                                       apic->arb_id = apic->id);
     1162#ifndef VBOX
     1163                    return;
     1164#else
    11471165                    return VINF_SUCCESS;
    1148 #else /* !VBOX */
    1149                     for (apic_iter = first_local_apic; apic_iter != NULL;
    1150                          apic_iter = apic_iter->next_apic) {
    1151                         if (deliver_bitmask & (1 << apic_iter->id)) {
    1152                             apic_iter->arb_id = apic_iter->id;
    1153                         }
    1154                     }
    1155                     return;
    1156 #endif /* !VBOX */
     1166#endif
    11571167                }
    11581168            }
     
    11711181#else
    11721182# ifdef IN_RING3
    1173            
    11741183            foreach_apic(dev, deliver_bitmask,
    11751184                         apic_startup(dev, apic, vector_num));
    11761185            return VINF_SUCCESS;
    11771186# else
    1178             /* We shall send SIPI only in R3, R0 calls should be 
     1187            /* We shall send SIPI only in R3, R0 calls should be
    11791188               rescheduled to R3 */
    11801189            return  VINF_IOM_HC_MMIO_WRITE;
     
    11871196                     trigger_mode);
    11881197#else /* VBOX */
    1189     apic_bus_deliver(dev, deliver_bitmask, delivery_mode, vector_num, polarity,
    1190                      trigger_mode);
    1191     return VINF_SUCCESS;
     1198    return apic_bus_deliver(dev, deliver_bitmask, delivery_mode, vector_num,
     1199                            polarity, trigger_mode);
    11921200#endif /* VBOX */
    11931201}
     
    14561464static int apic_mem_writel(APICDeviceInfo* dev, APICState *s, target_phys_addr_t addr, uint32_t val)
    14571465{
    1458     int rv = VINF_SUCCESS;
     1466    int rc = VINF_SUCCESS;
    14591467#endif /* VBOX */
    14601468    int index;
     
    15201528    case 0x30:
    15211529        s->icr[0] = val;
    1522         rv = apic_deliver(dev, s, (s->icr[1] >> 24) & 0xff,
     1530        rc = apic_deliver(dev, s, (s->icr[1] >> 24) & 0xff,
    15231531                          (s->icr[0] >> 11) & 1,
    15241532                          (s->icr[0] >> 8) & 7, (s->icr[0] & 0xff),
     
    15701578    }
    15711579#ifdef VBOX
    1572     return rv;
     1580    return rc;
    15731581#endif
    15741582}
     
    17831791                                 delivery_mode, vector, polarity, trig_mode);
    17841792#else /* VBOX */
    1785                 s->CTX_SUFF(pIoApicHlp)->pfnApicBusDeliver(s->CTX_SUFF(pDevIns),
     1793                int rc = s->CTX_SUFF(pIoApicHlp)->pfnApicBusDeliver(s->CTX_SUFF(pDevIns),
    17861794                                                           dest,
    17871795                                                           dest_mode,
     
    17901798                                                           polarity,
    17911799                                                           trig_mode);
     1800                /* We must be sure that attempts to reschedule in R3
     1801                   never get here */
     1802                Assert(rc == VINF_SUCCESS);
    17921803#endif /* VBOX */
    17931804            }
     
    21552166    TMTimerStop(s->CTX_SUFF(pTimer));
    21562167
    2157     apic_init_ipi(s);
     2168    apic_init_ipi(dev, s);
    21582169    /* malc, I've removed the initing duplicated in apic_init_ipi(). This
    21592170     * arb_id was left over.. */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette