gitlab.com/apertussolutions/u-root@v7.0.0+incompatible/pkg/smbios/type4_processor_information.go (about)

     1  // Copyright 2016-2019 the u-root 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  package smbios
     6  
     7  import (
     8  	"errors"
     9  	"fmt"
    10  	"strings"
    11  )
    12  
    13  // Much of this is auto-generated. If adding a new type, see README for instructions.
    14  
    15  // ProcessorInfo is defined in DSP0134 x.x.
    16  type ProcessorInfo struct {
    17  	Table
    18  	SocketDesignation string                   // 04h
    19  	Type              ProcessorType            // 05h
    20  	Family            uint8                    // 06h
    21  	Manufacturer      string                   // 07h
    22  	ID                uint64                   // 08h
    23  	Version           string                   // 10h
    24  	Voltage           uint8                    // 11h
    25  	ExternalClock     uint16                   // 12h
    26  	MaxSpeed          uint16                   // 14h
    27  	CurrentSpeed      uint16                   // 16h
    28  	Status            ProcessorStatus          // 18h
    29  	Upgrade           ProcessorUpgrade         // 19h
    30  	L1CacheHandle     uint16                   // 1Ah
    31  	L2CacheHandle     uint16                   // 1Ch
    32  	L3CacheHandle     uint16                   // 1Eh
    33  	SerialNumber      string                   // 20h
    34  	AssetTag          string                   // 21h
    35  	PartNumber        string                   // 22h
    36  	CoreCount         uint8                    // 23h
    37  	CoreEnabled       uint8                    // 24h
    38  	ThreadCount       uint8                    // 25h
    39  	Characteristics   ProcessorCharacteristics // 26h
    40  	Family2           ProcessorFamily          // 28h
    41  	CoreCount2        uint16                   // 2Ah
    42  	CoreEnabled2      uint16                   // 2Ch
    43  	ThreadCount2      uint16                   // 2Eh
    44  }
    45  
    46  // ParseProcessorInfo parses a generic Table into ProcessorInfo.
    47  func ParseProcessorInfo(t *Table) (*ProcessorInfo, error) {
    48  	if t.Type != TableTypeProcessorInfo {
    49  		return nil, fmt.Errorf("invalid table type %d", t.Type)
    50  	}
    51  	if t.Len() < 0x1a {
    52  		return nil, errors.New("required fields missing")
    53  	}
    54  	pi := &ProcessorInfo{Table: *t}
    55  	_, err := parseStruct(t, 0 /* off */, false /* complete */, pi)
    56  	if err != nil {
    57  		return nil, err
    58  	}
    59  	return pi, nil
    60  }
    61  
    62  // GetFamily returns the processor family, taken from the appropriate field.
    63  func (pi *ProcessorInfo) GetFamily() ProcessorFamily {
    64  	if pi.Family == 0xfe && pi.Len() >= 0x2a {
    65  		return pi.Family2
    66  	}
    67  	return ProcessorFamily(pi.Family)
    68  }
    69  
    70  // GetVoltage returns the processor voltage, in volts.
    71  func (pi *ProcessorInfo) GetVoltage() float32 {
    72  	if pi.Voltage&0x80 == 0 {
    73  		switch {
    74  		case pi.Voltage&1 != 0:
    75  			return 5.0
    76  		case pi.Voltage&2 != 0:
    77  			return 3.3
    78  		case pi.Voltage&4 != 0:
    79  			return 2.9
    80  		}
    81  		return 0
    82  	}
    83  	return float32(pi.Voltage&0x7f) / 10.0
    84  }
    85  
    86  // GetCoreCount returns the number of cores detected by the BIOS for this processor socket.
    87  func (pi *ProcessorInfo) GetCoreCount() int {
    88  	if pi.Len() >= 0x2c && pi.CoreCount == 0xff {
    89  		return int(pi.CoreCount2)
    90  	}
    91  	return int(pi.CoreCount)
    92  }
    93  
    94  // GetCoreEnabled returns the number of cores that are enabled by the BIOS and available for Operating System use.
    95  func (pi *ProcessorInfo) GetCoreEnabled() int {
    96  	if pi.Len() >= 0x2e && pi.CoreEnabled == 0xff {
    97  		return int(pi.CoreEnabled2)
    98  	}
    99  	return int(pi.CoreEnabled)
   100  }
   101  
   102  // GetThreadCount returns the total number of threads detected by the BIOS for this processor socket.
   103  func (pi *ProcessorInfo) GetThreadCount() int {
   104  	if pi.Len() >= 0x30 && pi.ThreadCount == 0xff {
   105  		return int(pi.ThreadCount2)
   106  	}
   107  	return int(pi.ThreadCount)
   108  }
   109  
   110  func (pi *ProcessorInfo) String() string {
   111  	freqStr := func(v uint16) string {
   112  		if v == 0 {
   113  			return "Unknown"
   114  		}
   115  		return fmt.Sprintf("%d MHz", v)
   116  	}
   117  	cacheHandleStr := func(h uint16) string {
   118  		if h == 0xffff {
   119  			return "Not Provided"
   120  		}
   121  		return fmt.Sprintf("0x%04X", h)
   122  	}
   123  	f := pi.GetFamily()
   124  	sig := ""
   125  	haveFlags := false
   126  	switch {
   127  	// Intel
   128  	case (f >= 0x0B && f <= 0x15) || /* Intel, Cyrix */
   129  		(f >= 0x28 && f <= 0x2F) ||
   130  		(f >= 0xA1 && f <= 0xB3) ||
   131  		f == 0xB5 ||
   132  		(f >= 0xB9 && f <= 0xC7) ||
   133  		(f >= 0xCD && f <= 0xCF) ||
   134  		(f >= 0xD2 && f <= 0xDB) || /* VIA, Intel */
   135  		(f >= 0xDD && f <= 0xE0):
   136  		eax := uint32(pi.ID & 0xffffffff)
   137  		sig = fmt.Sprintf("Type %d, Family %d, Model %d, Stepping %d",
   138  			(eax>>12)&0x3, ((eax>>20)&0xff)+((eax>>8)&0xf), ((eax>>12)&0xf0)+((eax>>4)&0xf), eax&0xf)
   139  		haveFlags = true
   140  	// AMD
   141  	case (f >= 0x18 && f <= 0x1D) ||
   142  		f == 0x1F ||
   143  		(f >= 0x38 && f <= 0x3F) ||
   144  		(f >= 0x46 && f <= 0x4F) ||
   145  		(f >= 0x66 && f <= 0x6B) ||
   146  		(f >= 0x83 && f <= 0x8F) ||
   147  		(f >= 0xB6 && f <= 0xB7) ||
   148  		(f >= 0xE4 && f <= 0xEF):
   149  		eax := uint32(pi.ID & 0xffffffff)
   150  		fam := (eax >> 8) & 0xf
   151  		if ((eax >> 8) & 0xf) == 0xf {
   152  			fam += (eax >> 20) & 0xff
   153  		}
   154  		mod := (eax >> 4) & 0xf
   155  		if ((eax >> 8) & 0xf) == 0xf {
   156  			mod += (eax >> 12) & 0xf0
   157  		}
   158  		sig = fmt.Sprintf("Family %d, Model %d, Stepping %d", fam, mod, eax&0xf)
   159  		haveFlags = true
   160  	// ARM
   161  	case (f >= 0x100 && f <= 0x101) ||
   162  		(f >= 0x118 && f <= 0x119):
   163  		if midr := uint32(pi.ID & 0xffffffff); midr != 0 {
   164  			sig = fmt.Sprintf("Implementor 0x%02x, Variant 0x%x, Architecture %d, Part 0x%03x, Revision %d",
   165  				midr>>24, (midr>>20)&0xf, (midr>>16)&0xf, (midr>>4)&0xfff, midr&0xf)
   166  		}
   167  	}
   168  	lines := []string{
   169  		pi.Header.String(),
   170  		fmt.Sprintf("Socket Designation: %s", pi.SocketDesignation),
   171  		fmt.Sprintf("Type: %s", pi.Type),
   172  		fmt.Sprintf("Family: %s", pi.GetFamily()),
   173  		fmt.Sprintf("Manufacturer: %s", pi.Manufacturer),
   174  		fmt.Sprintf("ID: %02X %02X %02X %02X %02X %02X %02X %02X",
   175  			(pi.ID>>0)&0xff, (pi.ID>>8)&0xff, (pi.ID>>16)&0xff, (pi.ID>>24)&0xff,
   176  			(pi.ID>>32)&0xff, (pi.ID>>40)&0xff, (pi.ID>>48)&0xff, (pi.ID>>56)&0xff,
   177  		),
   178  	}
   179  	if sig != "" {
   180  		lines = append(lines, fmt.Sprintf("Signature: %s", sig))
   181  	}
   182  	if haveFlags {
   183  		lines = append(lines, "Flags:")
   184  		edx := uint32(pi.ID >> 32)
   185  		for n, s := range [32]string{
   186  			"FPU (Floating-point unit on-chip)", /* 0 */
   187  			"VME (Virtual mode extension)",
   188  			"DE (Debugging extension)",
   189  			"PSE (Page size extension)",
   190  			"TSC (Time stamp counter)",
   191  			"MSR (Model specific registers)",
   192  			"PAE (Physical address extension)",
   193  			"MCE (Machine check exception)",
   194  			"CX8 (CMPXCHG8 instruction supported)",
   195  			"APIC (On-chip APIC hardware supported)",
   196  			"", /* 10 */
   197  			"SEP (Fast system call)",
   198  			"MTRR (Memory type range registers)",
   199  			"PGE (Page global enable)",
   200  			"MCA (Machine check architecture)",
   201  			"CMOV (Conditional move instruction supported)",
   202  			"PAT (Page attribute table)",
   203  			"PSE-36 (36-bit page size extension)",
   204  			"PSN (Processor serial number present and enabled)",
   205  			"CLFSH (CLFLUSH instruction supported)",
   206  			"", /* 20 */
   207  			"DS (Debug store)",
   208  			"ACPI (ACPI supported)",
   209  			"MMX (MMX technology supported)",
   210  			"FXSR (FXSAVE and FXSTOR instructions supported)",
   211  			"SSE (Streaming SIMD extensions)",
   212  			"SSE2 (Streaming SIMD extensions 2)",
   213  			"SS (Self-snoop)",
   214  			"HTT (Multi-threading)",
   215  			"TM (Thermal monitor supported)",
   216  			"",                            /* 30 */
   217  			"PBE (Pending break enabled)", /* 31 */
   218  		} {
   219  			if edx&(1<<uint(n)) != 0 && s != "" {
   220  				lines = append(lines, "\t"+s)
   221  			}
   222  		}
   223  	}
   224  	lines = append(lines,
   225  		fmt.Sprintf("Version: %s", pi.Version),
   226  		fmt.Sprintf("Voltage: %.1f V", pi.GetVoltage()),
   227  		fmt.Sprintf("External Clock: %s", freqStr(pi.ExternalClock)),
   228  		fmt.Sprintf("Max Speed: %s", freqStr(pi.MaxSpeed)),
   229  		fmt.Sprintf("Current Speed: %s", freqStr(pi.CurrentSpeed)),
   230  		fmt.Sprintf("Status: %s", pi.Status),
   231  		fmt.Sprintf("Upgrade: %s", pi.Upgrade),
   232  	)
   233  	if pi.Len() > 0x1a {
   234  		lines = append(lines,
   235  			fmt.Sprintf("L1 Cache Handle: %s", cacheHandleStr(pi.L1CacheHandle)),
   236  			fmt.Sprintf("L2 Cache Handle: %s", cacheHandleStr(pi.L2CacheHandle)),
   237  			fmt.Sprintf("L3 Cache Handle: %s", cacheHandleStr(pi.L3CacheHandle)),
   238  		)
   239  	}
   240  	if pi.Len() > 0x20 {
   241  		lines = append(lines,
   242  			fmt.Sprintf("Serial Number: %s", pi.SerialNumber),
   243  			fmt.Sprintf("Asset Tag: %s", pi.AssetTag),
   244  			fmt.Sprintf("Part Number: %s", pi.PartNumber),
   245  		)
   246  	}
   247  	if pi.Len() > 0x23 {
   248  		lines = append(lines,
   249  			fmt.Sprintf("Core Count: %d", pi.GetCoreCount()),
   250  			fmt.Sprintf("Core Enabled: %d", pi.GetCoreEnabled()),
   251  		)
   252  		if pi.GetThreadCount() > 0 {
   253  			lines = append(lines, fmt.Sprintf("Thread Count: %d", pi.GetThreadCount()))
   254  		}
   255  		lines = append(lines, fmt.Sprintf("Characteristics:\n%s", pi.Characteristics))
   256  	}
   257  	return strings.Join(lines, "\n\t")
   258  }
   259  
   260  // ProcessorType is defined in DSP0134 7.5.1.
   261  type ProcessorType uint8
   262  
   263  // ProcessorType values are defined in DSP0134 7.5.1.
   264  const (
   265  	ProcessorTypeOther            ProcessorType = 0x01 // Other
   266  	ProcessorTypeUnknown          ProcessorType = 0x02 // Unknown
   267  	ProcessorTypeCentralProcessor ProcessorType = 0x03 // Central Processor
   268  	ProcessorTypeMathProcessor    ProcessorType = 0x04 // Math Processor
   269  	ProcessorTypeDSPProcessor     ProcessorType = 0x05 // DSP Processor
   270  	ProcessorTypeVideoProcessor   ProcessorType = 0x06 // Video Processor
   271  )
   272  
   273  func (v ProcessorType) String() string {
   274  	names := map[ProcessorType]string{
   275  		ProcessorTypeOther:            "Other",
   276  		ProcessorTypeUnknown:          "Unknown",
   277  		ProcessorTypeCentralProcessor: "Central Processor",
   278  		ProcessorTypeMathProcessor:    "Math Processor",
   279  		ProcessorTypeDSPProcessor:     "DSP Processor",
   280  		ProcessorTypeVideoProcessor:   "Video Processor",
   281  	}
   282  	if name, ok := names[v]; ok {
   283  		return name
   284  	}
   285  	return fmt.Sprintf("%#x", uint8(v))
   286  }
   287  
   288  // ProcessorFamily is defined in DSP0134 7.5.2.
   289  type ProcessorFamily uint16
   290  
   291  // ProcessorFamily values are defined in DSP0134 7.5.2.
   292  const (
   293  	ProcessorFamilyOther                        ProcessorFamily = 0x01  // Other
   294  	ProcessorFamilyUnknown                      ProcessorFamily = 0x02  // Unknown
   295  	ProcessorFamily8086                         ProcessorFamily = 0x03  // 8086
   296  	ProcessorFamily80286                        ProcessorFamily = 0x04  // 80286
   297  	ProcessorFamily80386                        ProcessorFamily = 0x05  // 80386
   298  	ProcessorFamily80486                        ProcessorFamily = 0x06  // 80486
   299  	ProcessorFamily8087                         ProcessorFamily = 0x07  // 8087
   300  	ProcessorFamily80287                        ProcessorFamily = 0x08  // 80287
   301  	ProcessorFamily80387                        ProcessorFamily = 0x09  // 80387
   302  	ProcessorFamily80487                        ProcessorFamily = 0x0a  // 80487
   303  	ProcessorFamilyPentium                      ProcessorFamily = 0x0b  // Pentium
   304  	ProcessorFamilyPentiumPro                   ProcessorFamily = 0x0c  // Pentium Pro
   305  	ProcessorFamilyPentiumII                    ProcessorFamily = 0x0d  // Pentium II
   306  	ProcessorFamilyPentiumMMX                   ProcessorFamily = 0x0e  // Pentium MMX
   307  	ProcessorFamilyCeleron                      ProcessorFamily = 0x0f  // Celeron
   308  	ProcessorFamilyPentiumIIXeon                ProcessorFamily = 0x10  // Pentium II Xeon
   309  	ProcessorFamilyPentiumIII                   ProcessorFamily = 0x11  // Pentium III
   310  	ProcessorFamilyM1                           ProcessorFamily = 0x12  // M1
   311  	ProcessorFamilyM2                           ProcessorFamily = 0x13  // M2
   312  	ProcessorFamilyCeleronM                     ProcessorFamily = 0x14  // Celeron M
   313  	ProcessorFamilyPentium4HT                   ProcessorFamily = 0x15  // Pentium 4 HT
   314  	ProcessorFamilyDuron                        ProcessorFamily = 0x18  // Duron
   315  	ProcessorFamilyK5                           ProcessorFamily = 0x19  // K5
   316  	ProcessorFamilyK6                           ProcessorFamily = 0x1a  // K6
   317  	ProcessorFamilyK62                          ProcessorFamily = 0x1b  // K6-2
   318  	ProcessorFamilyK63                          ProcessorFamily = 0x1c  // K6-3
   319  	ProcessorFamilyAthlon                       ProcessorFamily = 0x1d  // Athlon
   320  	ProcessorFamilyAMD29000                     ProcessorFamily = 0x1e  // AMD29000
   321  	ProcessorFamilyK62Plus                      ProcessorFamily = 0x1f  // K6-2+
   322  	ProcessorFamilyPowerPC                      ProcessorFamily = 0x20  // Power PC
   323  	ProcessorFamilyPowerPC601                   ProcessorFamily = 0x21  // Power PC 601
   324  	ProcessorFamilyPowerPC603                   ProcessorFamily = 0x22  // Power PC 603
   325  	ProcessorFamilyPowerPC603Plus               ProcessorFamily = 0x23  // Power PC 603+
   326  	ProcessorFamilyPowerPC604                   ProcessorFamily = 0x24  // Power PC 604
   327  	ProcessorFamilyPowerPC620                   ProcessorFamily = 0x25  // Power PC 620
   328  	ProcessorFamilyPowerPCX704                  ProcessorFamily = 0x26  // Power PC x704
   329  	ProcessorFamilyPowerPC750                   ProcessorFamily = 0x27  // Power PC 750
   330  	ProcessorFamilyCoreDuo                      ProcessorFamily = 0x28  // Core Duo
   331  	ProcessorFamilyCoreDuoMobile                ProcessorFamily = 0x29  // Core Duo Mobile
   332  	ProcessorFamilyCoreSoloMobile               ProcessorFamily = 0x2a  // Core Solo Mobile
   333  	ProcessorFamilyAtom                         ProcessorFamily = 0x2b  // Atom
   334  	ProcessorFamilyCoreM                        ProcessorFamily = 0x2c  // Core M
   335  	ProcessorFamilyCoreM3                       ProcessorFamily = 0x2d  // Core m3
   336  	ProcessorFamilyCoreM5                       ProcessorFamily = 0x2e  // Core m5
   337  	ProcessorFamilyCoreM7                       ProcessorFamily = 0x2f  // Core m7
   338  	ProcessorFamilyAlpha                        ProcessorFamily = 0x30  // Alpha
   339  	ProcessorFamilyAlpha21064                   ProcessorFamily = 0x31  // Alpha 21064
   340  	ProcessorFamilyAlpha21066                   ProcessorFamily = 0x32  // Alpha 21066
   341  	ProcessorFamilyAlpha21164                   ProcessorFamily = 0x33  // Alpha 21164
   342  	ProcessorFamilyAlpha21164PC                 ProcessorFamily = 0x34  // Alpha 21164PC
   343  	ProcessorFamilyAlpha21164a                  ProcessorFamily = 0x35  // Alpha 21164a
   344  	ProcessorFamilyAlpha21264                   ProcessorFamily = 0x36  // Alpha 21264
   345  	ProcessorFamilyAlpha21364                   ProcessorFamily = 0x37  // Alpha 21364
   346  	ProcessorFamilyTurionIIUltraDualCoreMobileM ProcessorFamily = 0x38  // Turion II Ultra Dual-Core Mobile M
   347  	ProcessorFamilyTurionIIDualCoreMobileM      ProcessorFamily = 0x39  // Turion II Dual-Core Mobile M
   348  	ProcessorFamilyAthlonIIDualCoreM            ProcessorFamily = 0x3a  // Athlon II Dual-Core M
   349  	ProcessorFamilyOpteron6100                  ProcessorFamily = 0x3b  // Opteron 6100
   350  	ProcessorFamilyOpteron4100                  ProcessorFamily = 0x3c  // Opteron 4100
   351  	ProcessorFamilyOpteron6200                  ProcessorFamily = 0x3d  // Opteron 6200
   352  	ProcessorFamilyOpteron4200                  ProcessorFamily = 0x3e  // Opteron 4200
   353  	ProcessorFamilyFX                           ProcessorFamily = 0x3f  // FX
   354  	ProcessorFamilyMIPS                         ProcessorFamily = 0x40  // MIPS
   355  	ProcessorFamilyMIPSR4000                    ProcessorFamily = 0x41  // MIPS R4000
   356  	ProcessorFamilyMIPSR4200                    ProcessorFamily = 0x42  // MIPS R4200
   357  	ProcessorFamilyMIPSR4400                    ProcessorFamily = 0x43  // MIPS R4400
   358  	ProcessorFamilyMIPSR4600                    ProcessorFamily = 0x44  // MIPS R4600
   359  	ProcessorFamilyMIPSR10000                   ProcessorFamily = 0x45  // MIPS R10000
   360  	ProcessorFamilyCSeries                      ProcessorFamily = 0x46  // C-Series
   361  	ProcessorFamilyESeries                      ProcessorFamily = 0x47  // E-Series
   362  	ProcessorFamilyASeries                      ProcessorFamily = 0x48  // A-Series
   363  	ProcessorFamilyGSeries                      ProcessorFamily = 0x49  // G-Series
   364  	ProcessorFamilyZSeries                      ProcessorFamily = 0x4a  // Z-Series
   365  	ProcessorFamilyRSeries                      ProcessorFamily = 0x4b  // R-Series
   366  	ProcessorFamilyOpteron4300                  ProcessorFamily = 0x4c  // Opteron 4300
   367  	ProcessorFamilyOpteron6300                  ProcessorFamily = 0x4d  // Opteron 6300
   368  	ProcessorFamilyOpteron3300                  ProcessorFamily = 0x4e  // Opteron 3300
   369  	ProcessorFamilyFirePro                      ProcessorFamily = 0x4f  // FirePro
   370  	ProcessorFamilySPARC                        ProcessorFamily = 0x50  // SPARC
   371  	ProcessorFamilySuperSPARC                   ProcessorFamily = 0x51  // SuperSPARC
   372  	ProcessorFamilyMicroSPARCII                 ProcessorFamily = 0x52  // MicroSPARC II
   373  	ProcessorFamilyMicroSPARCIIep               ProcessorFamily = 0x53  // MicroSPARC IIep
   374  	ProcessorFamilyUltraSPARC                   ProcessorFamily = 0x54  // UltraSPARC
   375  	ProcessorFamilyUltraSPARCII                 ProcessorFamily = 0x55  // UltraSPARC II
   376  	ProcessorFamilyUltraSPARCIIi                ProcessorFamily = 0x56  // UltraSPARC IIi
   377  	ProcessorFamilyUltraSPARCIII                ProcessorFamily = 0x57  // UltraSPARC III
   378  	ProcessorFamilyUltraSPARCIIIi               ProcessorFamily = 0x58  // UltraSPARC IIIi
   379  	ProcessorFamily68040                        ProcessorFamily = 0x60  // 68040
   380  	ProcessorFamily68xxx                        ProcessorFamily = 0x61  // 68xxx
   381  	ProcessorFamily68000                        ProcessorFamily = 0x62  // 68000
   382  	ProcessorFamily68010                        ProcessorFamily = 0x63  // 68010
   383  	ProcessorFamily68020                        ProcessorFamily = 0x64  // 68020
   384  	ProcessorFamily68030                        ProcessorFamily = 0x65  // 68030
   385  	ProcessorFamilyAthlonX4                     ProcessorFamily = 0x66  // Athlon X4
   386  	ProcessorFamilyOpteronX1000                 ProcessorFamily = 0x67  // Opteron X1000
   387  	ProcessorFamilyOpteronX2000                 ProcessorFamily = 0x68  // Opteron X2000
   388  	ProcessorFamilyOpteronASeries               ProcessorFamily = 0x69  // Opteron A-Series
   389  	ProcessorFamilyOpteronX3000                 ProcessorFamily = 0x6a  // Opteron X3000
   390  	ProcessorFamilyZen                          ProcessorFamily = 0x6b  // Zen
   391  	ProcessorFamilyHobbit                       ProcessorFamily = 0x70  // Hobbit
   392  	ProcessorFamilyCrusoeTM5000                 ProcessorFamily = 0x78  // Crusoe TM5000
   393  	ProcessorFamilyCrusoeTM3000                 ProcessorFamily = 0x79  // Crusoe TM3000
   394  	ProcessorFamilyEfficeonTM8000               ProcessorFamily = 0x7a  // Efficeon TM8000
   395  	ProcessorFamilyWeitek                       ProcessorFamily = 0x80  // Weitek
   396  	ProcessorFamilyItanium                      ProcessorFamily = 0x82  // Itanium
   397  	ProcessorFamilyAthlon64                     ProcessorFamily = 0x83  // Athlon 64
   398  	ProcessorFamilyOpteron                      ProcessorFamily = 0x84  // Opteron
   399  	ProcessorFamilySempron                      ProcessorFamily = 0x85  // Sempron
   400  	ProcessorFamilyTurion64                     ProcessorFamily = 0x86  // Turion 64
   401  	ProcessorFamilyDualCoreOpteron              ProcessorFamily = 0x87  // Dual-Core Opteron
   402  	ProcessorFamilyAthlon64X2                   ProcessorFamily = 0x88  // Athlon 64 X2
   403  	ProcessorFamilyTurion64X2                   ProcessorFamily = 0x89  // Turion 64 X2
   404  	ProcessorFamilyQuadCoreOpteron              ProcessorFamily = 0x8a  // Quad-Core Opteron
   405  	ProcessorFamilyThirdGenerationOpteron       ProcessorFamily = 0x8b  // Third-Generation Opteron
   406  	ProcessorFamilyPhenomFX                     ProcessorFamily = 0x8c  // Phenom FX
   407  	ProcessorFamilyPhenomX4                     ProcessorFamily = 0x8d  // Phenom X4
   408  	ProcessorFamilyPhenomX2                     ProcessorFamily = 0x8e  // Phenom X2
   409  	ProcessorFamilyAthlonX2                     ProcessorFamily = 0x8f  // Athlon X2
   410  	ProcessorFamilyPARISC                       ProcessorFamily = 0x90  // PA-RISC
   411  	ProcessorFamilyPARISC8500                   ProcessorFamily = 0x91  // PA-RISC 8500
   412  	ProcessorFamilyPARISC8000                   ProcessorFamily = 0x92  // PA-RISC 8000
   413  	ProcessorFamilyPARISC7300LC                 ProcessorFamily = 0x93  // PA-RISC 7300LC
   414  	ProcessorFamilyPARISC7200                   ProcessorFamily = 0x94  // PA-RISC 7200
   415  	ProcessorFamilyPARISC7100LC                 ProcessorFamily = 0x95  // PA-RISC 7100LC
   416  	ProcessorFamilyPARISC7100                   ProcessorFamily = 0x96  // PA-RISC 7100
   417  	ProcessorFamilyV30                          ProcessorFamily = 0xa0  // V30
   418  	ProcessorFamilyQuadCoreXeon3200             ProcessorFamily = 0xa1  // Quad-Core Xeon 3200
   419  	ProcessorFamilyDualCoreXeon3000             ProcessorFamily = 0xa2  // Dual-Core Xeon 3000
   420  	ProcessorFamilyQuadCoreXeon5300             ProcessorFamily = 0xa3  // Quad-Core Xeon 5300
   421  	ProcessorFamilyDualCoreXeon5100             ProcessorFamily = 0xa4  // Dual-Core Xeon 5100
   422  	ProcessorFamilyDualCoreXeon5000             ProcessorFamily = 0xa5  // Dual-Core Xeon 5000
   423  	ProcessorFamilyDualCoreXeonLV               ProcessorFamily = 0xa6  // Dual-Core Xeon LV
   424  	ProcessorFamilyDualCoreXeonULV              ProcessorFamily = 0xa7  // Dual-Core Xeon ULV
   425  	ProcessorFamilyDualCoreXeon7100             ProcessorFamily = 0xa8  // Dual-Core Xeon 7100
   426  	ProcessorFamilyQuadCoreXeon5400             ProcessorFamily = 0xa9  // Quad-Core Xeon 5400
   427  	ProcessorFamilyQuadCoreXeon                 ProcessorFamily = 0xaa  // Quad-Core Xeon
   428  	ProcessorFamilyDualCoreXeon5200             ProcessorFamily = 0xab  // Dual-Core Xeon 5200
   429  	ProcessorFamilyDualCoreXeon7200             ProcessorFamily = 0xac  // Dual-Core Xeon 7200
   430  	ProcessorFamilyQuadCoreXeon7300             ProcessorFamily = 0xad  // Quad-Core Xeon 7300
   431  	ProcessorFamilyQuadCoreXeon7400             ProcessorFamily = 0xae  // Quad-Core Xeon 7400
   432  	ProcessorFamilyMultiCoreXeon7400            ProcessorFamily = 0xaf  // Multi-Core Xeon 7400
   433  	ProcessorFamilyPentiumIIIXeon               ProcessorFamily = 0xb0  // Pentium III Xeon
   434  	ProcessorFamilyPentiumIIISpeedstep          ProcessorFamily = 0xb1  // Pentium III Speedstep
   435  	ProcessorFamilyPentium4                     ProcessorFamily = 0xb2  // Pentium 4
   436  	ProcessorFamilyXeon                         ProcessorFamily = 0xb3  // Xeon
   437  	ProcessorFamilyAS400                        ProcessorFamily = 0xb4  // AS400
   438  	ProcessorFamilyXeonMP                       ProcessorFamily = 0xb5  // Xeon MP
   439  	ProcessorFamilyAthlonXP                     ProcessorFamily = 0xb6  // Athlon XP
   440  	ProcessorFamilyAthlonMP                     ProcessorFamily = 0xb7  // Athlon MP
   441  	ProcessorFamilyItanium2                     ProcessorFamily = 0xb8  // Itanium 2
   442  	ProcessorFamilyPentiumM                     ProcessorFamily = 0xb9  // Pentium M
   443  	ProcessorFamilyCeleronD                     ProcessorFamily = 0xba  // Celeron D
   444  	ProcessorFamilyPentiumD                     ProcessorFamily = 0xbb  // Pentium D
   445  	ProcessorFamilyPentiumEE                    ProcessorFamily = 0xbc  // Pentium EE
   446  	ProcessorFamilyCoreSolo                     ProcessorFamily = 0xbd  // Core Solo
   447  	ProcessorFamilyHandledAsASpecialCase        ProcessorFamily = 0xbe  // handled as a special case */
   448  	ProcessorFamilyCore2Duo                     ProcessorFamily = 0xbf  // Core 2 Duo
   449  	ProcessorFamilyCore2Solo                    ProcessorFamily = 0xc0  // Core 2 Solo
   450  	ProcessorFamilyCore2Extreme                 ProcessorFamily = 0xc1  // Core 2 Extreme
   451  	ProcessorFamilyCore2Quad                    ProcessorFamily = 0xc2  // Core 2 Quad
   452  	ProcessorFamilyCore2ExtremeMobile           ProcessorFamily = 0xc3  // Core 2 Extreme Mobile
   453  	ProcessorFamilyCore2DuoMobile               ProcessorFamily = 0xc4  // Core 2 Duo Mobile
   454  	ProcessorFamilyCore2SoloMobile              ProcessorFamily = 0xc5  // Core 2 Solo Mobile
   455  	ProcessorFamilyCoreI7                       ProcessorFamily = 0xc6  // Core i7
   456  	ProcessorFamilyDualCoreCeleron              ProcessorFamily = 0xc7  // Dual-Core Celeron
   457  	ProcessorFamilyIBM390                       ProcessorFamily = 0xc8  // IBM390
   458  	ProcessorFamilyG4                           ProcessorFamily = 0xc9  // G4
   459  	ProcessorFamilyG5                           ProcessorFamily = 0xca  // G5
   460  	ProcessorFamilyESA390G6                     ProcessorFamily = 0xcb  // ESA/390 G6
   461  	ProcessorFamilyZarchitecture                ProcessorFamily = 0xcc  // z/Architecture
   462  	ProcessorFamilyCoreI5                       ProcessorFamily = 0xcd  // Core i5
   463  	ProcessorFamilyCoreI3                       ProcessorFamily = 0xce  // Core i3
   464  	ProcessorFamilyCoreI9                       ProcessorFamily = 0xcf  // Core i9
   465  	ProcessorFamilyC7M                          ProcessorFamily = 0xd2  // C7-M
   466  	ProcessorFamilyC7D                          ProcessorFamily = 0xd3  // C7-D
   467  	ProcessorFamilyC7                           ProcessorFamily = 0xd4  // C7
   468  	ProcessorFamilyEden                         ProcessorFamily = 0xd5  // Eden
   469  	ProcessorFamilyMultiCoreXeon                ProcessorFamily = 0xd6  // Multi-Core Xeon
   470  	ProcessorFamilyDualCoreXeon3xxx             ProcessorFamily = 0xd7  // Dual-Core Xeon 3xxx
   471  	ProcessorFamilyQuadCoreXeon3xxx             ProcessorFamily = 0xd8  // Quad-Core Xeon 3xxx
   472  	ProcessorFamilyNano                         ProcessorFamily = 0xd9  // Nano
   473  	ProcessorFamilyDualCoreXeon5xxx             ProcessorFamily = 0xda  // Dual-Core Xeon 5xxx
   474  	ProcessorFamilyQuadCoreXeon5xxx             ProcessorFamily = 0xdb  // Quad-Core Xeon 5xxx
   475  	ProcessorFamilyDualCoreXeon7xxx             ProcessorFamily = 0xdd  // Dual-Core Xeon 7xxx
   476  	ProcessorFamilyQuadCoreXeon7xxx             ProcessorFamily = 0xde  // Quad-Core Xeon 7xxx
   477  	ProcessorFamilyMultiCoreXeon7xxx            ProcessorFamily = 0xdf  // Multi-Core Xeon 7xxx
   478  	ProcessorFamilyMultiCoreXeon3400            ProcessorFamily = 0xe0  // Multi-Core Xeon 3400
   479  	ProcessorFamilyOpteron3000                  ProcessorFamily = 0xe4  // Opteron 3000
   480  	ProcessorFamilySempronII                    ProcessorFamily = 0xe5  // Sempron II
   481  	ProcessorFamilyEmbeddedOpteronQuadCore      ProcessorFamily = 0xe6  // Embedded Opteron Quad-Core
   482  	ProcessorFamilyPhenomTripleCore             ProcessorFamily = 0xe7  // Phenom Triple-Core
   483  	ProcessorFamilyTurionUltraDualCoreMobile    ProcessorFamily = 0xe8  // Turion Ultra Dual-Core Mobile
   484  	ProcessorFamilyTurionDualCoreMobile         ProcessorFamily = 0xe9  // Turion Dual-Core Mobile
   485  	ProcessorFamilyAthlonDualCore               ProcessorFamily = 0xea  // Athlon Dual-Core
   486  	ProcessorFamilySempronSI                    ProcessorFamily = 0xeb  // Sempron SI
   487  	ProcessorFamilyPhenomII                     ProcessorFamily = 0xec  // Phenom II
   488  	ProcessorFamilyAthlonII                     ProcessorFamily = 0xed  // Athlon II
   489  	ProcessorFamilySixCoreOpteron               ProcessorFamily = 0xee  // Six-Core Opteron
   490  	ProcessorFamilySempronM                     ProcessorFamily = 0xef  // Sempron M
   491  	ProcessorFamilyI860                         ProcessorFamily = 0xfa  // i860
   492  	ProcessorFamilyI960                         ProcessorFamily = 0xfb  // i960
   493  	ProcessorFamilyARMv7                        ProcessorFamily = 0x100 // ARMv7
   494  	ProcessorFamilyARMv8                        ProcessorFamily = 0x101 // ARMv8
   495  	ProcessorFamilySH3                          ProcessorFamily = 0x104 // SH-3
   496  	ProcessorFamilySH4                          ProcessorFamily = 0x105 // SH-4
   497  	ProcessorFamilyARM                          ProcessorFamily = 0x118 // ARM
   498  	ProcessorFamilyStrongARM                    ProcessorFamily = 0x119 // StrongARM
   499  	ProcessorFamily6x86                         ProcessorFamily = 0x12c // 6x86
   500  	ProcessorFamilyMediaGX                      ProcessorFamily = 0x12d // MediaGX
   501  	ProcessorFamilyMII                          ProcessorFamily = 0x12e // MII
   502  	ProcessorFamilyWinChip                      ProcessorFamily = 0x140 // WinChip
   503  	ProcessorFamilyDSP                          ProcessorFamily = 0x15e // DSP
   504  	ProcessorFamilyVideoProcessor               ProcessorFamily = 0x1f4 // Video Processor
   505  )
   506  
   507  func (v ProcessorFamily) String() string {
   508  	names := map[ProcessorFamily]string{
   509  		ProcessorFamilyOther:                        "Other",
   510  		ProcessorFamilyUnknown:                      "Unknown",
   511  		ProcessorFamily8086:                         "8086",
   512  		ProcessorFamily80286:                        "80286",
   513  		ProcessorFamily80386:                        "80386",
   514  		ProcessorFamily80486:                        "80486",
   515  		ProcessorFamily8087:                         "8087",
   516  		ProcessorFamily80287:                        "80287",
   517  		ProcessorFamily80387:                        "80387",
   518  		ProcessorFamily80487:                        "80487",
   519  		ProcessorFamilyPentium:                      "Pentium",
   520  		ProcessorFamilyPentiumPro:                   "Pentium Pro",
   521  		ProcessorFamilyPentiumII:                    "Pentium II",
   522  		ProcessorFamilyPentiumMMX:                   "Pentium MMX",
   523  		ProcessorFamilyCeleron:                      "Celeron",
   524  		ProcessorFamilyPentiumIIXeon:                "Pentium II Xeon",
   525  		ProcessorFamilyPentiumIII:                   "Pentium III",
   526  		ProcessorFamilyM1:                           "M1",
   527  		ProcessorFamilyM2:                           "M2",
   528  		ProcessorFamilyCeleronM:                     "Celeron M",
   529  		ProcessorFamilyPentium4HT:                   "Pentium 4 HT",
   530  		ProcessorFamilyDuron:                        "Duron",
   531  		ProcessorFamilyK5:                           "K5",
   532  		ProcessorFamilyK6:                           "K6",
   533  		ProcessorFamilyK62:                          "K6-2",
   534  		ProcessorFamilyK63:                          "K6-3",
   535  		ProcessorFamilyAthlon:                       "Athlon",
   536  		ProcessorFamilyAMD29000:                     "AMD29000",
   537  		ProcessorFamilyK62Plus:                      "K6-2+",
   538  		ProcessorFamilyPowerPC:                      "Power PC",
   539  		ProcessorFamilyPowerPC601:                   "Power PC 601",
   540  		ProcessorFamilyPowerPC603:                   "Power PC 603",
   541  		ProcessorFamilyPowerPC603Plus:               "Power PC 603+",
   542  		ProcessorFamilyPowerPC604:                   "Power PC 604",
   543  		ProcessorFamilyPowerPC620:                   "Power PC 620",
   544  		ProcessorFamilyPowerPCX704:                  "Power PC x704",
   545  		ProcessorFamilyPowerPC750:                   "Power PC 750",
   546  		ProcessorFamilyCoreDuo:                      "Core Duo",
   547  		ProcessorFamilyCoreDuoMobile:                "Core Duo Mobile",
   548  		ProcessorFamilyCoreSoloMobile:               "Core Solo Mobile",
   549  		ProcessorFamilyAtom:                         "Atom",
   550  		ProcessorFamilyCoreM:                        "Core M",
   551  		ProcessorFamilyCoreM3:                       "Core m3",
   552  		ProcessorFamilyCoreM5:                       "Core m5",
   553  		ProcessorFamilyCoreM7:                       "Core m7",
   554  		ProcessorFamilyAlpha:                        "Alpha",
   555  		ProcessorFamilyAlpha21064:                   "Alpha 21064",
   556  		ProcessorFamilyAlpha21066:                   "Alpha 21066",
   557  		ProcessorFamilyAlpha21164:                   "Alpha 21164",
   558  		ProcessorFamilyAlpha21164PC:                 "Alpha 21164PC",
   559  		ProcessorFamilyAlpha21164a:                  "Alpha 21164a",
   560  		ProcessorFamilyAlpha21264:                   "Alpha 21264",
   561  		ProcessorFamilyAlpha21364:                   "Alpha 21364",
   562  		ProcessorFamilyTurionIIUltraDualCoreMobileM: "Turion II Ultra Dual-Core Mobile M",
   563  		ProcessorFamilyTurionIIDualCoreMobileM:      "Turion II Dual-Core Mobile M",
   564  		ProcessorFamilyAthlonIIDualCoreM:            "Athlon II Dual-Core M",
   565  		ProcessorFamilyOpteron6100:                  "Opteron 6100",
   566  		ProcessorFamilyOpteron4100:                  "Opteron 4100",
   567  		ProcessorFamilyOpteron6200:                  "Opteron 6200",
   568  		ProcessorFamilyOpteron4200:                  "Opteron 4200",
   569  		ProcessorFamilyFX:                           "FX",
   570  		ProcessorFamilyMIPS:                         "MIPS",
   571  		ProcessorFamilyMIPSR4000:                    "MIPS R4000",
   572  		ProcessorFamilyMIPSR4200:                    "MIPS R4200",
   573  		ProcessorFamilyMIPSR4400:                    "MIPS R4400",
   574  		ProcessorFamilyMIPSR4600:                    "MIPS R4600",
   575  		ProcessorFamilyMIPSR10000:                   "MIPS R10000",
   576  		ProcessorFamilyCSeries:                      "C-Series",
   577  		ProcessorFamilyESeries:                      "E-Series",
   578  		ProcessorFamilyASeries:                      "A-Series",
   579  		ProcessorFamilyGSeries:                      "G-Series",
   580  		ProcessorFamilyZSeries:                      "Z-Series",
   581  		ProcessorFamilyRSeries:                      "R-Series",
   582  		ProcessorFamilyOpteron4300:                  "Opteron 4300",
   583  		ProcessorFamilyOpteron6300:                  "Opteron 6300",
   584  		ProcessorFamilyOpteron3300:                  "Opteron 3300",
   585  		ProcessorFamilyFirePro:                      "FirePro",
   586  		ProcessorFamilySPARC:                        "SPARC",
   587  		ProcessorFamilySuperSPARC:                   "SuperSPARC",
   588  		ProcessorFamilyMicroSPARCII:                 "MicroSPARC II",
   589  		ProcessorFamilyMicroSPARCIIep:               "MicroSPARC IIep",
   590  		ProcessorFamilyUltraSPARC:                   "UltraSPARC",
   591  		ProcessorFamilyUltraSPARCII:                 "UltraSPARC II",
   592  		ProcessorFamilyUltraSPARCIIi:                "UltraSPARC IIi",
   593  		ProcessorFamilyUltraSPARCIII:                "UltraSPARC III",
   594  		ProcessorFamilyUltraSPARCIIIi:               "UltraSPARC IIIi",
   595  		ProcessorFamily68040:                        "68040",
   596  		ProcessorFamily68xxx:                        "68xxx",
   597  		ProcessorFamily68000:                        "68000",
   598  		ProcessorFamily68010:                        "68010",
   599  		ProcessorFamily68020:                        "68020",
   600  		ProcessorFamily68030:                        "68030",
   601  		ProcessorFamilyAthlonX4:                     "Athlon X4",
   602  		ProcessorFamilyOpteronX1000:                 "Opteron X1000",
   603  		ProcessorFamilyOpteronX2000:                 "Opteron X2000",
   604  		ProcessorFamilyOpteronASeries:               "Opteron A-Series",
   605  		ProcessorFamilyOpteronX3000:                 "Opteron X3000",
   606  		ProcessorFamilyZen:                          "Zen",
   607  		ProcessorFamilyHobbit:                       "Hobbit",
   608  		ProcessorFamilyCrusoeTM5000:                 "Crusoe TM5000",
   609  		ProcessorFamilyCrusoeTM3000:                 "Crusoe TM3000",
   610  		ProcessorFamilyEfficeonTM8000:               "Efficeon TM8000",
   611  		ProcessorFamilyWeitek:                       "Weitek",
   612  		ProcessorFamilyItanium:                      "Itanium",
   613  		ProcessorFamilyAthlon64:                     "Athlon 64",
   614  		ProcessorFamilyOpteron:                      "Opteron",
   615  		ProcessorFamilySempron:                      "Sempron",
   616  		ProcessorFamilyTurion64:                     "Turion 64",
   617  		ProcessorFamilyDualCoreOpteron:              "Dual-Core Opteron",
   618  		ProcessorFamilyAthlon64X2:                   "Athlon 64 X2",
   619  		ProcessorFamilyTurion64X2:                   "Turion 64 X2",
   620  		ProcessorFamilyQuadCoreOpteron:              "Quad-Core Opteron",
   621  		ProcessorFamilyThirdGenerationOpteron:       "Third-Generation Opteron",
   622  		ProcessorFamilyPhenomFX:                     "Phenom FX",
   623  		ProcessorFamilyPhenomX4:                     "Phenom X4",
   624  		ProcessorFamilyPhenomX2:                     "Phenom X2",
   625  		ProcessorFamilyAthlonX2:                     "Athlon X2",
   626  		ProcessorFamilyPARISC:                       "PA-RISC",
   627  		ProcessorFamilyPARISC8500:                   "PA-RISC 8500",
   628  		ProcessorFamilyPARISC8000:                   "PA-RISC 8000",
   629  		ProcessorFamilyPARISC7300LC:                 "PA-RISC 7300LC",
   630  		ProcessorFamilyPARISC7200:                   "PA-RISC 7200",
   631  		ProcessorFamilyPARISC7100LC:                 "PA-RISC 7100LC",
   632  		ProcessorFamilyPARISC7100:                   "PA-RISC 7100",
   633  		ProcessorFamilyV30:                          "V30",
   634  		ProcessorFamilyQuadCoreXeon3200:             "Quad-Core Xeon 3200",
   635  		ProcessorFamilyDualCoreXeon3000:             "Dual-Core Xeon 3000",
   636  		ProcessorFamilyQuadCoreXeon5300:             "Quad-Core Xeon 5300",
   637  		ProcessorFamilyDualCoreXeon5100:             "Dual-Core Xeon 5100",
   638  		ProcessorFamilyDualCoreXeon5000:             "Dual-Core Xeon 5000",
   639  		ProcessorFamilyDualCoreXeonLV:               "Dual-Core Xeon LV",
   640  		ProcessorFamilyDualCoreXeonULV:              "Dual-Core Xeon ULV",
   641  		ProcessorFamilyDualCoreXeon7100:             "Dual-Core Xeon 7100",
   642  		ProcessorFamilyQuadCoreXeon5400:             "Quad-Core Xeon 5400",
   643  		ProcessorFamilyQuadCoreXeon:                 "Quad-Core Xeon",
   644  		ProcessorFamilyDualCoreXeon5200:             "Dual-Core Xeon 5200",
   645  		ProcessorFamilyDualCoreXeon7200:             "Dual-Core Xeon 7200",
   646  		ProcessorFamilyQuadCoreXeon7300:             "Quad-Core Xeon 7300",
   647  		ProcessorFamilyQuadCoreXeon7400:             "Quad-Core Xeon 7400",
   648  		ProcessorFamilyMultiCoreXeon7400:            "Multi-Core Xeon 7400",
   649  		ProcessorFamilyPentiumIIIXeon:               "Pentium III Xeon",
   650  		ProcessorFamilyPentiumIIISpeedstep:          "Pentium III Speedstep",
   651  		ProcessorFamilyPentium4:                     "Pentium 4",
   652  		ProcessorFamilyXeon:                         "Xeon",
   653  		ProcessorFamilyAS400:                        "AS400",
   654  		ProcessorFamilyXeonMP:                       "Xeon MP",
   655  		ProcessorFamilyAthlonXP:                     "Athlon XP",
   656  		ProcessorFamilyAthlonMP:                     "Athlon MP",
   657  		ProcessorFamilyItanium2:                     "Itanium 2",
   658  		ProcessorFamilyPentiumM:                     "Pentium M",
   659  		ProcessorFamilyCeleronD:                     "Celeron D",
   660  		ProcessorFamilyPentiumD:                     "Pentium D",
   661  		ProcessorFamilyPentiumEE:                    "Pentium EE",
   662  		ProcessorFamilyCoreSolo:                     "Core Solo",
   663  		ProcessorFamilyHandledAsASpecialCase:        "handled as a special case */",
   664  		ProcessorFamilyCore2Duo:                     "Core 2 Duo",
   665  		ProcessorFamilyCore2Solo:                    "Core 2 Solo",
   666  		ProcessorFamilyCore2Extreme:                 "Core 2 Extreme",
   667  		ProcessorFamilyCore2Quad:                    "Core 2 Quad",
   668  		ProcessorFamilyCore2ExtremeMobile:           "Core 2 Extreme Mobile",
   669  		ProcessorFamilyCore2DuoMobile:               "Core 2 Duo Mobile",
   670  		ProcessorFamilyCore2SoloMobile:              "Core 2 Solo Mobile",
   671  		ProcessorFamilyCoreI7:                       "Core i7",
   672  		ProcessorFamilyDualCoreCeleron:              "Dual-Core Celeron",
   673  		ProcessorFamilyIBM390:                       "IBM390",
   674  		ProcessorFamilyG4:                           "G4",
   675  		ProcessorFamilyG5:                           "G5",
   676  		ProcessorFamilyESA390G6:                     "ESA/390 G6",
   677  		ProcessorFamilyZarchitecture:                "z/Architecture",
   678  		ProcessorFamilyCoreI5:                       "Core i5",
   679  		ProcessorFamilyCoreI3:                       "Core i3",
   680  		ProcessorFamilyCoreI9:                       "Core i9",
   681  		ProcessorFamilyC7M:                          "C7-M",
   682  		ProcessorFamilyC7D:                          "C7-D",
   683  		ProcessorFamilyC7:                           "C7",
   684  		ProcessorFamilyEden:                         "Eden",
   685  		ProcessorFamilyMultiCoreXeon:                "Multi-Core Xeon",
   686  		ProcessorFamilyDualCoreXeon3xxx:             "Dual-Core Xeon 3xxx",
   687  		ProcessorFamilyQuadCoreXeon3xxx:             "Quad-Core Xeon 3xxx",
   688  		ProcessorFamilyNano:                         "Nano",
   689  		ProcessorFamilyDualCoreXeon5xxx:             "Dual-Core Xeon 5xxx",
   690  		ProcessorFamilyQuadCoreXeon5xxx:             "Quad-Core Xeon 5xxx",
   691  		ProcessorFamilyDualCoreXeon7xxx:             "Dual-Core Xeon 7xxx",
   692  		ProcessorFamilyQuadCoreXeon7xxx:             "Quad-Core Xeon 7xxx",
   693  		ProcessorFamilyMultiCoreXeon7xxx:            "Multi-Core Xeon 7xxx",
   694  		ProcessorFamilyMultiCoreXeon3400:            "Multi-Core Xeon 3400",
   695  		ProcessorFamilyOpteron3000:                  "Opteron 3000",
   696  		ProcessorFamilySempronII:                    "Sempron II",
   697  		ProcessorFamilyEmbeddedOpteronQuadCore:      "Embedded Opteron Quad-Core",
   698  		ProcessorFamilyPhenomTripleCore:             "Phenom Triple-Core",
   699  		ProcessorFamilyTurionUltraDualCoreMobile:    "Turion Ultra Dual-Core Mobile",
   700  		ProcessorFamilyTurionDualCoreMobile:         "Turion Dual-Core Mobile",
   701  		ProcessorFamilyAthlonDualCore:               "Athlon Dual-Core",
   702  		ProcessorFamilySempronSI:                    "Sempron SI",
   703  		ProcessorFamilyPhenomII:                     "Phenom II",
   704  		ProcessorFamilyAthlonII:                     "Athlon II",
   705  		ProcessorFamilySixCoreOpteron:               "Six-Core Opteron",
   706  		ProcessorFamilySempronM:                     "Sempron M",
   707  		ProcessorFamilyI860:                         "i860",
   708  		ProcessorFamilyI960:                         "i960",
   709  		ProcessorFamilyARMv7:                        "ARMv7",
   710  		ProcessorFamilyARMv8:                        "ARMv8",
   711  		ProcessorFamilySH3:                          "SH-3",
   712  		ProcessorFamilySH4:                          "SH-4",
   713  		ProcessorFamilyARM:                          "ARM",
   714  		ProcessorFamilyStrongARM:                    "StrongARM",
   715  		ProcessorFamily6x86:                         "6x86",
   716  		ProcessorFamilyMediaGX:                      "MediaGX",
   717  		ProcessorFamilyMII:                          "MII",
   718  		ProcessorFamilyWinChip:                      "WinChip",
   719  		ProcessorFamilyDSP:                          "DSP",
   720  		ProcessorFamilyVideoProcessor:               "Video Processor",
   721  	}
   722  	if name, ok := names[v]; ok {
   723  		return name
   724  	}
   725  	return fmt.Sprintf("%#x", uint8(v))
   726  }
   727  
   728  // ProcessorStatus is defined in DSP0134 7.5.
   729  type ProcessorStatus uint8
   730  
   731  var processorStatusStr = []string{
   732  	"Unknown", "Enabled", "Disabled By User", "Disabled By BIOS", "Idle", "Reserved5", "Reserved6", "Other",
   733  }
   734  
   735  func (v ProcessorStatus) String() string {
   736  	if v&0x40 == 0 {
   737  		return "Unpopulated"
   738  	}
   739  	return "Populated, " + processorStatusStr[v&7]
   740  }
   741  
   742  // ProcessorUpgrade is defined in DSP0134 7.5.5.
   743  type ProcessorUpgrade uint8
   744  
   745  // ProcessorUpgrade values are defined in DSP0134 7.5.5.
   746  const (
   747  	ProcessorUpgradeOther                ProcessorUpgrade = 0x01 // Other
   748  	ProcessorUpgradeUnknown              ProcessorUpgrade = 0x02 // Unknown
   749  	ProcessorUpgradeDaughterBoard        ProcessorUpgrade = 0x03 // Daughter Board
   750  	ProcessorUpgradeZIFSocket            ProcessorUpgrade = 0x04 // ZIF Socket
   751  	ProcessorUpgradeReplaceablePiggyBack ProcessorUpgrade = 0x05 // Replaceable Piggy Back
   752  	ProcessorUpgradeNone                 ProcessorUpgrade = 0x06 // None
   753  	ProcessorUpgradeLIFSocket            ProcessorUpgrade = 0x07 // LIF Socket
   754  	ProcessorUpgradeSlot1                ProcessorUpgrade = 0x08 // Slot 1
   755  	ProcessorUpgradeSlot2                ProcessorUpgrade = 0x09 // Slot 2
   756  	ProcessorUpgrade370pinSocket         ProcessorUpgrade = 0x0a // 370-pin Socket
   757  	ProcessorUpgradeSlotA                ProcessorUpgrade = 0x0b // Slot A
   758  	ProcessorUpgradeSlotM                ProcessorUpgrade = 0x0c // Slot M
   759  	ProcessorUpgradeSocket423            ProcessorUpgrade = 0x0d // Socket 423
   760  	ProcessorUpgradeSocketA              ProcessorUpgrade = 0x0e // Socket A (Socket 462)
   761  	ProcessorUpgradeSocket478            ProcessorUpgrade = 0x0f // Socket 478
   762  	ProcessorUpgradeSocket754            ProcessorUpgrade = 0x10 // Socket 754
   763  	ProcessorUpgradeSocket940            ProcessorUpgrade = 0x11 // Socket 940
   764  	ProcessorUpgradeSocket939            ProcessorUpgrade = 0x12 // Socket 939
   765  	ProcessorUpgradeSocketMpga604        ProcessorUpgrade = 0x13 // Socket mPGA604
   766  	ProcessorUpgradeSocketLGA771         ProcessorUpgrade = 0x14 // Socket LGA771
   767  	ProcessorUpgradeSocketLGA775         ProcessorUpgrade = 0x15 // Socket LGA775
   768  	ProcessorUpgradeSocketS1             ProcessorUpgrade = 0x16 // Socket S1
   769  	ProcessorUpgradeSocketAM2            ProcessorUpgrade = 0x17 // Socket AM2
   770  	ProcessorUpgradeSocketF1207          ProcessorUpgrade = 0x18 // Socket F (1207)
   771  	ProcessorUpgradeSocketLGA1366        ProcessorUpgrade = 0x19 // Socket LGA1366
   772  	ProcessorUpgradeSocketG34            ProcessorUpgrade = 0x1a // Socket G34
   773  	ProcessorUpgradeSocketAM3            ProcessorUpgrade = 0x1b // Socket AM3
   774  	ProcessorUpgradeSocketC32            ProcessorUpgrade = 0x1c // Socket C32
   775  	ProcessorUpgradeSocketLGA1156        ProcessorUpgrade = 0x1d // Socket LGA1156
   776  	ProcessorUpgradeSocketLGA1567        ProcessorUpgrade = 0x1e // Socket LGA1567
   777  	ProcessorUpgradeSocketPGA988A        ProcessorUpgrade = 0x1f // Socket PGA988A
   778  	ProcessorUpgradeSocketBGA1288        ProcessorUpgrade = 0x20 // Socket BGA1288
   779  	ProcessorUpgradeSocketRpga988b       ProcessorUpgrade = 0x21 // Socket rPGA988B
   780  	ProcessorUpgradeSocketBGA1023        ProcessorUpgrade = 0x22 // Socket BGA1023
   781  	ProcessorUpgradeSocketBGA1224        ProcessorUpgrade = 0x23 // Socket BGA1224
   782  	ProcessorUpgradeSocketBGA1155        ProcessorUpgrade = 0x24 // Socket BGA1155
   783  	ProcessorUpgradeSocketLGA1356        ProcessorUpgrade = 0x25 // Socket LGA1356
   784  	ProcessorUpgradeSocketLGA2011        ProcessorUpgrade = 0x26 // Socket LGA2011
   785  	ProcessorUpgradeSocketFS1            ProcessorUpgrade = 0x27 // Socket FS1
   786  	ProcessorUpgradeSocketFS2            ProcessorUpgrade = 0x28 // Socket FS2
   787  	ProcessorUpgradeSocketFM1            ProcessorUpgrade = 0x29 // Socket FM1
   788  	ProcessorUpgradeSocketFM2            ProcessorUpgrade = 0x2a // Socket FM2
   789  	ProcessorUpgradeSocketLGA20113       ProcessorUpgrade = 0x2b // Socket LGA2011-3
   790  	ProcessorUpgradeSocketLGA13563       ProcessorUpgrade = 0x2c // Socket LGA1356-3
   791  	ProcessorUpgradeSocketLGA1150        ProcessorUpgrade = 0x2d // Socket LGA1150
   792  	ProcessorUpgradeSocketBGA1168        ProcessorUpgrade = 0x2e // Socket BGA1168
   793  	ProcessorUpgradeSocketBGA1234        ProcessorUpgrade = 0x2f // Socket BGA1234
   794  	ProcessorUpgradeSocketBGA1364        ProcessorUpgrade = 0x30 // Socket BGA1364
   795  	ProcessorUpgradeSocketAM4            ProcessorUpgrade = 0x31 // Socket AM4
   796  	ProcessorUpgradeSocketLGA1151        ProcessorUpgrade = 0x32 // Socket LGA1151
   797  	ProcessorUpgradeSocketBGA1356        ProcessorUpgrade = 0x33 // Socket BGA1356
   798  	ProcessorUpgradeSocketBGA1440        ProcessorUpgrade = 0x34 // Socket BGA1440
   799  	ProcessorUpgradeSocketBGA1515        ProcessorUpgrade = 0x35 // Socket BGA1515
   800  	ProcessorUpgradeSocketLGA36471       ProcessorUpgrade = 0x36 // Socket LGA3647-1
   801  	ProcessorUpgradeSocketSP3            ProcessorUpgrade = 0x37 // Socket SP3
   802  	ProcessorUpgradeSocketSP3r2          ProcessorUpgrade = 0x38 // Socket SP3r2
   803  	ProcessorUpgradeSocketLGA2066        ProcessorUpgrade = 0x39 // Socket LGA2066
   804  	ProcessorUpgradeSocketBGA1392        ProcessorUpgrade = 0x3a // Socket BGA1392
   805  	ProcessorUpgradeSocketBGA1510        ProcessorUpgrade = 0x3b // Socket BGA1510
   806  	ProcessorUpgradeSocketBGA1528        ProcessorUpgrade = 0x3c // Socket BGA1528
   807  )
   808  
   809  func (v ProcessorUpgrade) String() string {
   810  	names := map[ProcessorUpgrade]string{
   811  		ProcessorUpgradeOther:                "Other",
   812  		ProcessorUpgradeUnknown:              "Unknown",
   813  		ProcessorUpgradeDaughterBoard:        "Daughter Board",
   814  		ProcessorUpgradeZIFSocket:            "ZIF Socket",
   815  		ProcessorUpgradeReplaceablePiggyBack: "Replaceable Piggy Back",
   816  		ProcessorUpgradeNone:                 "None",
   817  		ProcessorUpgradeLIFSocket:            "LIF Socket",
   818  		ProcessorUpgradeSlot1:                "Slot 1",
   819  		ProcessorUpgradeSlot2:                "Slot 2",
   820  		ProcessorUpgrade370pinSocket:         "370-pin Socket",
   821  		ProcessorUpgradeSlotA:                "Slot A",
   822  		ProcessorUpgradeSlotM:                "Slot M",
   823  		ProcessorUpgradeSocket423:            "Socket 423",
   824  		ProcessorUpgradeSocketA:              "Socket A (Socket 462)",
   825  		ProcessorUpgradeSocket478:            "Socket 478",
   826  		ProcessorUpgradeSocket754:            "Socket 754",
   827  		ProcessorUpgradeSocket940:            "Socket 940",
   828  		ProcessorUpgradeSocket939:            "Socket 939",
   829  		ProcessorUpgradeSocketMpga604:        "Socket mPGA604",
   830  		ProcessorUpgradeSocketLGA771:         "Socket LGA771",
   831  		ProcessorUpgradeSocketLGA775:         "Socket LGA775",
   832  		ProcessorUpgradeSocketS1:             "Socket S1",
   833  		ProcessorUpgradeSocketAM2:            "Socket AM2",
   834  		ProcessorUpgradeSocketF1207:          "Socket F (1207)",
   835  		ProcessorUpgradeSocketLGA1366:        "Socket LGA1366",
   836  		ProcessorUpgradeSocketG34:            "Socket G34",
   837  		ProcessorUpgradeSocketAM3:            "Socket AM3",
   838  		ProcessorUpgradeSocketC32:            "Socket C32",
   839  		ProcessorUpgradeSocketLGA1156:        "Socket LGA1156",
   840  		ProcessorUpgradeSocketLGA1567:        "Socket LGA1567",
   841  		ProcessorUpgradeSocketPGA988A:        "Socket PGA988A",
   842  		ProcessorUpgradeSocketBGA1288:        "Socket BGA1288",
   843  		ProcessorUpgradeSocketRpga988b:       "Socket rPGA988B",
   844  		ProcessorUpgradeSocketBGA1023:        "Socket BGA1023",
   845  		ProcessorUpgradeSocketBGA1224:        "Socket BGA1224",
   846  		ProcessorUpgradeSocketBGA1155:        "Socket BGA1155",
   847  		ProcessorUpgradeSocketLGA1356:        "Socket LGA1356",
   848  		ProcessorUpgradeSocketLGA2011:        "Socket LGA2011",
   849  		ProcessorUpgradeSocketFS1:            "Socket FS1",
   850  		ProcessorUpgradeSocketFS2:            "Socket FS2",
   851  		ProcessorUpgradeSocketFM1:            "Socket FM1",
   852  		ProcessorUpgradeSocketFM2:            "Socket FM2",
   853  		ProcessorUpgradeSocketLGA20113:       "Socket LGA2011-3",
   854  		ProcessorUpgradeSocketLGA13563:       "Socket LGA1356-3",
   855  		ProcessorUpgradeSocketLGA1150:        "Socket LGA1150",
   856  		ProcessorUpgradeSocketBGA1168:        "Socket BGA1168",
   857  		ProcessorUpgradeSocketBGA1234:        "Socket BGA1234",
   858  		ProcessorUpgradeSocketBGA1364:        "Socket BGA1364",
   859  		ProcessorUpgradeSocketAM4:            "Socket AM4",
   860  		ProcessorUpgradeSocketLGA1151:        "Socket LGA1151",
   861  		ProcessorUpgradeSocketBGA1356:        "Socket BGA1356",
   862  		ProcessorUpgradeSocketBGA1440:        "Socket BGA1440",
   863  		ProcessorUpgradeSocketBGA1515:        "Socket BGA1515",
   864  		ProcessorUpgradeSocketLGA36471:       "Socket LGA3647-1",
   865  		ProcessorUpgradeSocketSP3:            "Socket SP3",
   866  		ProcessorUpgradeSocketSP3r2:          "Socket SP3r2",
   867  		ProcessorUpgradeSocketLGA2066:        "Socket LGA2066",
   868  		ProcessorUpgradeSocketBGA1392:        "Socket BGA1392",
   869  		ProcessorUpgradeSocketBGA1510:        "Socket BGA1510",
   870  		ProcessorUpgradeSocketBGA1528:        "Socket BGA1528",
   871  	}
   872  	if name, ok := names[v]; ok {
   873  		return name
   874  	}
   875  	return fmt.Sprintf("%#x", uint8(v))
   876  }
   877  
   878  // ProcessorCharacteristics values are defined in DSP0134 7.5.9.
   879  type ProcessorCharacteristics uint16
   880  
   881  // ProcessorCharacteristics fields are defined in DSP0134 x.x.x
   882  const (
   883  	ProcessorCharacteristicsReserved                ProcessorCharacteristics = 1 << 0 // Reserved
   884  	ProcessorCharacteristicsUnknown                 ProcessorCharacteristics = 1 << 1 // Unknown
   885  	ProcessorCharacteristics64bitCapable            ProcessorCharacteristics = 1 << 2 // 64-bit Capable
   886  	ProcessorCharacteristicsMultiCore               ProcessorCharacteristics = 1 << 3 // Multi-Core
   887  	ProcessorCharacteristicsHardwareThread          ProcessorCharacteristics = 1 << 4 // Hardware Thread
   888  	ProcessorCharacteristicsExecuteProtection       ProcessorCharacteristics = 1 << 5 // Execute Protection
   889  	ProcessorCharacteristicsEnhancedVirtualization  ProcessorCharacteristics = 1 << 6 // Enhanced Virtualization
   890  	ProcessorCharacteristicsPowerPerformanceControl ProcessorCharacteristics = 1 << 7 // Power/Performance Control
   891  )
   892  
   893  func (v ProcessorCharacteristics) String() string {
   894  	var lines []string
   895  	if v&ProcessorCharacteristicsReserved != 0 {
   896  		lines = append(lines, "Reserved")
   897  	}
   898  	if v&ProcessorCharacteristicsUnknown != 0 {
   899  		lines = append(lines, "Unknown")
   900  	}
   901  	if v&ProcessorCharacteristics64bitCapable != 0 {
   902  		lines = append(lines, "64-bit capable")
   903  	}
   904  	if v&ProcessorCharacteristicsMultiCore != 0 {
   905  		lines = append(lines, "Multi-Core")
   906  	}
   907  	if v&ProcessorCharacteristicsHardwareThread != 0 {
   908  		lines = append(lines, "Hardware Thread")
   909  	}
   910  	if v&ProcessorCharacteristicsExecuteProtection != 0 {
   911  		lines = append(lines, "Execute Protection")
   912  	}
   913  	if v&ProcessorCharacteristicsEnhancedVirtualization != 0 {
   914  		lines = append(lines, "Enhanced Virtualization")
   915  	}
   916  	if v&ProcessorCharacteristicsPowerPerformanceControl != 0 {
   917  		lines = append(lines, "Power/Performance Control")
   918  	}
   919  	return "\t\t" + strings.Join(lines, "\n\t\t")
   920  }