diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/cmake/cpuinfo.cmake | 5 | ||||
| -rw-r--r-- | indra/llcommon/CMakeLists.txt | 7 | ||||
| -rw-r--r-- | indra/llcommon/llprocessor.cpp | 63 | 
3 files changed, 75 insertions, 0 deletions
| diff --git a/indra/cmake/cpuinfo.cmake b/indra/cmake/cpuinfo.cmake new file mode 100644 index 0000000000..10fcab8e40 --- /dev/null +++ b/indra/cmake/cpuinfo.cmake @@ -0,0 +1,5 @@ +include(Prebuilt) + +add_library( ll::cpuinfo INTERFACE IMPORTED ) + +use_system_binary(cpuinfo) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 04d14ff321..670eb0fd0b 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -11,6 +11,9 @@ include(LLSharedLibs)  include(ZLIBNG)  include(Tracy) +if ($ENV{MSYSTEM_CARCH} MATCHES aarch64) +  include(cpuinfo) +endif ()  set(llcommon_SOURCE_FILES      apply.cpp @@ -282,6 +285,10 @@ target_link_libraries(          ll::tracy      ) +if ($ENV{MSYSTEM_CARCH} MATCHES aarch64) +  target_link_libraries(llcommon ll::cpuinfo) +endif () +  target_include_directories(llcommon INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})  target_include_directories(llcommon PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp index 9b3cdf4df5..434501af77 100644 --- a/indra/llcommon/llprocessor.cpp +++ b/indra/llcommon/llprocessor.cpp @@ -40,6 +40,9 @@  #   include <intrin.h>  #   undef _interlockedbittestandset  #   undef _interlockedbittestandreset +#if _M_ARM64 +#   include <cpuinfo.h> +#endif  #endif  #include "llsd.h" @@ -439,13 +442,21 @@ static F64 calculate_cpu_frequency(U32 measure_msecs)      //// completed now (serialization)      //__asm cpuid      int cpu_info[4] = {-1}; +#if _M_ARM64 +    std::fill(cpu_info, cpu_info + 4, 0); +#else      __cpuid(cpu_info, 0); +#endif      // We ask the high-res timer for the start time      QueryPerformanceCounter((LARGE_INTEGER *) &starttime);      // Then we get the current cpu clock and store it +#if _M_ARM64 +    start = _ReadStatusReg(ARM64_PMCCNTR_EL0); +#else      start = __rdtsc(); +#endif      // Now we wart for some msecs      _Delay(measure_msecs); @@ -455,7 +466,11 @@ static F64 calculate_cpu_frequency(U32 measure_msecs)      QueryPerformanceCounter((LARGE_INTEGER *) &endtime);      // And also for the end cpu clock +#if _M_ARM64 +    end = _ReadStatusReg(ARM64_PMCCNTR_EL0); +#else      end = __rdtsc(); +#endif      // Now we can restore the default process and thread priorities      SetProcessAffinityMask(hProcess, dwProcessMask); @@ -495,17 +510,60 @@ private:          // the other three array elements. The CPU identification string is          // not in linear order. The code below arranges the information          // in a human readable form. +#if _M_ARM64 +        cpuinfo_initialize(); +#else          int cpu_info[4] = {-1};          __cpuid(cpu_info, 0);          unsigned int ids = (unsigned int)cpu_info[0];          setConfig(eMaxID, (S32)ids); +#endif          char cpu_vendor[0x20];          memset(cpu_vendor, 0, sizeof(cpu_vendor)); +#if _M_ARM64 +        switch (cpuinfo_get_current_core()->vendor) +        { +            case cpuinfo_vendor_unknown: +                setInfo(eVendor, "Unknown"); +                break; +            case cpuinfo_vendor_arm: +                setInfo(eVendor, "ARM"); +                break; +            case cpuinfo_vendor_qualcomm: +                setInfo(eVendor, "Qualcomm"); +                break; +            case cpuinfo_vendor_apple: +                setInfo(eVendor, "Apple"); +                break; +            case cpuinfo_vendor_samsung: +                setInfo(eVendor, "Samsung"); +                break; +            case cpuinfo_vendor_nvidia: +                setInfo(eVendor, "Nvidia"); +                break; +            case cpuinfo_vendor_cavium: +                setInfo(eVendor, "Cavium"); +                break; +            case cpuinfo_vendor_broadcom: +                setInfo(eVendor, "Broadcom"); +                break; +            case cpuinfo_vendor_apm: +                setInfo(eVendor, "APM"); +                break; +            case cpuinfo_vendor_huawei: +                setInfo(eVendor, "Huawei"); +                break; +            default: +                setInfo(eVendor, "Unknown"); +                break; +        } +#else          *((int*)cpu_vendor) = cpu_info[1];          *((int*)(cpu_vendor+4)) = cpu_info[3];          *((int*)(cpu_vendor+8)) = cpu_info[2];          setInfo(eVendor, cpu_vendor); +#endif          std::string cmp_vendor(cpu_vendor);          bool is_amd = false;          if (cmp_vendor == "AuthenticAMD") @@ -513,6 +571,10 @@ private:              is_amd = true;          } +#if _M_ARM64 +        setInfo(eModel, cpuinfo_get_package(0)->name); +        setInfo(eType, cpuinfo_get_uarch(0)->uarch); +#else          // Get the information associated with each valid Id          for(unsigned int i=0; i<=ids; ++i)          { @@ -623,6 +685,7 @@ private:                  setConfig(eCacheSizeK, (cpu_info[2] >> 16) & 0xffff);              }          } +#endif      }  }; | 
