VirtualBox

Changeset 102517 in vbox


Ignore:
Timestamp:
Dec 7, 2023 10:28:20 AM (12 months ago)
Author:
vboxsync
Message:

Main/ConsoleImplConfigArmV8.cpp: Get rid of most hardcoded addresses and introduce a (very barebones right now) resource manager for managing the address map and interrupt assignments, most of the MMIO regions are now moved to the top of the address space. Only exception is the flash device holding the firmware and the MMIO region for PCI MEM32 BARs, bugref:10528

Location:
trunk/src/VBox/Main
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/Makefile.kmk

    r101556 r102517  
    11761176        src-client/MouseImpl.cpp \
    11771177        src-client/RemoteUSBDeviceImpl.cpp \
     1178        $(if $(VBOX_WITH_VIRT_ARMV8),src-client/ResourceAssignmentManager.cpp,) \
    11781179        $(if $(VBOX_WITH_VIRT_ARMV8),src-client/ResourceStoreImpl.cpp,) \
    11791180        src-client/SessionImpl.cpp \
  • trunk/src/VBox/Main/src-client/ConsoleImplConfigArmV8.cpp

    r101622 r102517  
    6767
    6868#include "BusAssignmentManager.h"
     69#include "ResourceAssignmentManager.h"
    6970#ifdef VBOX_WITH_EXTPACK
    7071# include "ExtPackManagerImpl.h"
     
    9091 *                      to leave it in order to avoid deadlocks (ext packs and
    9192 *                      more).
    92  *
    93  * @todo This is a big hack at the moment and provides a static VM config to work with, will be adjusted later
    94  *       on to adhere to the VM config when sorting out the API bits.
    9593 */
    9694int Console::i_configConstructorArmV8(PUVM pUVM, PVM pVM, PCVMMR3VTABLE pVMM, AutoWriteLock *pAlock)
     
    178176
    179177    BusAssignmentManager *pBusMgr = mBusMgr = BusAssignmentManager::createInstance(pVMM, chipsetType, IommuType_None);
     178    ResourceAssignmentManager *pResMgr = ResourceAssignmentManager::createInstance(pVMM, chipsetType, IommuType_None,
     179                                                                                   GCPhysTopOfAddrSpace - sizeof(VBOXPLATFORMARMV8),
     180                                                                                   _1G,             /*GCPhysRam*/
     181                                                                                   128 * _1M,       /*GCPhysMmio32Start*/
     182                                                                                   _1G - 128 * _1M, /*cbMmio32*/
     183                                                                                   32               /*cInterrupts*/);
    180184
    181185    /*
     
    185189    PCFGMNODE pRoot = pVMM->pfnCFGMR3GetRootU(pUVM);
    186190    Assert(pRoot);
     191
     192    RTGCPHYS GCPhysRam = NIL_RTGCPHYS;
    187193
    188194    // catching throws from InsertConfigString and friends.
     
    271277        InsertConfigNode(pMM, "MemRegions", &pMem);
    272278
     279        hrc = pResMgr->assignRamRegion("Conventional", cbRam, &GCPhysRam);                  H();
     280
    273281        PCFGMNODE pMemRegion = NULL;
    274282        InsertConfigNode(pMem, "Conventional", &pMemRegion);
    275         InsertConfigInteger(pMemRegion, "GCPhysStart", 0x40000000);
     283        InsertConfigInteger(pMemRegion, "GCPhysStart", GCPhysRam);
    276284        InsertConfigInteger(pMemRegion, "Size", cbRam);
    277285
    278         vrc = RTFdtNodeAddF(hFdt, "memory@%RX32", 0x40000000);                              VRC();
    279         vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, 0x40000000, cbRam);              VRC();
     286        vrc = RTFdtNodeAddF(hFdt, "memory@%RGp", GCPhysRam);                                VRC();
     287        vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, GCPhysRam, cbRam);               VRC();
    280288        vrc = RTFdtNodePropertyAddString(  hFdt, "device_type",      "memory");             VRC();
    281289        vrc = RTFdtNodeFinalize(hFdt);                                                      VRC();
     
    386394         * Configure the interrupt controller.
    387395         */
     396        RTGCPHYS GCPhysIntcDist;
     397        RTGCPHYS GCPhysIntcReDist;
     398        RTGCPHYS cbMmioIntcDist;
     399        RTGCPHYS cbMmioIntcReDist;
     400
     401        /* Each vCPU needs on re-distributor, this would allow for up to 256 vCPUs in the future. */
     402        hrc = pResMgr->assignMmioRegion("gic", 256 * _64K, &GCPhysIntcReDist, &cbMmioIntcReDist);       H();
     403        hrc = pResMgr->assignMmioRegion("gic", _64K, &GCPhysIntcDist, &cbMmioIntcDist);                 H();
     404
    388405        InsertConfigNode(pDevices, "gic",                   &pDev);
    389406        InsertConfigNode(pDev,     "0",                     &pInst);
    390407        InsertConfigInteger(pInst, "Trusted",               1);
    391408        InsertConfigNode(pInst,    "Config",                &pCfg);
    392         InsertConfigInteger(pCfg,  "DistributorMmioBase",   0x08000000);
    393         InsertConfigInteger(pCfg,  "RedistributorMmioBase", 0x080a0000);
    394 
    395         vrc = RTFdtNodeAddF(hFdt, "intc@%RX32", 0x08000000);                                VRC();
    396         vrc = RTFdtNodePropertyAddU32(     hFdt, "phandle",          idPHandleIntCtrl);     VRC();
     409        InsertConfigInteger(pCfg,  "DistributorMmioBase",   GCPhysIntcDist);
     410        InsertConfigInteger(pCfg,  "RedistributorMmioBase", GCPhysIntcReDist);
     411
     412        vrc = RTFdtNodeAddF(hFdt, "intc@%RGp", GCPhysIntcDist);                                         VRC();
     413        vrc = RTFdtNodePropertyAddU32(     hFdt, "phandle",          idPHandleIntCtrl);                 VRC();
    397414        vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 4,
    398                                            0x08000000, 0x10000,   /* Distributor */
    399                                            0x080a0000, 0xf60000); /* Re-Distributor */      VRC();
    400         vrc = RTFdtNodePropertyAddU32(     hFdt, "#redistributor-regions", 1);              VRC();
    401         vrc = RTFdtNodePropertyAddString(  hFdt, "compatible",       "arm,gic-v3");         VRC();
    402         vrc = RTFdtNodePropertyAddEmpty(   hFdt, "ranges");                                 VRC();
    403         vrc = RTFdtNodePropertyAddU32(     hFdt, "#size-cells",      2);                    VRC();
    404         vrc = RTFdtNodePropertyAddU32(     hFdt, "#address-cells",   2);                    VRC();
    405         vrc = RTFdtNodePropertyAddEmpty(   hFdt, "interrupt-controller");                   VRC();
    406         vrc = RTFdtNodePropertyAddU32(     hFdt, "#interrupt-cells", 3);                    VRC();
     415                                           GCPhysIntcDist, cbMmioIntcDist,      /* Distributor */
     416                                           GCPhysIntcReDist, cbMmioIntcReDist); /* Re-Distributor */    VRC();
     417        vrc = RTFdtNodePropertyAddU32(     hFdt, "#redistributor-regions", 1);                          VRC();
     418        vrc = RTFdtNodePropertyAddString(  hFdt, "compatible",       "arm,gic-v3");                     VRC();
     419        vrc = RTFdtNodePropertyAddEmpty(   hFdt, "ranges");                                             VRC();
     420        vrc = RTFdtNodePropertyAddU32(     hFdt, "#size-cells",      2);                                VRC();
     421        vrc = RTFdtNodePropertyAddU32(     hFdt, "#address-cells",   2);                                VRC();
     422        vrc = RTFdtNodePropertyAddEmpty(   hFdt, "interrupt-controller");                               VRC();
     423        vrc = RTFdtNodePropertyAddU32(     hFdt, "#interrupt-cells", 3);                                VRC();
    407424
    408425#if 0
     
    418435        vrc = RTFdtNodeFinalize(hFdt);                                                      VRC();
    419436
     437        RTGCPHYS GCPhysMmioStart;
     438        RTGCPHYS cbMmio;
    420439        if (enmGraphicsController == GraphicsControllerType_QemuRamFB)
    421440        {
     441            hrc = pResMgr->assignMmioRegion("qemu-fw-cfg", _4K, &GCPhysMmioStart, &cbMmio); H();
     442
    422443            InsertConfigNode(pDevices, "qemu-fw-cfg",   &pDev);
    423444            InsertConfigNode(pDev,     "0",            &pInst);
    424445            InsertConfigNode(pInst,    "Config",        &pCfg);
    425             InsertConfigInteger(pCfg,  "MmioSize",       4096);
    426             InsertConfigInteger(pCfg,  "MmioBase", 0x09020000);
     446            InsertConfigInteger(pCfg,  "MmioSize",       cbMmio);
     447            InsertConfigInteger(pCfg,  "MmioBase", GCPhysMmioStart);
    427448            InsertConfigInteger(pCfg,  "DmaEnabled",        1);
    428449            InsertConfigInteger(pCfg,  "QemuRamfbSupport",  1);
     
    430451            InsertConfigString(pLunL0, "Driver",          "MainDisplay");
    431452
    432             vrc = RTFdtNodeAddF(hFdt, "fw-cfg@%RX32", 0x09020000);                          VRC();
     453            vrc = RTFdtNodeAddF(hFdt, "fw-cfg@%RGp", GCPhysMmioStart);                      VRC();
    433454            vrc = RTFdtNodePropertyAddEmpty(   hFdt, "dma-coherent");                       VRC();
    434             vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, 0x09020000, 0x18);           VRC();
     455            vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, GCPhysMmioStart, cbMmio);    VRC();
    435456            vrc = RTFdtNodePropertyAddString(  hFdt, "compatible", "qemu,fw-cfg-mmio");     VRC();
    436457            vrc = RTFdtNodeFinalize(hFdt);                                                  VRC();
     
    475496            InsertConfigNode(pInst, "Config", &pCfg);
    476497
    477             InsertConfigInteger(pCfg,  "Irq",               1);
    478             InsertConfigInteger(pCfg,  "MmioBase", 0x09000000);
    479 
    480             vrc = RTFdtNodeAddF(hFdt, "pl011@%RX32", 0x09000000);                               VRC();
    481             vrc = RTFdtNodePropertyAddStringList(hFdt, "clock-names", 2, "uartclk", "apb_pclk"); VRC();
     498            uint32_t iIrq = 0;
     499            hrc = pResMgr->assignSingleInterrupt("arm-pl011", &iIrq);                               H();
     500            hrc = pResMgr->assignMmioRegion("arm-pl011", _4K, &GCPhysMmioStart, &cbMmio);           H();
     501
     502            InsertConfigInteger(pCfg,  "Irq",      iIrq);
     503            InsertConfigInteger(pCfg,  "MmioBase", GCPhysMmioStart);
     504
     505            vrc = RTFdtNodeAddF(hFdt, "pl011@%RGp", GCPhysMmioStart);                               VRC();
     506            vrc = RTFdtNodePropertyAddStringList(hFdt, "clock-names", 2, "uartclk", "apb_pclk");    VRC();
    482507            vrc = RTFdtNodePropertyAddCellsU32(hFdt, "clocks", 2,
    483                                                idPHandleAbpPClk, idPHandleAbpPClk);             VRC();
    484             vrc = RTFdtNodePropertyAddCellsU32(hFdt, "interrupts", 3, 0x00, 0x01, 0x04);        VRC();
    485             vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, 0x09000000, _4K);                VRC();
     508                                               idPHandleAbpPClk, idPHandleAbpPClk);                 VRC();
     509            vrc = RTFdtNodePropertyAddCellsU32(hFdt, "interrupts", 3, 0x00, iIrq, 0x04);            VRC();
     510            vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, GCPhysMmioStart, cbMmio);            VRC();
    486511            vrc = RTFdtNodePropertyAddStringList(hFdt, "compatible", 2,
    487                                                  "arm,pl011", "arm,primecell");                 VRC();
    488             vrc = RTFdtNodeFinalize(hFdt);                                                      VRC();
     512                                                 "arm,pl011", "arm,primecell");                     VRC();
     513            vrc = RTFdtNodeFinalize(hFdt);                                                          VRC();
    489514
    490515            BOOL  fServer;
     
    507532        hrc = platform->COMGETTER(RTCUseUTC)(&fRTCUseUTC);                                  H();
    508533
     534        uint32_t iIrq = 0;
     535        hrc = pResMgr->assignSingleInterrupt("arm-pl031-rtc", &iIrq);                       H();
     536        hrc = pResMgr->assignMmioRegion("arm-pl031-rtc", _4K, &GCPhysMmioStart, &cbMmio);   H();
    509537        InsertConfigNode(pDevices, "arm-pl031-rtc", &pDev);
    510538        InsertConfigNode(pDev,     "0",            &pInst);
    511539        InsertConfigNode(pInst,    "Config",        &pCfg);
    512         InsertConfigInteger(pCfg,  "Irq",               2);
    513         InsertConfigInteger(pCfg,  "MmioBase", 0x09010000);
     540        InsertConfigInteger(pCfg,  "Irq",            iIrq);
     541        InsertConfigInteger(pCfg,  "MmioBase", GCPhysMmioStart);
    514542        InsertConfigInteger(pCfg,  "UtcOffset", fRTCUseUTC ? 1 : 0);
    515543
    516         vrc = RTFdtNodeAddF(hFdt, "pl032@%RX32", 0x09010000);                               VRC();
     544        vrc = RTFdtNodeAddF(hFdt, "pl032@%RGp", GCPhysMmioStart);                           VRC();
    517545        vrc = RTFdtNodePropertyAddString(  hFdt, "clock-names", "apb_pclk");                VRC();
    518546        vrc = RTFdtNodePropertyAddU32(     hFdt, "clocks", idPHandleAbpPClk);               VRC();
    519         vrc = RTFdtNodePropertyAddCellsU32(hFdt, "interrupts", 3, 0x00, 0x02, 0x04);        VRC();
    520         vrc = RTFdtNodePropertyAddCellsU32(hFdt, "reg", 4, 0, 0x09010000, 0, 0x1000);       VRC();
     547        vrc = RTFdtNodePropertyAddCellsU32(hFdt, "interrupts", 3, 0x00, iIrq, 0x04);        VRC();
     548        vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, GCPhysMmioStart, cbMmio);        VRC();
    521549        vrc = RTFdtNodePropertyAddStringList(hFdt, "compatible", 2,
    522550                                             "arm,pl031", "arm,primecell");                 VRC();
     
    524552
    525553        /* Configure gpio keys. */
     554        hrc = pResMgr->assignSingleInterrupt("arm-pl061-gpio", &iIrq);                      H();
     555        hrc = pResMgr->assignMmioRegion("arm-pl061-gpio", _4K, &GCPhysMmioStart, &cbMmio);  H();
    526556        InsertConfigNode(pDevices, "arm-pl061-gpio",&pDev);
    527557        InsertConfigNode(pDev,     "0",            &pInst);
    528558        InsertConfigNode(pInst,    "Config",        &pCfg);
    529         InsertConfigInteger(pCfg,  "Irq",               7);
    530         InsertConfigInteger(pCfg,  "MmioBase", 0x09030000);
    531         vrc = RTFdtNodeAddF(hFdt, "pl061@%RX32", 0x09030000);                               VRC();
     559        InsertConfigInteger(pCfg,  "Irq",            iIrq);
     560        InsertConfigInteger(pCfg,  "MmioBase", GCPhysMmioStart);
     561        vrc = RTFdtNodeAddF(hFdt, "pl061@%RGp", GCPhysMmioStart);                           VRC();
    532562        vrc = RTFdtNodePropertyAddU32(     hFdt, "phandle", idPHandleGpio);                 VRC();
    533563        vrc = RTFdtNodePropertyAddString(  hFdt, "clock-names", "apb_pclk");                VRC();
    534564        vrc = RTFdtNodePropertyAddU32(     hFdt, "clocks", idPHandleAbpPClk);               VRC();
    535         vrc = RTFdtNodePropertyAddCellsU32(hFdt, "interrupts", 3, 0x00, 0x07, 0x04);        VRC();
     565        vrc = RTFdtNodePropertyAddCellsU32(hFdt, "interrupts", 3, 0x00, iIrq, 0x04);        VRC();
    536566        vrc = RTFdtNodePropertyAddEmpty(   hFdt, "gpio-controller");                        VRC();
    537567        vrc = RTFdtNodePropertyAddU32(     hFdt, "#gpio-cells", 2);                         VRC();
    538568        vrc = RTFdtNodePropertyAddStringList(hFdt, "compatible", 2,
    539569                                             "arm,pl061", "arm,primecell");                 VRC();
    540         vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, 0x09030000, _4K);                VRC();
     570        vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, GCPhysMmioStart, cbMmio);        VRC();
    541571        vrc = RTFdtNodeFinalize(hFdt);                                                      VRC();
    542572
     
    564594        vrc = RTFdtNodeFinalize(hFdt);                                                      VRC();
    565595
    566         uint32_t aPinIrqs[] = { 3, 4, 5, 6 };
     596        hrc = pResMgr->assignInterrupts("pci-generic-ecam", 4 /*cInterrupts*/, &iIrq);      H();
     597        uint32_t aPinIrqs[] = { iIrq, iIrq + 1, iIrq + 2, iIrq + 3 };
     598        RTGCPHYS GCPhysPciMmioEcam, GCPhysPciMmio, GCPhysPciMmio32;
     599        RTGCPHYS cbPciMmioEcam, cbPciMmio, cbPciMmio32;
     600        hrc = pResMgr->assignMmioRegionAligned("pci-pio",    _64K, _64K,         &GCPhysMmioStart,   &cbMmio);         H();
     601        hrc = pResMgr->assignMmioRegion(       "pci-ecam",   16 * _1M,           &GCPhysPciMmioEcam, &cbPciMmioEcam);  H();
     602        hrc = pResMgr->assignMmioRegion(       "pci-mmio",   _2G,                &GCPhysPciMmio,     &cbPciMmio);      H();
     603        hrc = pResMgr->assignMmio32Region(     "pci-mmio32", (1024 - 128) * _1M, &GCPhysPciMmio32,   &cbPciMmio32);    H();
     604
    567605        InsertConfigNode(pDevices, "pci-generic-ecam",  &pDev);
    568606        InsertConfigNode(pDev,     "0",            &pInst);
    569607        InsertConfigNode(pInst,    "Config",        &pCfg);
    570         InsertConfigInteger(pCfg,  "MmioEcamBase",   0x3f000000);
    571         InsertConfigInteger(pCfg,  "MmioEcamLength", 0x01000000);
    572         InsertConfigInteger(pCfg,  "MmioPioBase",    0x3eff0000);
    573         InsertConfigInteger(pCfg,  "MmioPioSize",    0x0000ffff);
     608        InsertConfigInteger(pCfg,  "MmioEcamBase",   GCPhysPciMmioEcam);
     609        InsertConfigInteger(pCfg,  "MmioEcamLength", cbPciMmioEcam);
     610        InsertConfigInteger(pCfg,  "MmioPioBase",    GCPhysMmioStart);
     611        InsertConfigInteger(pCfg,  "MmioPioSize",    cbMmio);
    574612        InsertConfigInteger(pCfg,  "IntPinA",        aPinIrqs[0]);
    575613        InsertConfigInteger(pCfg,  "IntPinB",        aPinIrqs[1]);
    576614        InsertConfigInteger(pCfg,  "IntPinC",        aPinIrqs[2]);
    577615        InsertConfigInteger(pCfg,  "IntPinD",        aPinIrqs[3]);
    578         vrc = RTFdtNodeAddF(hFdt, "pcie@%RX32", 0x10000000);                                VRC();
     616        vrc = RTFdtNodeAddF(hFdt, "pcie@%RGp", GCPhysPciMmio);                              VRC();
    579617        vrc = RTFdtNodePropertyAddCellsU32(hFdt, "interrupt-map-mask", 4, 0xf800, 0, 0, 7); VRC();
    580618
     
    604642
    605643        vrc = RTFdtNodePropertyAddCellsU32AsArray(hFdt, "interrupt-map", RT_ELEMENTS(aIrqCells), &aIrqCells[0]);
    606         vrc = RTFdtNodePropertyAddU32(     hFdt, "#interrupt-cells", 1);                    VRC();
    607         vrc = RTFdtNodePropertyAddCellsU32(hFdt, "ranges", 14,
    608                                            0x1000000, 0, 0, 0, 0x3eff0000, 0, 0x10000,
    609                                            0x2000000, 0, 0x10000000, 0, 0x10000000, 0,
    610                                            0x2eff0000);                                     VRC();
    611         vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, 0x3f000000, 0x1000000);          VRC();
     644        vrc = RTFdtNodePropertyAddU32(     hFdt, "#interrupt-cells", 1);                        VRC();
     645        vrc = RTFdtNodePropertyAddCellsU32(hFdt, "ranges", 21,
     646                                           0x1000000, 0, 0,
     647                                           GCPhysMmioStart >> 32, GCPhysMmioStart, cbMmio >> 32, cbMmio,
     648                                           0x2000000, GCPhysPciMmio32 >> 32, GCPhysPciMmio32, GCPhysPciMmio32 >> 32, GCPhysPciMmio32,
     649                                           cbPciMmio32 >> 32, cbPciMmio32,
     650                                           0x3000000, GCPhysPciMmio >> 32, GCPhysPciMmio, GCPhysPciMmio >> 32, GCPhysPciMmio,
     651                                           cbPciMmio >> 32, cbPciMmio);                         VRC();
     652        vrc = RTFdtNodePropertyAddCellsU64(hFdt, "reg", 2, GCPhysPciMmioEcam, cbPciMmioEcam);   VRC();
    612653        /** @todo msi-map */
    613         vrc = RTFdtNodePropertyAddEmpty(   hFdt, "dma-coherent");                           VRC();
    614         vrc = RTFdtNodePropertyAddCellsU32(hFdt, "bus-range", 2, 0, 0xf);                   VRC();
    615         vrc = RTFdtNodePropertyAddU32(     hFdt, "linux,pci-domain", 0);                    VRC();
    616         vrc = RTFdtNodePropertyAddU32(     hFdt, "#size-cells", 2);                         VRC();
    617         vrc = RTFdtNodePropertyAddU32(     hFdt, "#address-cells", 3);                      VRC();
    618         vrc = RTFdtNodePropertyAddString(  hFdt, "device_type", "pci");                     VRC();
    619         vrc = RTFdtNodePropertyAddString(  hFdt, "compatible", "pci-host-ecam-generic");    VRC();
    620         vrc = RTFdtNodeFinalize(hFdt);                                                      VRC();
     654        vrc = RTFdtNodePropertyAddEmpty(   hFdt, "dma-coherent");                               VRC();
     655        vrc = RTFdtNodePropertyAddCellsU32(hFdt, "bus-range", 2, 0, 0xf);                       VRC();
     656        vrc = RTFdtNodePropertyAddU32(     hFdt, "linux,pci-domain", 0);                        VRC();
     657        vrc = RTFdtNodePropertyAddU32(     hFdt, "#size-cells", 2);                             VRC();
     658        vrc = RTFdtNodePropertyAddU32(     hFdt, "#address-cells", 3);                          VRC();
     659        vrc = RTFdtNodePropertyAddString(  hFdt, "device_type", "pci");                         VRC();
     660        vrc = RTFdtNodePropertyAddString(  hFdt, "compatible", "pci-host-ecam-generic");        VRC();
     661        vrc = RTFdtNodeFinalize(hFdt);                                                          VRC();
    621662
    622663        /*
     
    725766    AssertRCReturn(vrc, vrc);
    726767
     768    RTGCPHYS GCPhysMmioStart;
     769    RTGCPHYS cbMmio;
     770    hrc = pResMgr->queryMmioRegion(&GCPhysMmioStart, &cbMmio);
     771    Assert(SUCCEEDED(hrc));
     772
     773    RTGCPHYS GCPhysMmio32Start;
     774    RTGCPHYS cbMmio32;
     775    hrc = pResMgr->queryMmio32Region(&GCPhysMmio32Start, &cbMmio32);
     776    Assert(SUCCEEDED(hrc));
     777
    727778    ArmV8Platform.u32Magic            = VBOXPLATFORMARMV8_MAGIC;
    728779    ArmV8Platform.u32Version          = VBOXPLATFORMARMV8_VERSION;
    729780    ArmV8Platform.cbDesc              = sizeof(ArmV8Platform);
    730781    ArmV8Platform.fFlags              = 0;
    731     ArmV8Platform.u64PhysAddrRamBase  = UINT64_C(0x40000000);
     782    ArmV8Platform.u64PhysAddrRamBase  = GCPhysRam;
    732783    ArmV8Platform.cbRamBase           = cbRam;
    733784    ArmV8Platform.u64OffBackFdt       = RT_ALIGN_64(ArmV8Platform.cbFdt, _64K);
     
    737788    ArmV8Platform.u64OffBackUefiRom   = GCPhysTopOfAddrSpace - sizeof(ArmV8Platform);
    738789    ArmV8Platform.cbUefiRom           = _64M; /** @todo Fixed reservation but the ROM region is usually much smaller. */
    739     ArmV8Platform.u64OffBackMmio      = GCPhysTopOfAddrSpace - sizeof(ArmV8Platform) - 0x08000000; /** @todo Start of generic MMIO area containing the GIC,UART,RTC, etc. Will be changed soon */
    740     ArmV8Platform.cbMmio              = _128M;
     790    ArmV8Platform.u64OffBackMmio      = GCPhysTopOfAddrSpace - sizeof(ArmV8Platform) - GCPhysMmioStart;
     791    ArmV8Platform.cbMmio              = cbMmio;
     792    ArmV8Platform.u64OffBackMmio32    = GCPhysTopOfAddrSpace - sizeof(ArmV8Platform) - GCPhysMmio32Start;
     793    ArmV8Platform.cbMmio32            = cbMmio32;
    741794
    742795    /* Add the VBox platform descriptor to the resource store. */
     
    758811    }
    759812
     813    delete pResMgr; /* Delete the address/interrupt assignment manager. */
    760814
    761815    /*
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