github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/pkg/smbios/info.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 parses SMBIOS tables into Go structures.
     6  //
     7  // smbios can read tables from binary data or from sysfs using the FromSysfs
     8  // and ParseInfo functions.
     9  package smbios
    10  
    11  import (
    12  	"fmt"
    13  )
    14  
    15  // Info contains the SMBIOS information.
    16  type Info struct {
    17  	Entry32 *Entry32
    18  	Entry64 *Entry64
    19  	Tables  []*Table
    20  }
    21  
    22  // String returns a summary of the SMBIOS version and number of tables.
    23  func (i *Info) String() string {
    24  	return fmt.Sprintf("SMBIOS %d.%d.%d (%d tables)", i.MajorVersion(), i.MinorVersion(), i.DocRev(), len(i.Tables))
    25  }
    26  
    27  // ParseInfo parses SMBIOS information from binary data.
    28  func ParseInfo(entryData, tableData []byte) (*Info, error) {
    29  	info := &Info{}
    30  	var err error
    31  	info.Entry32, info.Entry64, err = ParseEntry(entryData)
    32  	if err != nil {
    33  		return nil, fmt.Errorf("error parsing entry point structure: %v", err)
    34  	}
    35  	for len(tableData) > 0 {
    36  		t, remainder, err := ParseTable(tableData)
    37  		if err != nil && err != errEndOfTable {
    38  			return nil, err
    39  		}
    40  		info.Tables = append(info.Tables, t)
    41  		tableData = remainder
    42  	}
    43  	return info, nil
    44  }
    45  
    46  // MajorVersion return major version of the SMBIOS spec.
    47  func (i *Info) MajorVersion() uint8 {
    48  	if i.Entry64 != nil {
    49  		return i.Entry64.SMBIOSMajorVersion
    50  	}
    51  	if i.Entry32 != nil {
    52  		return i.Entry32.SMBIOSMajorVersion
    53  	}
    54  	return 0
    55  }
    56  
    57  // MinorVersion return minor version of the SMBIOS spec.
    58  func (i *Info) MinorVersion() uint8 {
    59  	if i.Entry64 != nil {
    60  		return i.Entry64.SMBIOSMinorVersion
    61  	}
    62  	if i.Entry32 != nil {
    63  		return i.Entry32.SMBIOSMinorVersion
    64  	}
    65  	return 0
    66  }
    67  
    68  // DocRev return document revision of the SMBIOS spec.
    69  func (i *Info) DocRev() uint8 {
    70  	if i.Entry64 != nil {
    71  		return i.Entry64.SMBIOSDocRev
    72  	}
    73  	return 0
    74  }
    75  
    76  // GetTablesByType returns tables of specific type.
    77  func (i *Info) GetTablesByType(tt TableType) []*Table {
    78  	var res []*Table
    79  	for _, t := range i.Tables {
    80  		if t.Type == tt {
    81  			res = append(res, t)
    82  		}
    83  	}
    84  	return res
    85  }
    86  
    87  // GetBIOSInfo returns the Bios Info (type 0) table, if present.
    88  func (i *Info) GetBIOSInfo() (*BIOSInfo, error) {
    89  	bt := i.GetTablesByType(TableTypeBIOSInfo)
    90  	if len(bt) == 0 {
    91  		return nil, ErrTableNotFound
    92  	}
    93  	// There can only be one of these.
    94  	return ParseBIOSInfo(bt[0])
    95  }
    96  
    97  // GetSystemInfo returns the System Info (type 1) table, if present.
    98  func (i *Info) GetSystemInfo() (*SystemInfo, error) {
    99  	bt := i.GetTablesByType(TableTypeSystemInfo)
   100  	if len(bt) == 0 {
   101  		return nil, ErrTableNotFound
   102  	}
   103  	// There can only be one of these.
   104  	return ParseSystemInfo(bt[0])
   105  }
   106  
   107  // GetBaseboardInfo returns all the Baseboard Info (type 2) tables present.
   108  func (i *Info) GetBaseboardInfo() ([]*BaseboardInfo, error) {
   109  	var res []*BaseboardInfo
   110  	for _, t := range i.GetTablesByType(TableTypeBaseboardInfo) {
   111  		bi, err := ParseBaseboardInfo(t)
   112  		if err != nil {
   113  			return nil, err
   114  		}
   115  		res = append(res, bi)
   116  	}
   117  	return res, nil
   118  }
   119  
   120  // GetChassisInfo returns all the Chassis Info (type 3) tables present.
   121  func (i *Info) GetChassisInfo() ([]*ChassisInfo, error) {
   122  	var res []*ChassisInfo
   123  	for _, t := range i.GetTablesByType(TableTypeChassisInfo) {
   124  		ci, err := ParseChassisInfo(t)
   125  		if err != nil {
   126  			return nil, err
   127  		}
   128  		res = append(res, ci)
   129  	}
   130  	return res, nil
   131  }
   132  
   133  // GetProcessorInfo returns all the Processor Info (type 4) tables present.
   134  func (i *Info) GetProcessorInfo() ([]*ProcessorInfo, error) {
   135  	var res []*ProcessorInfo
   136  	for _, t := range i.GetTablesByType(TableTypeProcessorInfo) {
   137  		pi, err := ParseProcessorInfo(t)
   138  		if err != nil {
   139  			return nil, err
   140  		}
   141  		res = append(res, pi)
   142  	}
   143  	return res, nil
   144  }
   145  
   146  // GetCacheInfo returns all the Cache Info (type 7) tables present.
   147  func (i *Info) GetCacheInfo() ([]*CacheInfo, error) {
   148  	var res []*CacheInfo
   149  	for _, t := range i.GetTablesByType(TableTypeCacheInfo) {
   150  		ci, err := ParseCacheInfo(t)
   151  		if err != nil {
   152  			return nil, err
   153  		}
   154  		res = append(res, ci)
   155  	}
   156  	return res, nil
   157  }
   158  
   159  // GetMemoryDevices returns all the Memory Device (type 17) tables present.
   160  func (i *Info) GetMemoryDevices() ([]*MemoryDevice, error) {
   161  	var res []*MemoryDevice
   162  	for _, t := range i.GetTablesByType(TableTypeMemoryDevice) {
   163  		ci, err := NewMemoryDevice(t)
   164  		if err != nil {
   165  			return nil, err
   166  		}
   167  		res = append(res, ci)
   168  	}
   169  	return res, nil
   170  }
   171  
   172  // GetIPMIDeviceInfo returns all the IPMI Device Info (type 38) tables present.
   173  func (i *Info) GetIPMIDeviceInfo() ([]*IPMIDeviceInfo, error) {
   174  	var res []*IPMIDeviceInfo
   175  	for _, t := range i.GetTablesByType(TableTypeIPMIDeviceInfo) {
   176  		d, err := ParseIPMIDeviceInfo(t)
   177  		if err != nil {
   178  			return nil, err
   179  		}
   180  		res = append(res, d)
   181  	}
   182  	return res, nil
   183  }
   184  
   185  // GetTPMDevices returns all the TPM Device (type 43) tables present.
   186  func (i *Info) GetTPMDevices() ([]*TPMDevice, error) {
   187  	var res []*TPMDevice
   188  	for _, t := range i.GetTablesByType(TableTypeTPMDevice) {
   189  		d, err := NewTPMDevice(t)
   190  		if err != nil {
   191  			return nil, err
   192  		}
   193  		res = append(res, d)
   194  	}
   195  	return res, nil
   196  }