VirtualBox

Changeset 76886 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jan 18, 2019 10:57:02 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
128254
Message:

VMM (and related changes): Add support for Shanghai/Zhaoxin CPUs. Modified and improved contribution by Journey Ren submitted under MIT license. Thank you!

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/GIMAll.cpp

    r76553 r76886  
    436436        case CPUMCPUVENDOR_INTEL:
    437437        case CPUMCPUVENDOR_VIA:
     438        case CPUMCPUVENDOR_SHANGHAI:
    438439        {
    439440            if (puDisOpcode)
  • trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp

    r76553 r76886  
    14031403    if (   (   uDisOpcode == OP_VMCALL
    14041404            && (   enmGuestCpuVendor == CPUMCPUVENDOR_INTEL
    1405                 || enmGuestCpuVendor == CPUMCPUVENDOR_VIA))
     1405                || enmGuestCpuVendor == CPUMCPUVENDOR_VIA
     1406                || enmGuestCpuVendor == CPUMCPUVENDOR_SHANGHAI))
    14061407        || (   uDisOpcode == OP_VMMCALL
    14071408            && enmGuestCpuVendor == CPUMCPUVENDOR_AMD))
  • trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp

    r76678 r76886  
    784784    if (   (   ASMIsIntelCpuEx(u32EBX, u32ECX, u32EDX)
    785785            || ASMIsAmdCpuEx(u32EBX, u32ECX, u32EDX)
    786             || ASMIsViaCentaurCpuEx(u32EBX, u32ECX, u32EDX))
     786            || ASMIsViaCentaurCpuEx(u32EBX, u32ECX, u32EDX)
     787            || ASMIsShanghaiCpuEx(u32EBX, u32ECX, u32EDX))
    787788        && ASMIsValidStdRange(uMaxLeaf))
    788789    {
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r76877 r76886  
    11491149    PCCPUMFEATURES pGuestFeatures = &pVM->cpum.s.GuestFeatures;
    11501150    if (   pHostFeatures->enmCpuVendor == CPUMCPUVENDOR_INTEL
    1151         || pHostFeatures->enmCpuVendor == CPUMCPUVENDOR_VIA)
     1151        || pHostFeatures->enmCpuVendor == CPUMCPUVENDOR_VIA
     1152        || pHostFeatures->enmCpuVendor == CPUMCPUVENDOR_SHANGHAI)
    11521153    {
    11531154#define VMXFEATDUMP(a_szDesc, a_Var) \
  • trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp

    r76678 r76886  
    431431    }
    432432
     433    if (enmVendor == CPUMCPUVENDOR_SHANGHAI)
     434    {
     435        switch (bFamily)
     436        {
     437            case 6:
     438            case 7:
     439                return kCpumMicroarch_Shanghai_Wudaokou;
     440            default:
     441                break;
     442        }
     443        return kCpumMicroarch_Shanghai_Unknown;
     444    }
     445
    433446    if (enmVendor == CPUMCPUVENDOR_CYRIX)
    434447    {
     
    588601        CASE_RET_STR(kCpumMicroarch_VIA_Isaiah);
    589602        CASE_RET_STR(kCpumMicroarch_VIA_Unknown);
     603
     604        CASE_RET_STR(kCpumMicroarch_Shanghai_Wudaokou);
     605        CASE_RET_STR(kCpumMicroarch_Shanghai_Unknown);
    590606
    591607        CASE_RET_STR(kCpumMicroarch_Cyrix_5x86);
     
    619635        case kCpumMicroarch_Cyrix_End:
    620636        case kCpumMicroarch_NEC_End:
     637        case kCpumMicroarch_Shanghai_End:
    621638        case kCpumMicroarch_32BitHack:
    622639            break;
     
    16031620            return CPUMCPUVENDOR_VIA;
    16041621
     1622        if (ASMIsShanghaiCpuEx(uEBX, uECX, uEDX))
     1623            return CPUMCPUVENDOR_SHANGHAI;
     1624
    16051625        if (   uEBX == UINT32_C(0x69727943) /* CyrixInstead */
    16061626            && uECX == UINT32_C(0x64616574)
     
    16341654        case CPUMCPUVENDOR_VIA:         return "VIA";
    16351655        case CPUMCPUVENDOR_CYRIX:       return "CYRIX";
     1656        case CPUMCPUVENDOR_SHANGHAI:    return "SHANGHAI";
    16361657        case CPUMCPUVENDOR_UNKNOWN:     return "UNKNOWN";
    16371658
  • trunk/src/VBox/VMM/VMMR3/CPUMR3Db.cpp

    r76678 r76886  
    215215#include "cpus/VIA_QuadCore_L4700_1_2_GHz.h"
    216216
     217#include "cpus/ZHAOXIN_KaiXian_KX_U5581_1_8GHz.h"
     218
    217219
    218220
     
    304306#ifdef VBOX_CPUDB_AMD_Athlon_64_3200_h
    305307    &g_Entry_AMD_Athlon_64_3200,
     308#endif
     309
     310#ifdef VBOX_CPUDB_ZHAOXIN_KaiXian_KX_U5581_1_8GHz_h
     311    &g_Entry_ZHAOXIN_KaiXian_KX_U5581_1_8GHz,
    306312#endif
    307313
  • trunk/src/VBox/VMM/VMMR3/HM.cpp

    r76678 r76886  
    10901090#undef HM_REG_COUNTER
    10911091
    1092         const char *const *papszDesc = ASMIsIntelCpu() || ASMIsViaCentaurCpu() ? &g_apszVmxExitReasons[0]
    1093                                                                                : &g_apszSvmExitReasons[0];
     1092        const char *const *papszDesc =
     1093            ASMIsIntelCpu() || ASMIsViaCentaurCpu() || ASMIsShanghaiCpu()
     1094            ? &g_apszVmxExitReasons[0]
     1095            : &g_apszSvmExitReasons[0];
    10941096
    10951097        /*
  • trunk/src/VBox/VMM/VMMR3/TM.cpp

    r76553 r76886  
    957957                return true;
    958958        }
     959        else if (CPUMGetHostCpuVendor(pVM) == CPUMCPUVENDOR_SHANGHAI)
     960        {
     961            /*
     962             * Shanghai - Check the model, family and stepping.
     963             */
     964            /** @todo use ASMGetCpuFamily() and ASMGetCpuModel() here. */
     965            ASMCpuId(1, &uEAX, &uEBX, &uECX, &uEDX);
     966            unsigned uFamily   = (uEAX >> 8) & 0x0f;
     967            if (   uFamily == 0x06
     968                || uFamily == 0x07)
     969            {
     970                return true;
     971            }
     972        }
    959973    }
    960974    return false;
  • trunk/src/VBox/VMM/tools/VBoxCpuReport.cpp

    r76553 r76886  
    548548                if (!fGp)
    549549                    fFlags = 0;
    550                 /* VIA HACK - writing to 0x0000317e on a quad core make the core unresponsive. */
    551                 else if (uMsr == 0x0000317e && g_enmVendor == CPUMCPUVENDOR_VIA)
     550                /* VIA/Shanghai HACK - writing to 0x0000317e on a quad core make the core unresponsive. */
     551                else if (uMsr == 0x0000317e && (g_enmVendor == CPUMCPUVENDOR_VIA || g_enmVendor == CPUMCPUVENDOR_SHANGHAI))
    552552                {
    553553                    uValue = 0;
     
    601601                    if (RT_FAILURE(rc))
    602602                        return RTMsgErrorRc(rc, "Out of memory (uMsr=%#x).\n", uMsr);
    603                     if (   g_enmVendor != CPUMCPUVENDOR_VIA
     603                    if (   (g_enmVendor != CPUMCPUVENDOR_VIA && g_enmVendor != CPUMCPUVENDOR_SHANGHAI)
    604604                        || uValue
    605605                        || fFlags)
     
    25152515        case 0x00001438:
    25162516        case 0x0000317f:
    2517             if (g_enmVendor == CPUMCPUVENDOR_VIA)
     2517            if (g_enmVendor == CPUMCPUVENDOR_VIA || g_enmVendor == CPUMCPUVENDOR_SHANGHAI)
    25182518                return VBCPUREPBADNESS_BOND_VILLAIN;
    25192519            break;
     
    26022602
    26032603/**
    2604  * Checks if this might be a VIA dummy register.
     2604 * Checks if this might be a VIA/Shanghai dummy register.
    26052605 *
    26062606 * @returns true if it's a dummy, false if it isn't.
     
    26092609 * @param   fFlags              The flags.
    26102610 */
    2611 static bool isMsrViaDummy(uint32_t uMsr, uint64_t uValue, uint32_t fFlags)
    2612 {
    2613     if (g_enmVendor != CPUMCPUVENDOR_VIA)
     2611static bool isMsrViaShanghaiDummy(uint32_t uMsr, uint64_t uValue, uint32_t fFlags)
     2612{
     2613    if (g_enmVendor != CPUMCPUVENDOR_VIA && g_enmVendor != CPUMCPUVENDOR_SHANGHAI)
    26142614        return false;
    26152615
     
    32133213            || fGpMaskN   != fGpMask0)
    32143214        {
    3215             if (!fEarlyEndOk && !isMsrViaDummy(uMsr, paMsrs[i].uValue, paMsrs[i].fFlags))
     3215            if (!fEarlyEndOk && !isMsrViaShanghaiDummy(uMsr, paMsrs[i].uValue, paMsrs[i].fFlags))
    32163216            {
    32173217                vbCpuRepDebug("MSR %s (%#x) range ended unexpectedly early on %#x: ro=%d ign=%#llx/%#llx gp=%#llx/%#llx [N/0]\n",
     
    33033303
    33043304/**
    3305  * Reports a VIA dummy range.
     3305 * Reports a VIA/Shanghai dummy range.
    33063306 *
    33073307 * @returns VBox status code.
     
    33113311 *                              last MSR entry in the range.
    33123312 */
    3313 static int reportMsr_ViaDummyRange(VBCPUREPMSR const *paMsrs, uint32_t cMsrs, uint32_t *pidxLoop)
     3313static int reportMsr_ViaShanghaiDummyRange(VBCPUREPMSR const *paMsrs, uint32_t cMsrs, uint32_t *pidxLoop)
    33143314{
    33153315    /* Figure how many. */
     
    33183318    while (   cRegs < cMsrs
    33193319           && paMsrs[cRegs].uMsr == uMsr + cRegs
    3320            && isMsrViaDummy(paMsrs[cRegs].uMsr, paMsrs[cRegs].uValue, paMsrs[cRegs].fFlags))
     3320           && isMsrViaShanghaiDummy(paMsrs[cRegs].uMsr, paMsrs[cRegs].uValue, paMsrs[cRegs].fFlags))
    33213321    {
    33223322        cRegs++;
     
    34583458    while (   cRegs < cMsrs
    34593459           && paMsrs[cRegs].uMsr == uMsr + cRegs
    3460            && !isMsrViaDummy(paMsrs[cRegs].uMsr, paMsrs[cRegs].uValue, paMsrs[cRegs].fFlags) )
     3460           && !isMsrViaShanghaiDummy(paMsrs[cRegs].uMsr, paMsrs[cRegs].uValue, paMsrs[cRegs].fFlags) )
    34613461        cRegs++;
    34623462    if (cRegs & 1)
     
    42004200         * want to handle there to avoid making the code below unreadable.
    42014201         */
    4202         else if (isMsrViaDummy(uMsr, uValue, fFlags))
    4203             rc = reportMsr_ViaDummyRange(&paMsrs[i], cMsrs - i, &i);
     4202        /** @todo r=klaus check if Shanghai CPUs really are behaving the same */
     4203        else if (isMsrViaShanghaiDummy(uMsr, uValue, fFlags))
     4204            rc = reportMsr_ViaShanghaiDummyRange(&paMsrs[i], cMsrs - i, &i);
    42044205        /*
    42054206         * This shall be sorted by uMsr as much as possible.
     
    45674568        case CPUMCPUVENDOR_VIA:         return "VIA";
    45684569        case CPUMCPUVENDOR_CYRIX:       return "Cyrix";
     4570        case CPUMCPUVENDOR_SHANGHAI:    return "Shanghai";
    45694571        case CPUMCPUVENDOR_INVALID:
    45704572        case CPUMCPUVENDOR_UNKNOWN:
     
    46724674            char       *pszHit;
    46734675            while ((pszHit = strstr(pszName, pszWord)) != NULL)
    4674                 memmove(pszHit, pszHit + cchWord, strlen(pszHit + cchWord) + 1);
     4676                memset(pszHit, ' ', cchWord);
    46754677        }
    46764678
     
    47494751                       " */\n"
    47504752                       "\n"
    4751                        "#ifndef VBOX_CPUDB_%s\n"
    4752                        "#define VBOX_CPUDB_%s\n"
     4753                       "#ifndef VBOX_CPUDB_%s_h\n"
     4754                       "#define VBOX_CPUDB_%s_h\n"
    47534755                       "\n",
    47544756                       pszName,
     
    48074809                   "};\n"
    48084810                   "\n"
    4809                    "#endif /* !VBOX_DB_%s */\n"
     4811                   "#endif /* !VBOX_CPUDB_%s_h */\n"
    48104812                   "\n",
    48114813                   pszCpuDesc,
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