VirtualBox

Ignore:
Timestamp:
Sep 29, 2017 4:13:26 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
118205
Message:

Main,VBoxManage: Changed the CPUID override methods on IMachine to take sub-leaves into account. Currently we do not support non-zero sub-leaves due to VMM, but that can be fixed later.

Location:
trunk/src/VBox/Frontends/VBoxManage
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp

    r68514 r68938  
    630630    if (details != VMINFO_MACHINEREADABLE)
    631631        RTPrintf("CPUID overrides: ");
    632     ULONG cFound = 0;
    633     static uint32_t const s_auCpuIdRanges[] =
    634     {
    635         UINT32_C(0x00000000), UINT32_C(0x0000000a),
    636         UINT32_C(0x80000000), UINT32_C(0x8000000a)
    637     };
    638     for (unsigned i = 0; i < RT_ELEMENTS(s_auCpuIdRanges); i += 2)
    639         for (uint32_t uLeaf = s_auCpuIdRanges[i]; uLeaf < s_auCpuIdRanges[i + 1]; uLeaf++)
    640         {
    641             ULONG uEAX, uEBX, uECX, uEDX;
    642             rc = machine->GetCPUIDLeaf(uLeaf, &uEAX, &uEBX, &uECX, &uEDX);
    643             if (SUCCEEDED(rc))
    644             {
    645                 if (details == VMINFO_MACHINEREADABLE)
    646                     RTPrintf("cpuid=%08x,%08x,%08x,%08x,%08x", uLeaf, uEAX, uEBX, uECX, uEDX);
    647                 else
    648                 {
    649                     if (!cFound)
    650                         RTPrintf("Leaf no.  EAX      EBX      ECX      EDX\n");
    651                     RTPrintf("                 %08x  %08x %08x %08x %08x\n", uLeaf, uEAX, uEBX, uECX, uEDX);
    652                 }
    653                 cFound++;
    654             }
    655         }
    656     if (!cFound && details != VMINFO_MACHINEREADABLE)
     632    ULONG uOrdinal = 0;
     633    for (uOrdinal = 0; uOrdinal < _4K; uOrdinal++)
     634    {
     635        ULONG uLeaf, uSubLeaf, uEAX, uEBX, uECX, uEDX;
     636        rc = machine->GetCPUIDLeafByOrdinal(uOrdinal, &uLeaf, &uSubLeaf, &uEAX, &uEBX, &uECX, &uEDX);
     637        if (SUCCEEDED(rc))
     638        {
     639            if (details == VMINFO_MACHINEREADABLE)
     640                RTPrintf("cpuid=%08x,%08x,%08x,%08x,%08x,%08x", uLeaf, uSubLeaf, uEAX, uEBX, uECX, uEDX);
     641            else
     642            {
     643                if (!uOrdinal)
     644                    RTPrintf("Leaf no.       EAX      EBX      ECX      EDX\n");
     645                RTPrintf("                 %08x/%03x  %08x %08x %08x %08x\n", uLeaf, uSubLeaf, uEAX, uEBX, uECX, uEDX);
     646            }
     647        }
     648        else
     649        {
     650            if (rc != E_INVALIDARG)
     651                com::GlueHandleComError(machine, "GetCPUIDLeaf", rc, __FILE__, __LINE__);
     652            break;
     653        }
     654    }
     655
     656    if (!uOrdinal && details != VMINFO_MACHINEREADABLE)
    657657        RTPrintf("None\n");
    658658
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp

    r68485 r68938  
    8181    MODIFYVM_UNPLUGCPU,
    8282    MODIFYVM_SETCPUID,
     83    MODIFYVM_SETCPUID_OLD,
    8384    MODIFYVM_DELCPUID,
     85    MODIFYVM_DELCPUID_OLD,
    8486    MODIFYVM_DELALLCPUID,
    8587    MODIFYVM_GRAPHICSCONTROLLER,
     
    253255    { "--vtxvpid",                  MODIFYVM_VTXVPID,                   RTGETOPT_REQ_BOOL_ONOFF },
    254256    { "--vtxux",                    MODIFYVM_VTXUX,                     RTGETOPT_REQ_BOOL_ONOFF },
    255     { "--cpuidset",                 MODIFYVM_SETCPUID,                  RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX},
    256     { "--cpuidremove",              MODIFYVM_DELCPUID,                  RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX},
     257    { "--cpuid-set",                MODIFYVM_SETCPUID,                  RTGETOPT_REQ_UINT32_OPTIONAL_PAIR | RTGETOPT_FLAG_HEX },
     258    { "--cpuid-remove",             MODIFYVM_DELCPUID,                  RTGETOPT_REQ_UINT32_OPTIONAL_PAIR | RTGETOPT_FLAG_HEX },
     259    { "--cpuidset",                 MODIFYVM_SETCPUID_OLD,              RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX },
     260    { "--cpuidremove",              MODIFYVM_DELCPUID_OLD,              RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX },
    257261    { "--cpuidremoveall",           MODIFYVM_DELALLCPUID,               RTGETOPT_REQ_NOTHING},
    258262    { "--cpus",                     MODIFYVM_CPUS,                      RTGETOPT_REQ_UINT32 },
     
    735739
    736740            case MODIFYVM_SETCPUID:
    737             {
    738                 uint32_t id = ValueUnion.u32;
     741            case MODIFYVM_SETCPUID_OLD:
     742            {
     743                uint32_t const idx    = c == MODIFYVM_SETCPUID ?  ValueUnion.PairU32.uFirst  : ValueUnion.u32;
     744                uint32_t const idxSub = c == MODIFYVM_SETCPUID ?  ValueUnion.PairU32.uSecond : UINT32_MAX;
    739745                uint32_t aValue[4];
    740 
    741746                for (unsigned i = 0; i < 4; i++)
    742747                {
    743748                    int vrc = RTGetOptFetchValue(&GetOptState, &ValueUnion, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX);
    744749                    if (RT_FAILURE(vrc))
    745                         return errorSyntax(USAGE_MODIFYVM,
    746                                            "Missing or Invalid argument to '%s'",
    747                                            GetOptState.pDef->pszLong);
     750                        return errorSyntax(USAGE_MODIFYVM, "Missing or Invalid argument to '%s'", GetOptState.pDef->pszLong);
    748751                    aValue[i] = ValueUnion.u32;
    749752                }
    750                 CHECK_ERROR(sessionMachine, SetCPUIDLeaf(id, aValue[0], aValue[1], aValue[2], aValue[3]));
     753                CHECK_ERROR(sessionMachine, SetCPUIDLeaf(idx, idxSub, aValue[0], aValue[1], aValue[2], aValue[3]));
    751754                break;
    752755            }
    753756
    754757            case MODIFYVM_DELCPUID:
    755             {
    756                 CHECK_ERROR(sessionMachine, RemoveCPUIDLeaf(ValueUnion.u32));
    757                 break;
    758             }
     758                CHECK_ERROR(sessionMachine, RemoveCPUIDLeaf(ValueUnion.PairU32.uFirst, ValueUnion.PairU32.uSecond));
     759                break;
     760
     761            case MODIFYVM_DELCPUID_OLD:
     762                CHECK_ERROR(sessionMachine, RemoveCPUIDLeaf(ValueUnion.u32, UINT32_MAX));
     763                break;
    759764
    760765            case MODIFYVM_DELALLCPUID:
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