VirtualBox

Changeset 76886 in vbox


Ignore:
Timestamp:
Jan 18, 2019 10:57:02 AM (6 years ago)
Author:
vboxsync
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
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/cpum.h

    r76678 r76886  
    9595    CPUMCPUVENDOR_VIA,
    9696    CPUMCPUVENDOR_CYRIX,
     97    CPUMCPUVENDOR_SHANGHAI,
    9798    CPUMCPUVENDOR_UNKNOWN,
    9899    /** 32bit hackishness. */
     
    265266    kCpumMicroarch_NEC_V30,
    266267    kCpumMicroarch_NEC_End,
     268
     269    kCpumMicroarch_Shanghai_First,
     270    kCpumMicroarch_Shanghai_Wudaokou = kCpumMicroarch_Shanghai_First,
     271    kCpumMicroarch_Shanghai_Unknown,
     272    kCpumMicroarch_Shanghai_End,
    267273
    268274    kCpumMicroarch_Unknown,
  • trunk/include/iprt/asm-amd64-x86.h

    r76585 r76886  
    14761476
    14771477/**
     1478 * Tests if it a Shanghai CPU based on the ASMCpuId(0) output.
     1479 *
     1480 * @returns true/false.
     1481 * @param   uEBX    EBX return from ASMCpuId(0).
     1482 * @param   uECX    ECX return from ASMCpuId(0).
     1483 * @param   uEDX    EDX return from ASMCpuId(0).
     1484 */
     1485DECLINLINE(bool) ASMIsShanghaiCpuEx(uint32_t uEBX, uint32_t uECX, uint32_t uEDX)
     1486{
     1487    return uEBX == UINT32_C(0x68532020)
     1488        && uECX == UINT32_C(0x20206961)
     1489        && uEDX == UINT32_C(0x68676e61);
     1490}
     1491
     1492
     1493/**
     1494 * Tests if this is a Shanghai CPU.
     1495 *
     1496 * @returns true/false.
     1497 * @remarks ASSUMES that cpuid is supported by the CPU.
     1498 */
     1499DECLINLINE(bool) ASMIsShanghaiCpu(void)
     1500{
     1501    uint32_t uEAX, uEBX, uECX, uEDX;
     1502    ASMCpuId(0, &uEAX, &uEBX, &uECX, &uEDX);
     1503    return ASMIsShanghaiCpuEx(uEBX, uECX, uEDX);
     1504}
     1505
     1506
     1507/**
    14781508 * Checks whether ASMCpuId_EAX(0x00000000) indicates a valid range.
    14791509 *
  • trunk/include/iprt/x86.h

    r76678 r76886  
    397397#define X86_CPUID_VENDOR_VIA_ECX        0x736c7561      /* auls */
    398398#define X86_CPUID_VENDOR_VIA_EDX        0x48727561      /* aurH */
     399
     400#define X86_CPUID_VENDOR_SHANGHAI_EBX   0x68532020      /*   Sh */
     401#define X86_CPUID_VENDOR_SHANGHAI_ECX   0x20206961      /* ai   */
     402#define X86_CPUID_VENDOR_SHANGHAI_EDX   0x68676e61      /* angh */
    399403/** @} */
    400404
  • trunk/include/iprt/x86.mac

    r76678 r76886  
    2828%ifndef IPRT_INCLUDED_x86_h
    2929%define IPRT_INCLUDED_x86_h
     30%ifndef RT_WITHOUT_PRAGMA_ONCE
     31%endif
    3032%ifndef VBOX_FOR_DTRACE_LIB
    3133%else
     
    8688%define X86_CPUID_VENDOR_VIA_ECX        0x736c7561
    8789%define X86_CPUID_VENDOR_VIA_EDX        0x48727561
     90%define X86_CPUID_VENDOR_SHANGHAI_EBX   0x68532020
     91%define X86_CPUID_VENDOR_SHANGHAI_ECX   0x20206961
     92%define X86_CPUID_VENDOR_SHANGHAI_EDX   0x68676e61
    8893%define X86_CPUID_FEATURE_ECX_SSE3      RT_BIT_32(0)
    8994%define X86_CPUID_FEATURE_ECX_PCLMUL    RT_BIT_32(1)
  • trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp

    r76553 r76886  
    41504150            /* Check if the vendor is Intel (or compatible). */
    41514151            if (   ASMIsIntelCpuEx(uVendorEbx, uVendorEcx, uVendorEdx)
    4152                 || ASMIsViaCentaurCpuEx(uVendorEbx, uVendorEcx, uVendorEdx))
     4152                || ASMIsViaCentaurCpuEx(uVendorEbx, uVendorEcx, uVendorEdx)
     4153                || ASMIsShanghaiCpuEx(uVendorEbx, uVendorEcx, uVendorEdx))
    41534154            {
    41544155                /* Check VT-x support. In addition, VirtualBox requires MSR and FXSAVE/FXRSTOR to function. */
     
    41984199 * @remarks Must be called with preemption disabled.
    41994200 *          The caller is also expected to check that the CPU is an Intel (or
    4200  *          VIA) CPU -and- that it supports VT-x.  Otherwise, this function
    4201  *          might throw a \#GP fault as it tries to read/write MSRs that may not
    4202  *          be present!
     4201 *          VIA/Shanghai) CPU -and- that it supports VT-x.  Otherwise, this
     4202 *          function might throw a \#GP fault as it tries to read/write MSRs
     4203 *          that may not be present!
    42034204 */
    42044205SUPR0DECL(int) SUPR0GetVmxUsability(bool *pfIsSmxModeAmbiguous)
     
    42684269        Assert(ASMIsValidStdRange(uMaxId));
    42694270        Assert(   ASMIsIntelCpuEx(     uVendorEBX, uVendorECX, uVendorEDX)
    4270                || ASMIsViaCentaurCpuEx(uVendorEBX, uVendorECX, uVendorEDX));
     4271               || ASMIsViaCentaurCpuEx(uVendorEBX, uVendorECX, uVendorEDX)
     4272               || ASMIsShanghaiCpuEx(  uVendorEBX, uVendorECX, uVendorEDX));
    42714273#endif
    42724274        ASMCpuId(1, &uDummy, &uDummy, &fFeaturesECX, &uDummy);
     
    43734375 * @retval  VERR_SVM_DISABLED
    43744376 * @retval  VERR_UNSUPPORTED_CPU if not identifiable as an AMD, Intel or VIA
    4375  *          (centaur) CPU.
     4377 *          (centaur)/Shanghai CPU.
    43764378 *
    43774379 * @param   pfCaps          Where to store the capabilities.
     
    44564458 * @retval  VERR_SVM_DISABLED
    44574459 * @retval  VERR_UNSUPPORTED_CPU if not identifiable as an AMD, Intel or VIA
    4458  *          (centaur) CPU.
     4460 *          (centaur)/Shanghai CPU.
    44594461 *
    44604462 * @param   pSession        The session handle.
  • trunk/src/VBox/Main/src-server/HostImpl.cpp

    r76592 r76886  
    334334            /* VT-x? */
    335335            if (   ASMIsIntelCpuEx(uVendorEBX, uVendorECX, uVendorEDX)
    336                 || ASMIsViaCentaurCpuEx(uVendorEBX, uVendorECX, uVendorEDX))
     336                || ASMIsViaCentaurCpuEx(uVendorEBX, uVendorECX, uVendorEDX)
     337                || ASMIsShanghaiCpuEx(uVendorEBX, uVendorECX, uVendorEDX))
    337338            {
    338339                if (    (fFeaturesEcx & X86_CPUID_FEATURE_ECX_VMX)
  • 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,
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r76553 r76886  
    47474747            CASE_PRED(BS3CG1PRED_VENDOR_INTEL, pThis->bCpuVendor == BS3CPUVENDOR_INTEL);
    47484748            CASE_PRED(BS3CG1PRED_VENDOR_VIA,   pThis->bCpuVendor == BS3CPUVENDOR_VIA);
     4749            CASE_PRED(BS3CG1PRED_VENDOR_SHANGHAI, pThis->bCpuVendor == BS3CPUVENDOR_SHANGHAI);
    47494750
    47504751#undef CASE_PRED
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r76579 r76886  
    775775    BS3CG1PRED_VENDOR_INTEL,
    776776    BS3CG1PRED_VENDOR_VIA,
     777    BS3CG1PRED_VENDOR_SHANGHAI,
    777778
    778779    BS3CG1PRED_END
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-GetCpuVendor.c

    r76553 r76886  
    4343        if (ASMIsViaCentaurCpuEx(uEbx, uEcx, uEdx))
    4444            return BS3CPUVENDOR_VIA;
     45        if (ASMIsShanghaiCpuEx(uEbx, uEcx, uEdx))
     46            return BS3CPUVENDOR_SHANGHAI;
    4547        return BS3CPUVENDOR_UNKNOWN;
    4648    }
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h

    r76579 r76886  
    15371537    BS3CPUVENDOR_VIA,
    15381538    BS3CPUVENDOR_CYRIX,
     1539    BS3CPUVENDOR_SHANGHAI,
    15391540    BS3CPUVENDOR_UNKNOWN,
    15401541    BS3CPUVENDOR_END
  • trunk/src/VBox/ValidationKit/testdriver/vbox.py

    r76553 r76886  
    30973097        return sCpuDesc.startswith("VIA") or sCpuDesc == 'CentaurHauls';
    30983098
     3099    def isHostCpuShanghai(self, fQuiet = False):
     3100        """
     3101        Checks if the host CPU vendor is Shanghai (or Zhaoxin).
     3102
     3103        Returns True / False.
     3104        """
     3105        sCpuDesc = self._getHostCpuDesc(fQuiet);
     3106        return sCpuDesc.startswith("ZHAOXIN") or sCpuDesc.strip(' ') == 'Shanghai';
     3107
    30993108    def isHostCpuP4(self, fQuiet = False):
    31003109        """
  • trunk/src/VBox/ValidationKit/testdriver/vboxtestvms.py

    r76553 r76886  
    443443                elif self.isViaIncompatible() and oTestDrv.isHostCpuVia():
    444444                    fRc = None; # Skip the test.
     445                elif self.isShanghaiIncompatible() and oTestDrv.isHostCpuShanghai():
     446                    fRc = None; # Skip the test.
    445447                elif self.isP4Incompatible() and oTestDrv.isHostCpuP4():
    446448                    fRc = None; # Skip the test.
     
    561563            return True;
    562564        return False;
     565
     566    def isShanghaiIncompatible(self):
     567        """
     568        Identifies VMs that doesn't work on Shanghai.
     569
     570        Returns True if NOT supported on Shanghai, False if it IS supported.
     571        """
     572        # For now treat it just like VIA, to be adjusted later
     573        return self.isViaIncompatible()
    563574
    564575    def isP4Incompatible(self):
  • trunk/src/VBox/ValidationKit/testmanager/core/testbox.py

    r76553 r76886  
    504504                if uMod == 0x0a: return 'VIA_C7_C5J';
    505505                if uMod == 0x0f: return 'VIA_Isaiah';
     506        elif sCpuVendor == '  Shanghai  ':
     507            if uFam == 0x07:
     508                if uMod == 0x0b: return 'Shanghai_KX-5000';
    506509        return None;
    507510
     
    544547        if self.sCpuVendor == 'AuthenticAMD':     return 'AMD';
    545548        if self.sCpuVendor == 'CentaurHauls':     return 'VIA';
     549        if self.sCpuVendor == '  Shanghai  ':     return 'Shanghai';
    546550        return self.sCpuVendor;
    547551
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