VirtualBox

Changeset 40956 in vbox


Ignore:
Timestamp:
Apr 16, 2012 10:58:48 PM (12 years ago)
Author:
vboxsync
Message:

PDM,APIC,IO-APIC: More IRQ tagging.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/pdmdev.h

    r40937 r40956  
    12991299
    13001300    /**
     1301     * Calculates an IRQ tag for a timer, IPI or similar event.
     1302     * 
     1303     * @returns The IRQ tag.
     1304     * @param   pDevIns         Device instance of the APIC.
     1305     * @param   u8Level         PDM_IRQ_LEVEL_HIGH or PDM_IRQ_LEVEL_FLIP_FLOP.
     1306     */
     1307    DECLRCCALLBACKMEMBER(uint32_t, pfnCalcIrqTag,(PPDMDEVINS pDevIns, uint8_t u8Level));
     1308
     1309    /**
    13011310     * Modifies APIC-related bits in the CPUID feature mask.
    13021311     *
     
    13391348
    13401349/** Current PDMAPICHLPRC version number. */
    1341 #define PDM_APICHLPRC_VERSION                   PDM_VERSION_MAKE(0xfff5, 1, 0)
     1350#define PDM_APICHLPRC_VERSION                   PDM_VERSION_MAKE(0xfff5, 2, 0)
    13421351
    13431352
     
    13671376     */
    13681377    DECLR0CALLBACKMEMBER(void, pfnClearInterruptFF,(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu));
     1378
     1379    /**
     1380     * Calculates an IRQ tag for a timer, IPI or similar event.
     1381     * 
     1382     * @returns The IRQ tag.
     1383     * @param   pDevIns         Device instance of the APIC.
     1384     * @param   u8Level         PDM_IRQ_LEVEL_HIGH or PDM_IRQ_LEVEL_FLIP_FLOP.
     1385     */
     1386    DECLR0CALLBACKMEMBER(uint32_t, pfnCalcIrqTag,(PPDMDEVINS pDevIns, uint8_t u8Level));
    13691387
    13701388    /**
     
    14091427
    14101428/** Current PDMAPICHLPR0 version number. */
    1411 #define PDM_APICHLPR0_VERSION                   PDM_VERSION_MAKE(0xfff4, 1, 0)
     1429#define PDM_APICHLPR0_VERSION                   PDM_VERSION_MAKE(0xfff4, 2, 0)
    14121430
    14131431/**
     
    14381456
    14391457    /**
    1440      * Calculates an IRQ tag for a timer event.
     1458     * Calculates an IRQ tag for a timer, IPI or similar event.
    14411459     * 
    14421460     * @returns The IRQ tag.
    1443      * @param   pDevIns         Device instance of the APIC.
    1444      */
    1445     DECLR3CALLBACKMEMBER(uint32_t, pfnCalcIrqTag,(PPDMDEVINS pDevIns));
     1461     * @param   pDevIns         Device instance of the APIC.
     1462     * @param   u8Level         PDM_IRQ_LEVEL_HIGH or PDM_IRQ_LEVEL_FLIP_FLOP.
     1463     */
     1464    DECLR3CALLBACKMEMBER(uint32_t, pfnCalcIrqTag,(PPDMDEVINS pDevIns, uint8_t u8Level));
    14461465
    14471466    /**
  • trunk/src/VBox/Devices/PC/DevAPIC.cpp

    r40937 r40956  
    836836                                      0 /* Polarity - conform to the bus */,
    837837                                      0 /* Trigger mode - edge */,
    838                                       0 /*uTagSrc*/);
     838                                      pDev->CTX_SUFF(pApicHlp)->pfnCalcIrqTag(pDev->CTX_SUFF(pDevIns), PDM_IRQ_LEVEL_HIGH));
    839839                APIC_UNLOCK(pDev);
    840840                break;
     
    14331433
    14341434    return apic_bus_deliver(pDev, &DstSet, delivery_mode, vector_num,
    1435                             polarity, trigger_mode, 0 /* uTagSrc*/);
     1435                            polarity, trigger_mode,
     1436                            pDev->CTX_SUFF(pApicHlp)->pfnCalcIrqTag(pDev->CTX_SUFF(pDevIns), PDM_IRQ_LEVEL_HIGH));
    14361437}
    14371438
     
    17001701        LogFlow(("apic_timer: trigger irq\n"));
    17011702        apic_set_irq(pDev, pApic, pApic->lvt[APIC_LVT_TIMER] & 0xff, APIC_TRIGGER_EDGE,
    1702                      pDev->CTX_SUFF(pApicHlp)->pfnCalcIrqTag(pDevIns));
     1703                     pDev->CTX_SUFF(pApicHlp)->pfnCalcIrqTag(pDevIns, PDM_IRQ_LEVEL_HIGH));
    17031704
    17041705        if (   (pApic->lvt[APIC_LVT_TIMER] & APIC_LVT_TIMER_PERIODIC)
  • trunk/src/VBox/Devices/PC/DevApic.h

    r37481 r40956  
    55
    66/*
    7  * Copyright (C) 2006-2011 Oracle Corporation
     7 * Copyright (C) 2006-2012 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
  • trunk/src/VBox/Devices/PC/DevIoApic.cpp

    r40944 r40956  
    149149                delivery_mode = (entry >> 8) & 7;
    150150                polarity = (entry >> 13) & 1;
     151                uint32_t uTagSrc = pThis->auTagSrc[i];
    151152                if (trig_mode == APIC_TRIGGER_EDGE)
     153                {
     154                    pThis->auTagSrc[i] = 0;
    152155                    pThis->irr &= ~mask;
     156                }
    153157                if (delivery_mode == APIC_DM_EXTINT)
    154158                    /* malc: i'm still not so sure about ExtINT delivery */
     
    159163                else
    160164                    vector = entry & 0xff;
    161                 uint32_t uTagSrc = pThis->auTagSrc[i];
    162                 pThis->auTagSrc[i] = 0;
    163165
    164166                int rc = pThis->CTX_SUFF(pIoApicHlp)->pfnApicBusDeliver(pThis->CTX_SUFF(pDevIns),
     
    202204
    203205                if ((level & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP)
     206                {
    204207                    pThis->irr &= ~mask;
     208                    pThis->auTagSrc[vector] = 0;
     209                }
    205210            }
    206211            else
     212            {
    207213                pThis->irr &= ~mask;
     214                pThis->auTagSrc[vector] = 0;
     215            }
    208216        }
    209217        else
     
    526534    pThis->irr      = 0;
    527535    for (unsigned i = 0; i < IOAPIC_NUM_PINS; i++)
     536    {
    528537        pThis->ioredtbl[i] = 1 << 16; /* mask LVT */
     538        pThis->auTagSrc[i] = 0;
     539    }
    529540
    530541    IOAPIC_UNLOCK(pThis);
  • trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp

    r40907 r40956  
    527527
    528528
     529/** @interface_method_impl{PDMAPICHLPR0,pfnCalcIrqTag} */
     530static DECLCALLBACK(uint32_t) pdmR0ApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level)
     531{
     532    PDMDEV_ASSERT_DEVINS(pDevIns);
     533    PVM pVM = pDevIns->Internal.s.pVMR0;
     534
     535    pdmLock(pVM);
     536
     537    uint32_t uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
     538    if (u8Level == PDM_IRQ_LEVEL_HIGH)
     539        VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     540    else
     541        VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     542
     543
     544    pdmUnlock(pVM);
     545    LogFlow(("pdmR0ApicHlp_CalcIrqTag: caller=%p/%d: returns %#x (u8Level=%d)\n",
     546             pDevIns, pDevIns->iInstance, uTagSrc, u8Level));
     547    return uTagSrc;
     548}
     549
     550
    529551/** @interface_method_impl{PDMAPICHLPR0,pfnChangeFeature} */
    530552static DECLCALLBACK(void) pdmR0ApicHlp_ChangeFeature(PPDMDEVINS pDevIns, PDMAPICVERSION enmVersion)
     
    584606    pdmR0ApicHlp_SetInterruptFF,
    585607    pdmR0ApicHlp_ClearInterruptFF,
     608    pdmR0ApicHlp_CalcIrqTag,
    586609    pdmR0ApicHlp_ChangeFeature,
    587610    pdmR0ApicHlp_Lock,
  • trunk/src/VBox/VMM/VMMR3/PDMDevMiscHlp.cpp

    r40937 r40956  
    240240
    241241/** @interface_method_impl{PDMAPICHLPR3,pfnCalcIrqTag} */
    242 static DECLCALLBACK(uint32_t) pdmR3ApicHlp_CalcIrqTag(PPDMDEVINS pDevIns)
    243 {
    244     PDMDEV_ASSERT_DEVINS(pDevIns);
    245     PVM pVM = pDevIns->Internal.s.pVMR3;
     242static DECLCALLBACK(uint32_t) pdmR3ApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level)
     243{
     244    PDMDEV_ASSERT_DEVINS(pDevIns);
     245    PVM pVM = pDevIns->Internal.s.pVMR3;
     246    Assert(u8Level == PDM_IRQ_LEVEL_HIGH || u8Level == PDM_IRQ_LEVEL_FLIP_FLOP);
    246247
    247248    pdmLock(pVM);
     249
    248250    uint32_t uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
     251    if (u8Level == PDM_IRQ_LEVEL_HIGH)
     252        VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     253    else
     254        VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     255
     256
    249257    pdmUnlock(pVM);
    250 
    251     LogFlow(("pdmR3ApicHlp_CalcIrqTag: caller='%s'/%d: returns %#x\n", pDevIns->pReg->szName, pDevIns->iInstance, uTagSrc));
     258    LogFlow(("pdmR3ApicHlp_CalcIrqTag: caller='%s'/%d: returns %#x (u8Level=%d)\n",
     259             pDevIns->pReg->szName, pDevIns->iInstance, uTagSrc, u8Level));
    252260    return uTagSrc;
    253261}
  • trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp

    r40907 r40956  
    492492
    493493
     494/** @interface_method_impl{PDMAPICHLPRC,pfnCalcIrqTag} */
     495static DECLCALLBACK(uint32_t) pdmRCApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level)
     496{
     497    PDMDEV_ASSERT_DEVINS(pDevIns);
     498    PVM pVM = pDevIns->Internal.s.pVMRC;
     499
     500    pdmLock(pVM);
     501
     502    uint32_t uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
     503    if (u8Level == PDM_IRQ_LEVEL_HIGH)
     504        VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     505    else
     506        VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     507
     508
     509    pdmUnlock(pVM);
     510    LogFlow(("pdmRCApicHlp_CalcIrqTag: caller=%p/%d: returns %#x (u8Level=%d)\n",
     511             pDevIns, pDevIns->iInstance, uTagSrc, u8Level));
     512    return uTagSrc;
     513}
     514
     515
    494516/** @interface_method_impl{PDMAPICHLPRC,pfnChangeFeature} */
    495517static DECLCALLBACK(void) pdmRCApicHlp_ChangeFeature(PPDMDEVINS pDevIns, PDMAPICVERSION enmVersion)
     
    549571    pdmRCApicHlp_SetInterruptFF,
    550572    pdmRCApicHlp_ClearInterruptFF,
     573    pdmRCApicHlp_CalcIrqTag,
    551574    pdmRCApicHlp_ChangeFeature,
    552575    pdmRCApicHlp_Lock,
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