1// Copyright 2017 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5// +build ppc64 ppc64le 6 7package cpu 8 9const CacheLineSize = 128 10 11// ppc64x doesn't have a 'cpuid' equivalent, so we rely on HWCAP/HWCAP2. 12// These are linknamed in runtime/os_linux_ppc64x.go and are initialized by 13// archauxv(). 14var hwcap uint 15var hwcap2 uint 16 17// HWCAP/HWCAP2 bits. These are exposed by the kernel. 18const ( 19 // ISA Level 20 _PPC_FEATURE2_ARCH_2_07 = 0x80000000 21 _PPC_FEATURE2_ARCH_3_00 = 0x00800000 22 23 // CPU features 24 _PPC_FEATURE_HAS_ALTIVEC = 0x10000000 25 _PPC_FEATURE_HAS_DFP = 0x00000400 26 _PPC_FEATURE_HAS_VSX = 0x00000080 27 _PPC_FEATURE2_HAS_HTM = 0x40000000 28 _PPC_FEATURE2_HAS_ISEL = 0x08000000 29 _PPC_FEATURE2_HAS_VEC_CRYPTO = 0x02000000 30 _PPC_FEATURE2_HTM_NOSC = 0x01000000 31 _PPC_FEATURE2_DARN = 0x00200000 32 _PPC_FEATURE2_SCV = 0x00100000 33) 34 35func doinit() { 36 options = []option{ 37 {"htm", &PPC64.HasHTM}, 38 {"htmnosc", &PPC64.HasHTMNOSC}, 39 {"darn", &PPC64.HasDARN}, 40 {"scv", &PPC64.HasSCV}, 41 42 // These capabilities should always be enabled on ppc64 and ppc64le: 43 // {"vmx", &PPC64.HasVMX}, 44 // {"dfp", &PPC64.HasDFP}, 45 // {"vsx", &PPC64.HasVSX}, 46 // {"isel", &PPC64.HasISEL}, 47 // {"vcrypto", &PPC64.HasVCRYPTO}, 48 } 49 50 // HWCAP feature bits 51 PPC64.HasVMX = isSet(hwcap, _PPC_FEATURE_HAS_ALTIVEC) 52 PPC64.HasDFP = isSet(hwcap, _PPC_FEATURE_HAS_DFP) 53 PPC64.HasVSX = isSet(hwcap, _PPC_FEATURE_HAS_VSX) 54 55 // HWCAP2 feature bits 56 PPC64.IsPOWER8 = isSet(hwcap2, _PPC_FEATURE2_ARCH_2_07) 57 PPC64.HasHTM = isSet(hwcap2, _PPC_FEATURE2_HAS_HTM) 58 PPC64.HasISEL = isSet(hwcap2, _PPC_FEATURE2_HAS_ISEL) 59 PPC64.HasVCRYPTO = isSet(hwcap2, _PPC_FEATURE2_HAS_VEC_CRYPTO) 60 PPC64.HasHTMNOSC = isSet(hwcap2, _PPC_FEATURE2_HTM_NOSC) 61 PPC64.IsPOWER9 = isSet(hwcap2, _PPC_FEATURE2_ARCH_3_00) 62 PPC64.HasDARN = isSet(hwcap2, _PPC_FEATURE2_DARN) 63 PPC64.HasSCV = isSet(hwcap2, _PPC_FEATURE2_SCV) 64} 65 66func isSet(hwc uint, value uint) bool { 67 return hwc&value != 0 68} 69