VirtualBox

Changeset 43712 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Oct 23, 2012 2:02:24 PM (12 years ago)
Author:
vboxsync
Message:

BIOS/EFI: fixed broken DMI information

Location:
trunk/src/VBox/Devices
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/EFI/DevEFI.cpp

    r41284 r43712  
    9696    uint64_t        cbAbove4GB;
    9797
    98     uint64_t cbRam;
    99 
    100     uint64_t cbRamHole;
    101 
     98    uint64_t        cbRam;
     99
     100    uint64_t        cbRamHole;
     101
     102    /** The size of the DMI tables */
     103    uint16_t        cbDmiTables;
    102104    /** The DMI tables. */
    103105    uint8_t         au8DMIPage[0x1000];
     
    113115
    114116    /* Device properties buffer */
    115     uint8_t*           pu8DeviceProps;
     117    uint8_t*        pu8DeviceProps;
    116118    /* Device properties buffer size */
    117     uint32_t           u32DevicePropsLen;
     119    uint32_t        u32DevicePropsLen;
    118120
    119121    /* Virtual machine front side bus frequency */
     
    474476     * Plan some structures in RAM.
    475477     */
    476     FwCommonPlantSmbiosAndDmiHdrs(pDevIns);
     478    FwCommonPlantSmbiosAndDmiHdrs(pDevIns, pThis->cbDmiTables);
    477479    if (pThis->u8IOAPIC)
    478480        FwCommonPlantMpsFloatPtr(pDevIns);
     
    10181020                              "UUID\0"
    10191021                              "IOAPIC\0"
    1020                               "DmiBIOSVendor\0"
    1021                               "DmiBIOSVersion\0"
     1022                              "DmiBIOSFirmwareMajor\0"
     1023                              "DmiBIOSFirmwareMinor\0"
    10221024                              "DmiBIOSReleaseDate\0"
    10231025                              "DmiBIOSReleaseMajor\0"
    10241026                              "DmiBIOSReleaseMinor\0"
    1025                               "DmiBIOSFirmwareMajor\0"
    1026                               "DmiBIOSFirmwareMinor\0"
    1027                               "DmiSystemSKU\0"
     1027                              "DmiBIOSVendor\0"
     1028                              "DmiBIOSVersion\0"
    10281029                              "DmiSystemFamily\0"
    10291030                              "DmiSystemProduct\0"
    10301031                              "DmiSystemSerial\0"
     1032                              "DmiSystemSKU\0"
    10311033                              "DmiSystemUuid\0"
    10321034                              "DmiSystemVendor\0"
    10331035                              "DmiSystemVersion\0"
     1036                              "DmiBoardAssetTag\0"
     1037                              "DmiBoardBoardType\0"
     1038                              "DmiBoardLocInChass\0"
     1039                              "DmiBoardProduct\0"
     1040                              "DmiBoardSerial\0"
     1041                              "DmiBoardVendor\0"
     1042                              "DmiBoardVersion\0"
     1043                              "DmiChassisAssetTag\0"
     1044                              "DmiChassisSerial\0"
    10341045                              "DmiChassisVendor\0"
    10351046                              "DmiChassisVersion\0"
    1036                               "DmiChassisSerial\0"
    1037                               "DmiChassisAssetTag\0"
    1038 #ifdef VBOX_WITH_DMI_OEMSTRINGS
     1047                              "DmiProcManufacturer\0"
     1048                              "DmiProcVersion\0"
    10391049                              "DmiOEMVBoxVer\0"
    10401050                              "DmiOEMVBoxRev\0"
    1041 #endif
    10421051                              "DmiUseHostInfo\0"
    10431052                              "DmiExposeMemoryTable\0"
     
    12271236     * XXX I wonder if we really need these tables as there is no SMBIOS header...
    12281237     */
    1229     uint16_t cbDmiTablesDummy;
    12301238    rc = FwCommonPlantDMITable(pDevIns, pThis->au8DMIPage, VBOX_DMI_TABLE_SIZE, &pThis->aUuid,
    1231                                pDevIns->pCfg, pThis->cCpus, &cbDmiTablesDummy);
     1239                               pDevIns->pCfg, pThis->cCpus, &pThis->cbDmiTables);
    12321240    AssertRCReturn(rc, rc);
    12331241    if (pThis->u8IOAPIC)
  • trunk/src/VBox/Devices/EFI/DevOVMF.cpp

    r43209 r43712  
    124124    uint64_t        cbAbove4GB;
    125125
    126     uint64_t cbRam;
    127 
    128     uint64_t cbRamHole;
    129 
     126    uint64_t        cbRam;
     127
     128    uint64_t        cbRamHole;
     129
     130    /** The size of the DMI tables */
     131    uint16_t        cbDmiTables;
    130132    /** The DMI tables. */
    131133    uint8_t         au8DMIPage[0x1000];
     
    141143
    142144    /* Device properties buffer */
    143     uint8_t*           pu8DeviceProps;
     145    uint8_t*        pu8DeviceProps;
    144146    /* Device properties buffer size */
    145     uint32_t           u32DevicePropsLen;
     147    uint32_t        u32DevicePropsLen;
    146148
    147149    /* Virtual machine front side bus frequency */
     
    157159    uint32_t        u32UgaVertical;
    158160    NVRAMDESC       NVRAM;
    159     struct {
     161    struct
     162    {
    160163        PPDMIBASE    pDrvBase;
    161164        PDMIBASE     IBase;
     
    906909     * Plan some structures in RAM.
    907910     */
    908     FwCommonPlantSmbiosAndDmiHdrs(pDevIns);
     911    FwCommonPlantSmbiosAndDmiHdrs(pDevIns, pThis->cbDmiTables);
    909912    if (pThis->u8IOAPIC)
    910913        FwCommonPlantMpsFloatPtr(pDevIns);
     
    12191222                              "UUID\0"
    12201223                              "IOAPIC\0"
    1221                               "DmiBIOSVendor\0"
    1222                               "DmiBIOSVersion\0"
     1224                              "DmiBIOSFirmwareMajor\0"
     1225                              "DmiBIOSFirmwareMinor\0"
    12231226                              "DmiBIOSReleaseDate\0"
    12241227                              "DmiBIOSReleaseMajor\0"
    12251228                              "DmiBIOSReleaseMinor\0"
    1226                               "DmiBIOSFirmwareMajor\0"
    1227                               "DmiBIOSFirmwareMinor\0"
    1228                               "DmiSystemSKU\0"
     1229                              "DmiBIOSVendor\0"
     1230                              "DmiBIOSVersion\0"
    12291231                              "DmiSystemFamily\0"
    12301232                              "DmiSystemProduct\0"
    12311233                              "DmiSystemSerial\0"
     1234                              "DmiSystemSKU\0"
    12321235                              "DmiSystemUuid\0"
    12331236                              "DmiSystemVendor\0"
    12341237                              "DmiSystemVersion\0"
     1238                              "DmiBoardAssetTag\0"
     1239                              "DmiBoardBoardType\0"
     1240                              "DmiBoardLocInChass\0"
     1241                              "DmiBoardProduct\0"
     1242                              "DmiBoardSerial\0"
     1243                              "DmiBoardVendor\0"
     1244                              "DmiBoardVersion\0"
     1245                              "DmiChassisAssetTag\0"
     1246                              "DmiChassisSerial\0"
    12351247                              "DmiChassisVendor\0"
    12361248                              "DmiChassisVersion\0"
    1237                               "DmiChassisSerial\0"
    1238                               "DmiChassisAssetTag\0"
    1239 #ifdef VBOX_WITH_DMI_OEMSTRINGS
     1249                              "DmiProcManufacturer\0"
     1250                              "DmiProcVersion\0"
    12401251                              "DmiOEMVBoxVer\0"
    12411252                              "DmiOEMVBoxRev\0"
    1242 #endif
    12431253                              "DmiUseHostInfo\0"
    12441254                              "DmiExposeMemoryTable\0"
     
    14471457    uint16_t cbDmiTablesDummy;
    14481458    rc = FwCommonPlantDMITable(pDevIns, pThis->au8DMIPage, VBOX_DMI_TABLE_SIZE, &pThis->aUuid,
    1449                                pDevIns->pCfg, pThis->cCpus, &cbDmiTablesDummy);
     1459                               pDevIns->pCfg, pThis->cCpus, &pThis->cbDmiTables);
    14501460    AssertRCReturn(rc, rc);
    14511461    if (pThis->u8IOAPIC)
  • trunk/src/VBox/Devices/PC/BIOS/orgs.asm

    r43473 r43712  
    17901790
    17911791                end
     1792
  • trunk/src/VBox/Devices/PC/BIOS/smidmi.inc

    r43117 r43712  
    6464                db      '_DMI_'         ; signature
    6565                db      0               ; checksum (set by biossums)
    66                 dw      VBOX_DMI_TABLE_SIZE     ; DMI tables length
    67                 dd      VBOX_DMI_TABLE_BASE     ; DMI tables base
    68                 dw      VBOX_DMI_TABLE_ENTR     ; DMI tables entries
    69                 db      VBOX_DMI_TABLE_VER      ; DMI version
     66                dw      0               ; DMI tables length (set by DevPcBios)
     67                dd      VBOX_DMI_TABLE_BASE ; DMI tables base
     68                dw      VBOX_DMI_TABLE_ENTR ; DMI tables entries
     69                db      VBOX_DMI_TABLE_VER ; DMI version
    7070                db      0               ; Just for alignment (16 bytes total)
  • trunk/src/VBox/Devices/PC/BIOS/vbdmismi.inc

    r38699 r43712  
    33VBOX_DMI_TABLE_BASE     equ     0E1000h
    44VBOX_DMI_TABLE_VER      equ     25h
    5 VBOX_DMI_TABLE_ENTR     equ     5
     5VBOX_DMI_TABLE_ENTR     equ     9
    66VBOX_DMI_TABLE_SIZE     equ     352
    77
  • trunk/src/VBox/Devices/PC/DevFwCommon.cpp

    r40277 r43712  
    631631        CHECKSIZE(sizeof(*pSystemInf));
    632632        START_STRUCT(pSystemInf);
    633         iStrNr                       = 1;
    634633        pSystemInf->header.u8Type    = 1; /* System Information */
    635634        pSystemInf->header.u8Length  = sizeof(*pSystemInf);
     
    671670        PDMIBOARDINF pBoardInf       = (PDMIBOARDINF)pszStr;
    672671        CHECKSIZE(sizeof(*pBoardInf));
    673         pszStr                       = (char *)(pBoardInf + 1);
    674         iStrNr                       = 1;
     672        START_STRUCT(pBoardInf);
    675673        int iDmiBoardBoardType;
    676674        pBoardInf->header.u8Type     = 2; /* Board Information */
     
    737735        CHECKSIZE(sizeof(*pProcessorInf));
    738736        START_STRUCT(pProcessorInf);
    739         iStrNr                             = 1;
    740737        if (fDmiExposeProcessorInf)
    741738            pProcessorInf->header.u8Type   = 4; /* Processor Information */
     
    855852        CHECKSIZE(sizeof(*pOEMStrings));
    856853        START_STRUCT(pOEMStrings);
    857         iStrNr                        = 1;
    858854#ifdef VBOX_WITH_DMI_OEMSTRINGS
    859855        pOEMStrings->header.u8Type    = 0xb; /* OEM Strings */
     
    900896 * @param   pDevIns    The device instance data.
    901897 */
    902 void FwCommonPlantSmbiosAndDmiHdrs(PPDMDEVINS pDevIns)
     898void FwCommonPlantSmbiosAndDmiHdrs(PPDMDEVINS pDevIns, uint16_t cbDmiTables)
    903899{
    904900    struct
     
    906902        struct SMBIOSHDR     smbios;
    907903        struct DMIMAINHDR    dmi;
    908     } aBiosHeaders =
     904    }
     905    aBiosHeaders =
    909906    {
    910907        // The SMBIOS header
     
    923920            { 0x5f, 0x44, 0x4d, 0x49, 0x5f },  // "_DMI_" signature
    924921            0x00,                              // checksum
    925             VBOX_DMI_TABLE_SIZE,               // DMI tables length
     922            0,                                 // DMI tables length
    926923            VBOX_DMI_TABLE_BASE,               // DMI tables base
    927924            VBOX_DMI_TABLE_ENTR,               // DMI tables entries
     
    930927    };
    931928
    932     aBiosHeaders.smbios.u8Checksum = fwCommonChecksum((uint8_t*)&aBiosHeaders.smbios, sizeof(aBiosHeaders.smbios));
    933     aBiosHeaders.dmi.u8Checksum    = fwCommonChecksum((uint8_t*)&aBiosHeaders.dmi,    sizeof(aBiosHeaders.dmi));
     929    aBiosHeaders.dmi.u16TablesLength = cbDmiTables;
     930    aBiosHeaders.smbios.u8Checksum   = fwCommonChecksum((uint8_t*)&aBiosHeaders.smbios, sizeof(aBiosHeaders.smbios));
     931    aBiosHeaders.dmi.u8Checksum      = fwCommonChecksum((uint8_t*)&aBiosHeaders.dmi,    sizeof(aBiosHeaders.dmi));
    934932
    935933    PDMDevHlpPhysWrite(pDevIns, 0xfe300, &aBiosHeaders, sizeof(aBiosHeaders));
  • trunk/src/VBox/Devices/PC/DevFwCommon.h

    r40277 r43712  
    2929/* Plant DMI table */
    3030int FwCommonPlantDMITable(PPDMDEVINS pDevIns, uint8_t *pTable, unsigned cbMax, PCRTUUID pUuid, PCFGMNODE pCfg, uint16_t cCpus, uint16_t *pcbDmiTables);
    31 void FwCommonPlantSmbiosAndDmiHdrs(PPDMDEVINS pDevIns);
     31void FwCommonPlantSmbiosAndDmiHdrs(PPDMDEVINS pDevIns, uint16_t cbDmiTables);
    3232
    3333/* Plant MPS table */
  • trunk/src/VBox/Devices/PC/DevPcBios.cpp

    r41599 r43712  
    11711171    }
    11721172
    1173     const uint8_t  *pu8PcBiosBinary;
    1174     uint32_t        cbPcBiosBinary;
    11751173    if (pThis->pszPcBiosFile)
    11761174    {
     
    12421240                                       g_cbPcBiosBinary);
    12431241    }
    1244     pu8PcBiosBinary = pThis->pu8PcBios;
    1245     cbPcBiosBinary  = pThis->cbPcBios;
     1242    const uint8_t *pu8PcBiosBinary = pThis->pu8PcBios;
     1243    uint32_t       cbPcBiosBinary  = pThis->cbPcBios;
    12461244
    12471245    /*
     
    12641262        return rc;
    12651263
    1266     /* If the DMI table is located at the expected place, patch the DMI table length and the checksum. */
    1267     if (   pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x00] == '_'
    1268         && pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x01] == 'D'
    1269         && pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x02] == 'M'
    1270         && pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x03] == 'I'
    1271         && pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x04] == '_')
    1272     {
    1273         *(uint16_t*)&pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x06] = cbDmiTables;
    1274         uint8_t u8Sum = 0;
    1275         for (unsigned i = 0; i < pThis->cbPcBios; i++)
    1276             if (i != VBOX_DMI_TABLE_OFFSET + 0x05)
    1277                 u8Sum += pThis->pu8PcBios[i];
    1278         pThis->pu8PcBios[VBOX_DMI_TABLE_OFFSET + 0x05] = -u8Sum;
     1264    for (unsigned i = 0; i < pThis->cbPcBios; i += 16)
     1265    {
     1266        /* If the DMI table is located at the expected place, patch the DMI table length and the checksum. */
     1267        if (   pThis->pu8PcBios[i + 0x00] == '_'
     1268            && pThis->pu8PcBios[i + 0x01] == 'D'
     1269            && pThis->pu8PcBios[i + 0x02] == 'M'
     1270            && pThis->pu8PcBios[i + 0x03] == 'I'
     1271            && pThis->pu8PcBios[i + 0x04] == '_'
     1272            && *(uint16_t*)&pThis->pu8PcBios[i + 0x06] == 0)
     1273        {
     1274            *(uint16_t*)&pThis->pu8PcBios[i + 0x06] = cbDmiTables;
     1275            uint8_t u8Sum = 0;
     1276            for (unsigned j = 0; j < pThis->cbPcBios; j++)
     1277                if (j != i + 0x05)
     1278                    u8Sum += pThis->pu8PcBios[j];
     1279            pThis->pu8PcBios[i + 0x05] = -u8Sum;
     1280            break;
     1281        }
    12791282    }
    12801283
  • trunk/src/VBox/Devices/PC/DevPcBios.h

    r40277 r43712  
    2828 */
    2929#define VBOX_DMI_TABLE_ENTR         9
    30 #define VBOX_DMI_TABLE_OFFSET       0xff40
    3130
    3231/** def VBOX_DMI_TABLE_SIZE
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