VirtualBox

Changeset 26203 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 3, 2010 3:22:42 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
57225
Message:

EFI: better configuration for firmware

Location:
trunk/src/VBox
Files:
3 edited

Legend:

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

    r26173 r26203  
    109109
    110110    /* Boot parameters passed to the firmware */
    111     char            pszBootArgs[256];
     111    char            szBootArgs[256];
    112112
    113113    /* Host UUID (for DMI) */
    114114    RTUUID          aUuid;
     115
     116    /* Device properties string */
     117    char*           pszDeviceProps;
     118   
     119    /* Virtual machine front side bus frequency */
     120    uint64_t        u64FsbFrequency;
     121    /* Virtual machine time stamp counter frequency */
     122    uint64_t        u64TscFrequency;
     123    /* Virtual machine CPU frequency */
     124    uint64_t        u64CpuFrequency;
    115125} DEVEFI;
    116126typedef DEVEFI *PDEVEFI;
     
    141151        case EFI_INFO_INDEX_STACK_SIZE:
    142152            return 4;
    143          case EFI_INFO_INDEX_BOOT_ARGS:
    144              return RTStrNLen(pThis->pszBootArgs, sizeof pThis->pszBootArgs) + 1;
     153        case EFI_INFO_INDEX_BOOT_ARGS:
     154            return RTStrNLen(pThis->szBootArgs, sizeof pThis->szBootArgs) + 1;
     155        case EFI_INFO_INDEX_DEVICE_PROPS:
     156            return RTStrNLen(pThis->pszDeviceProps, RTSTR_MAX) + 1;
     157        case EFI_INFO_INDEX_FSB_FREQUENCY:
     158        case EFI_INFO_INDEX_CPU_FREQUENCY:
     159        case EFI_INFO_INDEX_TSC_FREQUENCY:
     160            return 8;
    145161    }
    146162    Assert(false);
     
    150166static uint8_t efiInfoNextByte(PDEVEFI pThis)
    151167{
    152     uint32_t iValue;
     168    union
     169    {
     170        uint32_t u32;
     171        uint64_t u64;
     172    } value;
     173
    153174    switch (pThis->iInfoSelector)
    154175    {
    155176        case EFI_INFO_INDEX_VOLUME_BASE:
    156             iValue = pThis->GCLoadAddress;
     177            value.u32 = pThis->GCLoadAddress;
    157178            break;
    158179        case EFI_INFO_INDEX_VOLUME_SIZE:
    159             iValue = pThis->cbEfiRom;
     180            value.u32 = pThis->cbEfiRom;
    160181            break;
    161182        case EFI_INFO_INDEX_TEMPMEM_BASE:
    162             iValue = VBOX_EFI_TOP_OF_STACK; /* just after stack */
     183            value.u32 = VBOX_EFI_TOP_OF_STACK; /* just after stack */
    163184            break;
    164185        case EFI_INFO_INDEX_TEMPMEM_SIZE:
    165             iValue = 512 * 1024; /* 512 K */
     186            value.u32 = 512 * 1024; /* 512 K */
    166187            break;
    167188        case EFI_INFO_INDEX_STACK_BASE:
    168189            /* Keep in sync with value in EfiThunk.asm */
    169             iValue = VBOX_EFI_TOP_OF_STACK - 128*1024; /* 2M - 128 K */
     190            value.u32 = VBOX_EFI_TOP_OF_STACK - 128*1024; /* 2M - 128 K */
    170191            break;
    171192        case EFI_INFO_INDEX_STACK_SIZE:
    172             iValue = 128*1024; /* 128 K */
     193            value.u32 = 128*1024; /* 128 K */
     194            break;
     195        case EFI_INFO_INDEX_FSB_FREQUENCY:
     196            value.u64 = pThis->u64FsbFrequency;
     197            break;
     198        case EFI_INFO_INDEX_TSC_FREQUENCY:
     199            value.u64 = pThis->u64TscFrequency;
     200            break;
     201        case EFI_INFO_INDEX_CPU_FREQUENCY:
     202            value.u64 = pThis->u64CpuFrequency;
    173203            break;
    174204        case EFI_INFO_INDEX_BOOT_ARGS:
    175             return pThis->pszBootArgs[pThis->iInfoPosition];
     205            return pThis->szBootArgs[pThis->iInfoPosition];
     206        case EFI_INFO_INDEX_DEVICE_PROPS:
     207            return pThis->pszDeviceProps[pThis->iInfoPosition];
    176208        default:
    177209            Assert(false);
    178             iValue = 0;
    179             break;
    180     }
    181     /* somewhat ugly, but works atm */
    182     return *((uint8_t*)&iValue+pThis->iInfoPosition);
     210            value.u64 = 0;
     211            break;
     212    }
     213   
     214    return *((uint8_t*)&value+pThis->iInfoPosition);
    183215}
    184216
     
    496528        MMR3HeapFree(pThis->pu8EfiThunk);
    497529        pThis->pu8EfiThunk = NULL;
     530    }
     531
     532    if (pThis->pszDeviceProps)
     533    {
     534        MMR3HeapFree(pThis->pszDeviceProps);
     535        pThis->pszDeviceProps = NULL;
    498536    }
    499537
     
    906944                              "64BitEntry\0"
    907945                              "BootArgs\0"
     946                              "DeviceProps\0"
    908947                              ))
    909948        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
     
    928967                                N_("Configuration error: Querying \"UUID\" failed"));
    929968
    930     /* Convert the UUID to network byte order. Not entirely straightforward as parts are MSB already... */
     969    /*
     970     * Convert the UUID to network byte order. Not entirely straightforward as
     971     * parts are MSB already...
     972     */
    931973    uuid.Gen.u32TimeLow = RT_H2BE_U32(uuid.Gen.u32TimeLow);
    932974    uuid.Gen.u16TimeMid = RT_H2BE_U16(uuid.Gen.u16TimeMid);
     
    935977
    936978
    937     /* RAM sizes */
     979    /*
     980     * RAM sizes
     981     */
    938982    rc = CFGMR3QueryU64(pCfg, "RamSize", &pThis->cbRam);
    939983    AssertLogRelRCReturn(rc, rc);
     
    943987    pThis->cbAbove4GB = pThis->cbRam - pThis->cbBelow4GB;
    944988
    945 
    946989    /*
    947990     * Get the system EFI ROM file name.
     
    9701013    }
    9711014
    972      /*
     1015    /*
    9731016     * Get boot args.
    9741017     */
    9751018    rc = CFGMR3QueryString(pCfg, "BootArgs",
    976                            pThis->pszBootArgs, sizeof pThis->pszBootArgs);
     1019                           pThis->szBootArgs, sizeof pThis->szBootArgs);
    9771020    if (rc == VERR_CFGM_VALUE_NOT_FOUND)
    9781021    {
    979         strcpy(pThis->pszBootArgs, "");
     1022        strcpy(pThis->szBootArgs, "");
    9801023        rc = VINF_SUCCESS;
    9811024    }
     
    9841027                                   N_("Configuration error: Querying \"BootArgs\" as a string failed"));
    9851028
    986     LogRel(("EFI boot args: %s\n", pThis->pszBootArgs));
     1029    LogRel(("EFI boot args: %s\n", pThis->szBootArgs));
     1030
     1031    /*
     1032     * Get device props.
     1033     */
     1034    rc = CFGMR3QueryStringAlloc(pCfg, "DeviceProps", &pThis->pszDeviceProps);
     1035    if (rc == VERR_CFGM_VALUE_NOT_FOUND)
     1036    {
     1037        pThis->pszDeviceProps = RTStrDup("");
     1038        rc = VINF_SUCCESS;
     1039    }
     1040    if (RT_FAILURE(rc))
     1041        return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
     1042                                   N_("Configuration error: Querying \"DeviceProps\" as a string failed"));
     1043    LogRel(("EFI device props: %s\n", pThis->pszDeviceProps));
     1044
     1045    pThis->u64FsbFrequency = 1333000000;
     1046    pThis->u64TscFrequency = pThis->u64FsbFrequency * 3;
     1047    pThis->u64CpuFrequency = pThis->u64TscFrequency;
     1048
    9871049
    9881050#ifdef DEVEFI_WITH_VBOXDBG_SCRIPT
  • trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/Include/DevEFI.h

    r26109 r26203  
    5555    EFI_INFO_INDEX_STACK_SIZE,
    5656    EFI_INFO_INDEX_BOOT_ARGS,
     57    EFI_INFO_INDEX_DEVICE_PROPS,
     58    EFI_INFO_INDEX_FSB_FREQUENCY,
     59    EFI_INFO_INDEX_CPU_FREQUENCY,
     60    EFI_INFO_INDEX_TSC_FREQUENCY,
    5761    EFI_INFO_INDEX_END
    5862} EfiInfoIndex;
  • trunk/src/VBox/Main/ConsoleImpl2.cpp

    r26186 r26203  
    815815        rc = findEfiRom(virtualBox, eFwType, efiRomFile);                                                                                                                          RC_CHECK();
    816816
    817         /* Compute boot args */
     817        /* Get boot args */
    818818        Bstr bootArgs;
    819819        hrc = pMachine->GetExtraData(Bstr("VBoxInternal2/EfiBootArgs"), bootArgs.asOutParam()); H();
     820
     821        /* Get device props */
     822        Bstr deviceProps;
     823        hrc = pMachine->GetExtraData(Bstr("VBoxInternal2/EfiDeviceProps"), deviceProps.asOutParam()); H();
    820824
    821825        /*
     
    830834        rc = CFGMR3InsertInteger(pCfg,  "NumCPUs",          cCpus);                 RC_CHECK();
    831835        rc = CFGMR3InsertString(pCfg,   "EfiRom",           efiRomFile.raw());      RC_CHECK();
    832         rc = CFGMR3InsertString(pCfg,   "BootArgs",         Utf8Str(bootArgs).raw());      RC_CHECK();
     836        rc = CFGMR3InsertString(pCfg,   "BootArgs",         Utf8Str(bootArgs).raw());RC_CHECK();
     837        rc = CFGMR3InsertString(pCfg,   "DeviceProps",      Utf8Str(deviceProps).raw());RC_CHECK();
    833838        rc = CFGMR3InsertInteger(pCfg,  "IOAPIC",           fIOAPIC);           RC_CHECK();
    834839        rc = CFGMR3InsertBytes(pCfg,    "UUID", &HardwareUuid,sizeof(HardwareUuid));RC_CHECK();
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