VirtualBox

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


Ignore:
Timestamp:
Nov 26, 2010 8:34:43 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
68197
Message:

BIOS: report MCFG region via E820, if present

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/BIOS/rombios.c

    r33656 r34426  
    46454645}
    46464646
     4647Bit32u readBiosVar(varNum)
     4648    Bit16u varNum;
     4649{
     4650    int iPort = 0x402;
     4651    Bit32u result = 0;
     4652
     4653    outw(iPort, varNum);
     4654    result = (inb(iPort) << 24) | (inb(iPort) <<  16) |
     4655             (inb(iPort) << 8) | (inb(iPort) << 0);
     4656    BX_INFO("var %d is %x\n", varNum, result);
     4657    return result;
     4658}
     4659
    46474660  void
    46484661int15_function32(regs, ES, DS, FLAGS)
     
    46544667  Bit16u  CX,DX;
    46554668  Bit8u   extra_highbits_memory_size=0;
     4669  Bit32u  mcfgStart, mcfgSize;
    46564670
    46574671BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax);
     
    47464760                extra_highbits_memory_size = inb_cmos(0x5d);
    47474761#endif /* !VBOX */
     4762
     4763                mcfgStart = readBiosVar(1);
     4764                mcfgSize  = readBiosVar(2);
    47484765
    47494766                switch(regs.u.r16.bx)
     
    48124829                        set_e820_range(ES, regs.u.r16.di,
    48134830                                       0xfffc0000L, 0x00000000L, 0, 0, 2);
    4814                         /* Temporary disabled MCFG code */
    4815 #if 0
    4816                         regs.u.r32.ebx = 6;
     4831                        if (mcfgStart > 0)
     4832                            regs.u.r32.ebx = 6;
     4833                        else
     4834                        {
     4835                            if (extra_highbits_memory_size || extra_lowbits_memory_size)
     4836                                regs.u.r32.ebx = 7;
     4837                            else
     4838                                regs.u.r32.ebx = 0;
     4839                        }
    48174840                        break;
    48184841                     case 6:
    4819                         /* PCI MMIO config space */
     4842                        /* PCI MMIO config space (MCFG) */
    48204843                        set_e820_range(ES, regs.u.r16.di,
    4821                                        0xd0000000L, 0xe0000000L, 0, 0, 2);
     4844                                       mcfgStart, mcfgSize, 0, 0, 2);
     4845
    48224846                        if (extra_highbits_memory_size || extra_lowbits_memory_size)
    48234847                            regs.u.r32.ebx = 7;
     
    48264850                        break;
    48274851                    case 7:
    4828 #else
    4829                         if (extra_highbits_memory_size || extra_lowbits_memory_size)
    4830                             regs.u.r32.ebx = 6;
    4831                         else
    4832                             regs.u.r32.ebx = 0;
    4833                         break;
    4834                     case 6:
    4835 #endif
    48364852#ifdef VBOX /* Don't succeeded if no memory above 4 GB.  */
    48374853                        /* Mapping of memory above 4 GB if present.
  • trunk/src/VBox/Devices/PC/DevPcBios.cpp

    r34317 r34426  
    178178    /** Number of logical CPUs in guest */
    179179    uint16_t        cCpus;
     180    uint32_t        u32McfgBase;
     181    uint32_t        cbMcfgLength;
     182    uint16_t        iVarNum;
     183    uint16_t        iVarPos;
    180184} DEVPCBIOS, *PDEVPCBIOS;
    181185
     
    232236    Assert(u32Val < 256);
    233237
    234 #if 1
    235238    int rc = PDMDevHlpCMOSWrite(pDevIns, off, u32Val);
    236239    AssertRC(rc);
    237 #else
    238     PVM pVM = PDMDevHlpGetVM(pDevIns);
    239     IOMIOPortWrite(pVM, 0x70, off, 1);
    240     IOMIOPortWrite(pVM, 0x71, u32Val, 1);
    241     IOMIOPortWrite(pVM, 0x70, 0, 1);
    242 #endif
    243240}
    244241
     
    641638}
    642639
     640static uint8_t pcbiosReadVar(PDEVPCBIOS pThis)
     641{
     642    uint32_t u32Val = 0, u32Size = 4;
     643    switch (pThis->iVarNum)
     644    {
     645        case 1:
     646            u32Val = pThis->u32McfgBase;
     647            u32Size = 4;
     648            break;
     649        case 2:
     650            u32Val = pThis->cbMcfgLength;
     651            u32Size = 4;
     652            break;
     653        default:
     654            AssertMsgFailed(("Unknown variable: %d\n", pThis->iVarNum));
     655    }
     656    uint32_t iPos = pThis->iVarPos++;
     657    if (pThis->iVarPos >= u32Size)
     658            pThis->iVarPos = 0;
     659
     660    Log(("Read pos %d of var %d: %x\n",
     661         iPos, pThis->iVarNum, (u32Val >> (iPos*8)) & 0xff));
     662
     663    return (u32Val >> (iPos*8)) & 0xff;
     664}
    643665
    644666/**
     
    655677static DECLCALLBACK(int) pcbiosIOPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
    656678{
    657     NOREF(pDevIns);
    658     NOREF(pvUser);
    659     NOREF(Port);
    660     NOREF(pu32);
    661     NOREF(cb);
     679    if (cb == 1 && Port == 0x402)
     680    {
     681        PDEVPCBIOS pThis = PDMINS_2_DATA(pDevIns, PDEVPCBIOS);
     682        uint8_t u8Val = pcbiosReadVar(pThis);
     683        *(uint8_t*)pu32 = u8Val;
     684        return VINF_SUCCESS;
     685    }
     686
    662687    return VERR_IOM_IOPORT_UNUSED;
    663688}
     
    725750            pThis->szMsg[++pThis->iMsg] = '\0';
    726751        }
     752        return VINF_SUCCESS;
     753    }
     754
     755    if (cb == 2 && Port == 0x402)
     756    {
     757        PDEVPCBIOS pThis = PDMINS_2_DATA(pDevIns, PDEVPCBIOS);
     758        pThis->iVarNum = u32;
     759        pThis->iVarPos = 0;
    727760        return VINF_SUCCESS;
    728761    }
     
    941974                              "IOAPIC\0"
    942975                              "NumCPUs\0"
     976                              "McfgBase\0"
     977                              "McfgLength\0"
    943978                              "DmiBIOSVendor\0"
    944979                              "DmiBIOSVersion\0"
     
    9861021        return PDMDEV_SET_ERROR(pDevIns, rc,
    9871022                                N_("Configuration error: Querying \"NumCPUs\" as integer failed"));
     1023
     1024    rc = CFGMR3QueryU32Def(pCfg, "McfgBase", &pThis->u32McfgBase, 0);
     1025    if (RT_FAILURE(rc))
     1026        return PDMDEV_SET_ERROR(pDevIns, rc,
     1027                                N_("Configuration error: Querying \"\" as integer failed"));
     1028    rc = CFGMR3QueryU32Def(pCfg, "McfgLength", &pThis->cbMcfgLength, 0);
     1029    if (RT_FAILURE(rc))
     1030        return PDMDEV_SET_ERROR(pDevIns, rc,
     1031                                N_("Configuration error: Querying \"McfgLength\" as integer failed"));
     1032
    9881033
    9891034    LogRel(("[SMP] BIOS with %u CPUs\n", pThis->cCpus));
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