VirtualBox

Changeset 44626 in vbox for trunk/src/VBox/Devices/PC


Ignore:
Timestamp:
Feb 11, 2013 10:52:19 AM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
83713
Message:

DevAPIC.cpp,++: Changed the APIC MMIO registrations to let IOM handle the weird access work. Some cleanups elsewhere.

Location:
trunk/src/VBox/Devices/PC
Files:
2 edited

Legend:

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

    r44514 r44626  
    17201720    R(PM1a_EVT_OFFSET,   1, acpiR3PM1aStsWrite,      acpiR3Pm1aStsRead,     "ACPI PM1a Status");
    17211721    R(PM1a_CTL_OFFSET,   1, acpiR3PM1aCtlWrite,      acpiR3Pm1aCtlRead,     "ACPI PM1a Control");
    1722     R(PM_TMR_OFFSET,     1, NULL,                  acpiPMTmrRead,       "ACPI PM Timer");
     1722    R(PM_TMR_OFFSET,     1, NULL,                    acpiPMTmrRead,         "ACPI PM Timer");
    17231723    R(GPE0_OFFSET + L,   L, acpiR3Gpe0EnWrite,       acpiR3Gpe0EnRead,      "ACPI GPE0 Enable");
    17241724    R(GPE0_OFFSET,       L, acpiR3Gpe0StsWrite,      acpiR3Gpe0StsRead,     "ACPI GPE0 Status");
  • trunk/src/VBox/Devices/PC/DevAPIC.cpp

    r44515 r44626  
    18121812    APICState *pApic = apicGetStateByCurEmt(pDev);
    18131813
    1814     Log(("CPU%d: apicMMIORead at %llx\n", pApic->phys_id,  (uint64_t)GCPhysAddr));
     1814    Log(("CPU%d: apicMMIORead at %RGp\n", pApic->phys_id, GCPhysAddr));
     1815    Assert(cb == 4);
    18151816
    18161817    /** @todo add LAPIC range validity checks (different LAPICs can
     
    18181819
    18191820    STAM_COUNTER_INC(&CTXSUFF(pDev->StatMMIORead));
    1820     switch (cb)
    1821     {
    1822         case 1:
    1823             /** @todo this is not how recent APIC behave!  We will fix
    1824              *        this via the IOM. */
    1825             *(uint8_t *)pv = 0;
    1826             break;
    1827 
    1828         case 2:
    1829             /** @todo this is not how recent APIC behave! */
    1830             *(uint16_t *)pv = 0;
    1831             break;
    1832 
    1833         case 4:
    1834         {
    18351821#if 0 /* Note! experimental */
    18361822#ifndef IN_RING3
    1837             uint32_t index = (GCPhysAddr >> 4) & 0xff;
    1838 
    1839             if (    index == 0x08 /* TPR */
    1840                 &&  ++pApic->cTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS)
    1841             {
    1842 #ifdef IN_RC
    1843                 pDevIns->pDevHlpGC->pfnPATMSetMMIOPatchInfo(pDevIns, GCPhysAddr, &pApic->tpr);
    1844 #else
    1845                 RTGCPTR pDevInsGC = PDMINS2DATA_GCPTR(pDevIns);
    1846                 pDevIns->pHlpR0->pfnPATMSetMMIOPatchInfo(pDevIns, GCPhysAddr, pDevIns + RT_OFFSETOF(APICState, tpr));
    1847 #endif
    1848                 return VINF_PATM_HC_MMIO_PATCH_READ;
    1849             }
     1823    uint32_t index = (GCPhysAddr >> 4) & 0xff;
     1824
     1825    if (    index == 0x08 /* TPR */
     1826        &&  ++pApic->cTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS)
     1827    {
     1828# ifdef IN_RC
     1829        pDevIns->pDevHlpGC->pfnPATMSetMMIOPatchInfo(pDevIns, GCPhysAddr, &pApic->tpr);
     1830# else
     1831        RTGCPTR pDevInsGC = PDMINS2DATA_GCPTR(pDevIns);
     1832        pDevIns->pHlpR0->pfnPATMSetMMIOPatchInfo(pDevIns, GCPhysAddr, pDevIns + RT_OFFSETOF(APICState, tpr));
     1833# endif
     1834        return VINF_PATM_HC_MMIO_PATCH_READ;
     1835    }
    18501836#endif
    18511837#endif /* experimental */
    18521838
    1853             /* It does its own locking. */
    1854             uint64_t u64Value = 0;
    1855             int rc = apicReadRegister(pDev, pApic, (GCPhysAddr >> 4) & 0xff, &u64Value,
    1856                                       VINF_IOM_R3_MMIO_READ, false /*fMsr*/);
    1857             *(uint32_t *)pv = (uint32_t)u64Value;
    1858             return rc;
    1859         }
    1860 
    1861         default:
    1862             AssertReleaseMsgFailed(("cb=%d\n", cb)); /* for now we assume simple accesses. */
    1863             return VERR_INTERNAL_ERROR;
    1864     }
    1865     return VINF_SUCCESS;
     1839    /* Note! apicReadRegister does its own locking. */
     1840    uint64_t u64Value = 0;
     1841    int rc = apicReadRegister(pDev, pApic, (GCPhysAddr >> 4) & 0xff, &u64Value, VINF_IOM_R3_MMIO_READ, false /*fMsr*/);
     1842    *(uint32_t *)pv = (uint32_t)u64Value;
     1843    return rc;
    18661844}
    18671845
     
    18711849    APICState *pApic = apicGetStateByCurEmt(pDev);
    18721850
    1873     Log(("CPU%d: apicMMIOWrite at %llx\n", pApic->phys_id, (uint64_t)GCPhysAddr));
     1851    Log(("CPU%d: apicMMIOWrite at %RGp\n", pApic->phys_id, GCPhysAddr));
     1852    Assert(cb == 4);
    18741853
    18751854    /** @todo: add LAPIC range validity checks (multiple LAPICs can theoretically have
     
    18771856
    18781857    STAM_COUNTER_INC(&CTXSUFF(pDev->StatMMIOWrite));
    1879     switch (cb)
    1880     {
    1881         case 1:
    1882         case 2:
    1883             /* ignore */
    1884             break;
    1885 
    1886         case 4:
    1887             /* It does its own locking. */
    1888             return apicWriteRegister(pDev, pApic, (GCPhysAddr >> 4) & 0xff, *(uint32_t const *)pv,
    1889                                      VINF_IOM_R3_MMIO_WRITE, false /*fMsr*/);
    1890 
    1891         default:
    1892             AssertReleaseMsgFailed(("cb=%d\n", cb)); /* for now we assume simple accesses. */
    1893             return VERR_INTERNAL_ERROR;
    1894     }
    1895     return VINF_SUCCESS;
     1858    /* Note! It does its own locking. */
     1859    return apicWriteRegister(pDev, pApic, (GCPhysAddr >> 4) & 0xff, *(uint32_t const *)pv,
     1860                             VINF_IOM_R3_MMIO_WRITE, false /*fMsr*/);
    18961861}
    18971862
     
    23812346    uint32_t ApicBase = pDev->paLapicsR3[0].apicbase & ~0xfff;
    23822347    rc = PDMDevHlpMMIORegister(pDevIns, ApicBase, 0x1000, pDev,
    2383                                IOMMMIO_FLAGS_READ_PASSTHRU | IOMMMIO_FLAGS_WRITE_PASSTHRU,
     2348                               IOMMMIO_FLAGS_READ_DWORD | IOMMMIO_FLAGS_WRITE_ONLY_DWORD,
    23842349                               apicMMIOWrite, apicMMIORead, "APIC Memory");
    23852350    if (RT_FAILURE(rc))
Note: See TracChangeset for help on using the changeset viewer.

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