cpuid_other.go raw

   1  // Minio Cloud Storage, (C) 2021 Minio, Inc.
   2  //
   3  // Licensed under the Apache License, Version 2.0 (the "License");
   4  // you may not use this file except in compliance with the License.
   5  // You may obtain a copy of the License at
   6  //
   7  //     http://www.apache.org/licenses/LICENSE-2.0
   8  //
   9  // Unless required by applicable law or agreed to in writing, software
  10  // distributed under the License is distributed on an "AS IS" BASIS,
  11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12  // See the License for the specific language governing permissions and
  13  // limitations under the License.
  14  //
  15  
  16  package sha256
  17  
  18  import (
  19  	"bytes"
  20  	"io/ioutil"
  21  	"runtime"
  22  
  23  	"github.com/klauspost/cpuid/v2"
  24  )
  25  
  26  var (
  27  	hasIntelSha = runtime.GOARCH == "amd64" && cpuid.CPU.Supports(cpuid.SHA, cpuid.SSSE3, cpuid.SSE4)
  28  	hasAvx512   = cpuid.CPU.Supports(cpuid.AVX512F, cpuid.AVX512DQ, cpuid.AVX512BW, cpuid.AVX512VL)
  29  )
  30  
  31  func hasArmSha2() bool {
  32  	if cpuid.CPU.Has(cpuid.SHA2) {
  33  		return true
  34  	}
  35  	if runtime.GOARCH != "arm64" || runtime.GOOS != "linux" {
  36  		return false
  37  	}
  38  
  39  	// Fall back to hacky cpuinfo parsing...
  40  	const procCPUInfo = "/proc/cpuinfo"
  41  
  42  	// Feature to check for.
  43  	const sha256Feature = "sha2"
  44  
  45  	cpuInfo, err := ioutil.ReadFile(procCPUInfo)
  46  	if err != nil {
  47  		return false
  48  	}
  49  	return bytes.Contains(cpuInfo, []byte(sha256Feature))
  50  }
  51