CPU.cpp
1 /* 2 * Copyright (C) 2019 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "CPU.h" 28 29 #if (CPU(X86) || CPU(X86_64)) && OS(DARWIN) 30 #include <mutex> 31 #include <sys/sysctl.h> 32 #endif 33 34 namespace JSC { 35 36 #if (CPU(X86) || CPU(X86_64)) && OS(DARWIN) 37 bool isKernTCSMAvailable() 38 { 39 if (!Options::useKernTCSM()) 40 return false; 41 42 uint32_t val = 0; 43 size_t valSize = sizeof(val); 44 int rc = sysctlbyname("kern.tcsm_available", &val, &valSize, nullptr, 0); 45 if (rc < 0) 46 return false; 47 return !!val; 48 } 49 50 bool enableKernTCSM() 51 { 52 uint32_t val = 1; 53 int rc = sysctlbyname("kern.tcsm_enable", nullptr, nullptr, &val, sizeof(val)); 54 if (rc < 0) 55 return false; 56 return true; 57 } 58 59 int kernTCSMAwareNumberOfProcessorCores() 60 { 61 static std::once_flag onceFlag; 62 static int result; 63 std::call_once(onceFlag, [] { 64 result = WTF::numberOfProcessorCores(); 65 if (result <= 1) 66 return; 67 if (isKernTCSMAvailable()) 68 --result; 69 }); 70 return result; 71 } 72 73 int64_t hwL3CacheSize() 74 { 75 int64_t val = 0; 76 size_t valSize = sizeof(val); 77 int rc = sysctlbyname("hw.l3cachesize", &val, &valSize, nullptr, 0); 78 if (rc < 0) 79 return 0; 80 return val; 81 } 82 83 int32_t hwPhysicalCPUMax() 84 { 85 int32_t val = 0; 86 size_t valSize = sizeof(val); 87 int rc = sysctlbyname("hw.physicalcpu_max", &val, &valSize, nullptr, 0); 88 if (rc < 0) 89 return 0; 90 return val; 91 } 92 93 #endif // #if (CPU(X86) || CPU(X86_64)) && OS(DARWIN) 94 95 } // namespace JSC