123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- package cpuid
- import "runtime"
- func getMidr() (midr uint64)
- func getProcFeatures() (procFeatures uint64)
- func getInstAttributes() (instAttrReg0, instAttrReg1 uint64)
- func initCPU() {
- cpuid = func(uint32) (a, b, c, d uint32) { return 0, 0, 0, 0 }
- cpuidex = func(x, y uint32) (a, b, c, d uint32) { return 0, 0, 0, 0 }
- xgetbv = func(uint32) (a, b uint32) { return 0, 0 }
- rdtscpAsm = func() (a, b, c, d uint32) { return 0, 0, 0, 0 }
- }
- func addInfo(c *CPUInfo, safe bool) {
-
- c.CacheLine = 64
- detectOS(c)
-
- if safe && !c.Supports(ARMCPUID) && runtime.GOOS != "freebsd" {
- return
- }
- midr := getMidr()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- switch (midr >> 24) & 0xff {
- case 0xC0:
- c.VendorString = "Ampere Computing"
- c.VendorID = Ampere
- case 0x41:
- c.VendorString = "Arm Limited"
- c.VendorID = ARM
- case 0x42:
- c.VendorString = "Broadcom Corporation"
- c.VendorID = Broadcom
- case 0x43:
- c.VendorString = "Cavium Inc"
- c.VendorID = Cavium
- case 0x44:
- c.VendorString = "Digital Equipment Corporation"
- c.VendorID = DEC
- case 0x46:
- c.VendorString = "Fujitsu Ltd"
- c.VendorID = Fujitsu
- case 0x49:
- c.VendorString = "Infineon Technologies AG"
- c.VendorID = Infineon
- case 0x4D:
- c.VendorString = "Motorola or Freescale Semiconductor Inc"
- c.VendorID = Motorola
- case 0x4E:
- c.VendorString = "NVIDIA Corporation"
- c.VendorID = NVIDIA
- case 0x50:
- c.VendorString = "Applied Micro Circuits Corporation"
- c.VendorID = AMCC
- case 0x51:
- c.VendorString = "Qualcomm Inc"
- c.VendorID = Qualcomm
- case 0x56:
- c.VendorString = "Marvell International Ltd"
- c.VendorID = Marvell
- case 0x69:
- c.VendorString = "Intel Corporation"
- c.VendorID = Intel
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- c.Family = int(midr>>16) & 0xff
-
-
-
-
-
-
- c.Model = int(midr) & 0xffff
- procFeatures := getProcFeatures()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var f flagSet
-
-
-
- f.setIf(procFeatures&(0xf<<32) != 0, SVE)
- if procFeatures&(0xf<<20) != 15<<20 {
- f.set(ASIMD)
-
-
- f.setIf(procFeatures&(0xf<<20) == 1<<20, FPHP, ASIMDHP)
- }
- f.setIf(procFeatures&(0xf<<16) != 0, FP)
- instAttrReg0, instAttrReg1 := getInstAttributes()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- f.setIf(instAttrReg0&(0xf<<44) != 0, ASIMDDP)
- f.setIf(instAttrReg0&(0xf<<40) != 0, SM4)
- f.setIf(instAttrReg0&(0xf<<36) != 0, SM3)
- f.setIf(instAttrReg0&(0xf<<32) != 0, SHA3)
- f.setIf(instAttrReg0&(0xf<<28) != 0, ASIMDRDM)
- f.setIf(instAttrReg0&(0xf<<20) != 0, ATOMICS)
- f.setIf(instAttrReg0&(0xf<<16) != 0, CRC32)
- f.setIf(instAttrReg0&(0xf<<12) != 0, SHA2)
-
-
- f.setIf(instAttrReg0&(0xf<<12) == 2<<12, SHA512)
- f.setIf(instAttrReg0&(0xf<<8) != 0, SHA1)
- f.setIf(instAttrReg0&(0xf<<4) != 0, AESARM)
-
-
- f.setIf(instAttrReg0&(0xf<<4) == 2<<4, PMULL)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- f.setIf(instAttrReg1&(0xf<<28) != 24, GPA)
- f.setIf(instAttrReg1&(0xf<<20) != 0, LRCPC)
- f.setIf(instAttrReg1&(0xf<<16) != 0, FCMA)
- f.setIf(instAttrReg1&(0xf<<12) != 0, JSCVT)
-
-
-
-
-
-
- f.setIf(instAttrReg1&(0xf<<0) != 0, DCPOP)
-
- c.featureSet.or(f)
- }
|