187853babSAni Sinha# Copyright (c) 2015, Intel Corporation 287853babSAni Sinha# All rights reserved. 387853babSAni Sinha# 4*5a373924SAni Sinha# SPDX-License-Identifier: BSD-3-Clause 5*5a373924SAni Sinha# 687853babSAni Sinha# Redistribution and use in source and binary forms, with or without 787853babSAni Sinha# modification, are permitted provided that the following conditions are met: 887853babSAni Sinha# 987853babSAni Sinha# * Redistributions of source code must retain the above copyright notice, 1087853babSAni Sinha# this list of conditions and the following disclaimer. 1187853babSAni Sinha# * Redistributions in binary form must reproduce the above copyright notice, 1287853babSAni Sinha# this list of conditions and the following disclaimer in the documentation 1387853babSAni Sinha# and/or other materials provided with the distribution. 1487853babSAni Sinha# * Neither the name of Intel Corporation nor the names of its contributors 1587853babSAni Sinha# may be used to endorse or promote products derived from this software 1687853babSAni Sinha# without specific prior written permission. 1787853babSAni Sinha# 1887853babSAni Sinha# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 1987853babSAni Sinha# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 2087853babSAni Sinha# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2187853babSAni Sinha# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 2287853babSAni Sinha# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2387853babSAni Sinha# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 2487853babSAni Sinha# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 2587853babSAni Sinha# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2687853babSAni Sinha# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 2787853babSAni Sinha# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2887853babSAni Sinha 29*5a373924SAni Sinha# This script runs only from the biosbits VM. 30*5a373924SAni Sinha 3187853babSAni Sinha"""SMBIOS/DMI module.""" 3287853babSAni Sinha 3387853babSAni Sinhaimport bits 3487853babSAni Sinhaimport bitfields 3587853babSAni Sinhaimport ctypes 3687853babSAni Sinhaimport redirect 3787853babSAni Sinhaimport struct 3887853babSAni Sinhaimport uuid 3987853babSAni Sinhaimport unpack 4087853babSAni Sinhaimport ttypager 4187853babSAni Sinhaimport sys 4287853babSAni Sinha 4387853babSAni Sinhaclass SMBIOS(unpack.Struct): 4487853babSAni Sinha def __new__(cls): 4587853babSAni Sinha if sys.platform == "BITS-EFI": 4687853babSAni Sinha import efi 4787853babSAni Sinha sm_ptr = efi.system_table.ConfigurationTableDict.get(efi.SMBIOS_TABLE_GUID) 4887853babSAni Sinha else: 4987853babSAni Sinha address = 0xF0000 5087853babSAni Sinha mem = bits.memory(0xF0000, 0x10000) 5187853babSAni Sinha for offset in range(0, len(mem), 16): 5287853babSAni Sinha signature = (ctypes.c_char * 4).from_address(address + offset).value 5387853babSAni Sinha if signature == "_SM_": 5487853babSAni Sinha entry_point_length = ctypes.c_ubyte.from_address(address + offset + 5).value 5587853babSAni Sinha csum = sum(map(ord, mem[offset:offset + entry_point_length])) & 0xff 5687853babSAni Sinha if csum == 0: 5787853babSAni Sinha sm_ptr = address + offset 5887853babSAni Sinha break 5987853babSAni Sinha else: 6087853babSAni Sinha return None 6187853babSAni Sinha 6287853babSAni Sinha if not sm_ptr: 6387853babSAni Sinha return None 6487853babSAni Sinha 6587853babSAni Sinha sm = super(SMBIOS, cls).__new__(cls) 6687853babSAni Sinha sm._header_memory = bits.memory(sm_ptr, 0x1f) 6787853babSAni Sinha return sm 6887853babSAni Sinha 6987853babSAni Sinha def __init__(self): 7087853babSAni Sinha super(SMBIOS, self).__init__() 7187853babSAni Sinha u = unpack.Unpackable(self._header_memory) 7287853babSAni Sinha self.add_field('header', Header(u)) 7387853babSAni Sinha self._structure_memory = bits.memory(self.header.structure_table_address, self.header.structure_table_length) 7487853babSAni Sinha u = unpack.Unpackable(self._structure_memory) 7587853babSAni Sinha self.add_field('structures', unpack.unpack_all(u, _smbios_structures, self), unpack.format_each("\n\n{!r}")) 7687853babSAni Sinha 7787853babSAni Sinha def structure_type(self, num): 7887853babSAni Sinha '''Dumps structure of given Type if present''' 7987853babSAni Sinha try: 8087853babSAni Sinha types_present = [self.structures[x].smbios_structure_type for x in range(len(self.structures))] 8187853babSAni Sinha matrix = dict() 8287853babSAni Sinha for index in range(len(types_present)): 8387853babSAni Sinha if types_present.count(types_present[index]) == 1: 8487853babSAni Sinha matrix[types_present[index]] = self.structures[index] 8587853babSAni Sinha else: # if multiple structures of the same type, return a list of structures for the type number 8687853babSAni Sinha if matrix.has_key(types_present[index]): 8787853babSAni Sinha matrix[types_present[index]].append(self.structures[index]) 8887853babSAni Sinha else: 8987853babSAni Sinha matrix[types_present[index]] = [self.structures[index]] 9087853babSAni Sinha return matrix[num] 9187853babSAni Sinha except: 9287853babSAni Sinha print "Failure: Type {} - not found".format(num) 9387853babSAni Sinha 9487853babSAni Sinhaclass Header(unpack.Struct): 9587853babSAni Sinha def __new__(cls, u): 9687853babSAni Sinha return super(Header, cls).__new__(cls) 9787853babSAni Sinha 9887853babSAni Sinha def __init__(self, u): 9987853babSAni Sinha super(Header, self).__init__() 10087853babSAni Sinha self.raw_data = u.unpack_rest() 10187853babSAni Sinha u = unpack.Unpackable(self.raw_data) 10287853babSAni Sinha self.add_field('anchor_string', u.unpack_one("4s")) 10387853babSAni Sinha self.add_field('checksum', u.unpack_one("B")) 10487853babSAni Sinha self.add_field('length', u.unpack_one("B")) 10587853babSAni Sinha self.add_field('major_version', u.unpack_one("B")) 10687853babSAni Sinha self.add_field('minor_version', u.unpack_one("B")) 10787853babSAni Sinha self.add_field('max_structure_size', u.unpack_one("<H")) 10887853babSAni Sinha self.add_field('entry_point_revision', u.unpack_one("B")) 10987853babSAni Sinha self.add_field('formatted_area', u.unpack_one("5s")) 11087853babSAni Sinha self.add_field('intermediate_anchor_string', u.unpack_one("5s")) 11187853babSAni Sinha self.add_field('intermediate_checksum', u.unpack_one("B")) 11287853babSAni Sinha self.add_field('structure_table_length', u.unpack_one("<H")) 11387853babSAni Sinha self.add_field('structure_table_address', u.unpack_one("<I")) 11487853babSAni Sinha self.add_field('number_structures', u.unpack_one("<H")) 11587853babSAni Sinha self.add_field('bcd_revision', u.unpack_one("B")) 11687853babSAni Sinha if not u.at_end(): 11787853babSAni Sinha self.add_field('data', u.unpack_rest()) 11887853babSAni Sinha 11987853babSAni Sinhaclass SmbiosBaseStructure(unpack.Struct): 12087853babSAni Sinha def __new__(cls, u, sm): 12187853babSAni Sinha t = u.unpack_peek_one("B") 12287853babSAni Sinha if cls.smbios_structure_type is not None and t != cls.smbios_structure_type: 12387853babSAni Sinha return None 12487853babSAni Sinha return super(SmbiosBaseStructure, cls).__new__(cls) 12587853babSAni Sinha 12687853babSAni Sinha def __init__(self, u, sm): 12787853babSAni Sinha super(SmbiosBaseStructure, self).__init__() 12887853babSAni Sinha self.start_offset = u.offset 12987853babSAni Sinha length = u.unpack_peek_one("<xB") 13087853babSAni Sinha self.raw_data = u.unpack_raw(length) 13187853babSAni Sinha self.u = unpack.Unpackable(self.raw_data) 13287853babSAni Sinha 13387853babSAni Sinha self.strings_offset = u.offset 13487853babSAni Sinha def unpack_string(): 13587853babSAni Sinha return "".join(iter(lambda: u.unpack_one("c"), "\x00")) 13687853babSAni Sinha strings = list(iter(unpack_string, "")) 13787853babSAni Sinha if not strings: 13887853babSAni Sinha u.skip(1) 13987853babSAni Sinha 14087853babSAni Sinha self.strings_length = u.offset - self.strings_offset 14187853babSAni Sinha self.raw_strings = str(bits.memory(sm.header.structure_table_address + self.strings_offset, self.strings_length)) 14287853babSAni Sinha 14387853babSAni Sinha if len(strings): 14487853babSAni Sinha self.strings = strings 14587853babSAni Sinha 14687853babSAni Sinha self.add_field('type', self.u.unpack_one("B")) 14787853babSAni Sinha self.add_field('length', self.u.unpack_one("B")) 14887853babSAni Sinha self.add_field('handle', self.u.unpack_one("<H")) 14987853babSAni Sinha 15087853babSAni Sinha def fini(self): 15187853babSAni Sinha if not self.u.at_end(): 15287853babSAni Sinha self.add_field('data', self.u.unpack_rest()) 15387853babSAni Sinha del self.u 15487853babSAni Sinha 15587853babSAni Sinha def fmtstr(self, i): 15687853babSAni Sinha """Format the specified index and the associated string""" 15787853babSAni Sinha return "{} '{}'".format(i, self.getstr(i)) 15887853babSAni Sinha 15987853babSAni Sinha def getstr(self, i): 16087853babSAni Sinha """Get the string associated with the given index""" 16187853babSAni Sinha if i == 0: 16287853babSAni Sinha return "(none)" 16387853babSAni Sinha if not hasattr(self, "strings"): 16487853babSAni Sinha return "(error: structure has no strings)" 16587853babSAni Sinha if i > len(self.strings): 16687853babSAni Sinha return "(error: string index out of range)" 16787853babSAni Sinha return self.strings[i - 1] 16887853babSAni Sinha 16987853babSAni Sinhaclass BIOSInformation(SmbiosBaseStructure): 17087853babSAni Sinha smbios_structure_type = 0 17187853babSAni Sinha 17287853babSAni Sinha def __init__(self, u, sm): 17387853babSAni Sinha super(BIOSInformation, self).__init__(u, sm) 17487853babSAni Sinha u = self.u 17587853babSAni Sinha try: 17687853babSAni Sinha self.add_field('vendor', u.unpack_one("B"), self.fmtstr) 17787853babSAni Sinha self.add_field('version', u.unpack_one("B"), self.fmtstr) 17887853babSAni Sinha self.add_field('starting_address_segment', u.unpack_one("<H")) 17987853babSAni Sinha self.add_field('release_date', u.unpack_one("B"), self.fmtstr) 18087853babSAni Sinha self.add_field('rom_size', u.unpack_one("B")) 18187853babSAni Sinha self.add_field('characteristics', u.unpack_one("<Q")) 18287853babSAni Sinha minor_version_str = str(sm.header.minor_version) # 34 is .34, 4 is .4, 41 is .41; compare ASCIIbetically to compare initial digits rather than numeric value 18387853babSAni Sinha if (sm.header.major_version, minor_version_str) >= (2,"4"): 18487853babSAni Sinha characteristic_bytes = 2 18587853babSAni Sinha else: 18687853babSAni Sinha characteristic_bytes = self.length - 0x12 18787853babSAni Sinha self.add_field('characteristics_extensions', [u.unpack_one("B") for b in range(characteristic_bytes)]) 18887853babSAni Sinha if (sm.header.major_version, minor_version_str) >= (2,"4"): 18987853babSAni Sinha self.add_field('major_release', u.unpack_one("B")) 19087853babSAni Sinha self.add_field('minor_release', u.unpack_one("B")) 19187853babSAni Sinha self.add_field('ec_major_release', u.unpack_one("B")) 19287853babSAni Sinha self.add_field('ec_minor_release', u.unpack_one("B")) 19387853babSAni Sinha except: 19487853babSAni Sinha self.decode_failure = True 19587853babSAni Sinha print "Error parsing BIOSInformation" 19687853babSAni Sinha import traceback 19787853babSAni Sinha traceback.print_exc() 19887853babSAni Sinha self.fini() 19987853babSAni Sinha 20087853babSAni Sinhaclass SystemInformation(SmbiosBaseStructure): 20187853babSAni Sinha smbios_structure_type = 1 20287853babSAni Sinha 20387853babSAni Sinha def __init__(self, u, sm): 20487853babSAni Sinha super(SystemInformation, self).__init__(u, sm) 20587853babSAni Sinha u = self.u 20687853babSAni Sinha try: 20787853babSAni Sinha self.add_field('manufacturer', u.unpack_one("B"), self.fmtstr) 20887853babSAni Sinha self.add_field('product_name', u.unpack_one("B"), self.fmtstr) 20987853babSAni Sinha self.add_field('version', u.unpack_one("B"), self.fmtstr) 21087853babSAni Sinha self.add_field('serial_number', u.unpack_one("B"), self.fmtstr) 21187853babSAni Sinha if self.length > 0x8: 21287853babSAni Sinha self.add_field('uuid', uuid.UUID(bytes_le=u.unpack_one("16s"))) 21387853babSAni Sinha wakeup_types = { 21487853babSAni Sinha 0: 'Reserved', 21587853babSAni Sinha 1: 'Other', 21687853babSAni Sinha 2: 'Unknown', 21787853babSAni Sinha 3: 'APM Timer', 21887853babSAni Sinha 4: 'Modem Ring', 21987853babSAni Sinha 5: 'LAN Remote', 22087853babSAni Sinha 6: 'Power Switch', 22187853babSAni Sinha 7: 'PCI PME#', 22287853babSAni Sinha 8: 'AC Power Restored' 22387853babSAni Sinha } 22487853babSAni Sinha self.add_field('wakeup_type', u.unpack_one("B"), unpack.format_table("{}", wakeup_types)) 22587853babSAni Sinha if self.length > 0x19: 22687853babSAni Sinha self.add_field('sku_number', u.unpack_one("B"), self.fmtstr) 22787853babSAni Sinha self.add_field('family', u.unpack_one("B"), self.fmtstr) 22887853babSAni Sinha except: 22987853babSAni Sinha self.decode_failure = True 23087853babSAni Sinha print "Error parsing SystemInformation" 23187853babSAni Sinha import traceback 23287853babSAni Sinha traceback.print_exc() 23387853babSAni Sinha self.fini() 23487853babSAni Sinha 23587853babSAni Sinha_board_types = { 23687853babSAni Sinha 1: 'Unknown', 23787853babSAni Sinha 2: 'Other', 23887853babSAni Sinha 3: 'Server Blade', 23987853babSAni Sinha 4: 'Connectivity Switch', 24087853babSAni Sinha 5: 'System Management Module', 24187853babSAni Sinha 6: 'Processor Module', 24287853babSAni Sinha 7: 'I/O Module', 24387853babSAni Sinha 8: 'Memory Module', 24487853babSAni Sinha 9: 'Daughter Board', 24587853babSAni Sinha 0xA: 'Motherboard', 24687853babSAni Sinha 0xB: 'Processor/Memory Module', 24787853babSAni Sinha 0xC: 'Processor/IO Module', 24887853babSAni Sinha 0xD: 'Interconnect Board' 24987853babSAni Sinha} 25087853babSAni Sinha 25187853babSAni Sinhaclass BaseboardInformation(SmbiosBaseStructure): 25287853babSAni Sinha smbios_structure_type = 2 25387853babSAni Sinha 25487853babSAni Sinha def __init__(self, u, sm): 25587853babSAni Sinha super(BaseboardInformation, self).__init__(u, sm) 25687853babSAni Sinha u = self.u 25787853babSAni Sinha try: 25887853babSAni Sinha self.add_field('manufacturer', u.unpack_one("B"), self.fmtstr) 25987853babSAni Sinha self.add_field('product', u.unpack_one("B"), self.fmtstr) 26087853babSAni Sinha self.add_field('version', u.unpack_one("B"), self.fmtstr) 26187853babSAni Sinha self.add_field('serial_number', u.unpack_one("B"), self.fmtstr) 26287853babSAni Sinha 26387853babSAni Sinha if self.length > 0x8: 26487853babSAni Sinha self.add_field('asset_tag', u.unpack_one("B"), self.fmtstr) 26587853babSAni Sinha 26687853babSAni Sinha if self.length > 0x9: 26787853babSAni Sinha self.add_field('feature_flags', u.unpack_one("B")) 26887853babSAni Sinha self.add_field('hosting_board', bool(bitfields.getbits(self.feature_flags, 0)), "feature_flags[0]={}") 26987853babSAni Sinha self.add_field('requires_daughter_card', bool(bitfields.getbits(self.feature_flags, 1)), "feature_flags[1]={}") 27087853babSAni Sinha self.add_field('removable', bool(bitfields.getbits(self.feature_flags, 2)), "feature_flags[2]={}") 27187853babSAni Sinha self.add_field('replaceable', bool(bitfields.getbits(self.feature_flags, 3)), "feature_flags[3]={}") 27287853babSAni Sinha self.add_field('hot_swappable', bool(bitfields.getbits(self.feature_flags, 4)), "feature_flags[4]={}") 27387853babSAni Sinha 27487853babSAni Sinha if self.length > 0xA: 27587853babSAni Sinha self.add_field('location', u.unpack_one("B"), self.fmtstr) 27687853babSAni Sinha 27787853babSAni Sinha if self.length > 0xB: 27887853babSAni Sinha self.add_field('chassis_handle', u.unpack_one("<H")) 27987853babSAni Sinha 28087853babSAni Sinha if self.length > 0xD: 28187853babSAni Sinha self.add_field('board_type', u.unpack_one("B"), unpack.format_table("{}", _board_types)) 28287853babSAni Sinha 28387853babSAni Sinha if self.length > 0xE: 28487853babSAni Sinha self.add_field('handle_count', u.unpack_one("B")) 28587853babSAni Sinha if self.handle_count > 0: 28687853babSAni Sinha self.add_field('contained_object_handles', tuple(u.unpack_one("<H") for i in range(self.handle_count))) 28787853babSAni Sinha except: 28887853babSAni Sinha self.decode_failure = True 28987853babSAni Sinha print "Error parsing BaseboardInformation" 29087853babSAni Sinha import traceback 29187853babSAni Sinha traceback.print_exc() 29287853babSAni Sinha self.fini() 29387853babSAni Sinha 29487853babSAni Sinhaclass SystemEnclosure(SmbiosBaseStructure): 29587853babSAni Sinha smbios_structure_type = 3 29687853babSAni Sinha 29787853babSAni Sinha def __init__(self, u, sm): 29887853babSAni Sinha super(SystemEnclosure, self).__init__(u, sm) 29987853babSAni Sinha u = self.u 30087853babSAni Sinha try: 30187853babSAni Sinha self.add_field('manufacturer', u.unpack_one("B"), self.fmtstr) 30287853babSAni Sinha self.add_field('enumerated_type', u.unpack_one("B")) 30387853babSAni Sinha self.add_field('chassis_lock_present', bool(bitfields.getbits(self.enumerated_type, 7)), "enumerated_type[7]={}") 30487853babSAni Sinha board_types = { 30587853babSAni Sinha 0x01: 'Other', 30687853babSAni Sinha 0x02: 'Unknown', 30787853babSAni Sinha 0x03: 'Desktop', 30887853babSAni Sinha 0x04: 'Low Profile Desktop', 30987853babSAni Sinha 0x05: 'Pizza Box', 31087853babSAni Sinha 0x06: 'Mini Tower', 31187853babSAni Sinha 0x07: 'Tower', 31287853babSAni Sinha 0x08: 'Portable', 31387853babSAni Sinha 0x09: 'Laptop', 31487853babSAni Sinha 0x0A: 'Notebook', 31587853babSAni Sinha 0x0B: 'Hand Held', 31687853babSAni Sinha 0x0C: 'Docking Station', 31787853babSAni Sinha 0x0D: 'All in One', 31887853babSAni Sinha 0x0E: 'Sub Notebook', 31987853babSAni Sinha 0x0F: 'Space-saving', 32087853babSAni Sinha 0x10: 'Lunch Box', 32187853babSAni Sinha 0x11: 'Main Server Chassis', 32287853babSAni Sinha 0x12: 'Expansion Chassis', 32387853babSAni Sinha 0x13: 'SubChassis', 32487853babSAni Sinha 0x14: 'Bus Expansion Chassis', 32587853babSAni Sinha 0x15: 'Peripheral Chassis', 32687853babSAni Sinha 0x16: 'RAID Chassis', 32787853babSAni Sinha 0x17: 'Rack Mount Chassis', 32887853babSAni Sinha 0x18: 'Sealed-case PC', 32987853babSAni Sinha 0x19: 'Multi-system chassis W', 33087853babSAni Sinha 0x1A: 'Compact PCI', 33187853babSAni Sinha 0x1B: 'Advanced TCA', 33287853babSAni Sinha 0x1C: 'Blade', 33387853babSAni Sinha 0x1D: 'Blade Enclosure', 33487853babSAni Sinha } 33587853babSAni Sinha self.add_field('system_enclosure_type', bitfields.getbits(self.enumerated_type, 6, 0), unpack.format_table("enumerated_type[6:0]={}", board_types)) 33687853babSAni Sinha self.add_field('version', u.unpack_one("B"), self.fmtstr) 33787853babSAni Sinha self.add_field('serial_number', u.unpack_one("B"), self.fmtstr) 33887853babSAni Sinha self.add_field('asset_tag', u.unpack_one("B"), self.fmtstr) 33987853babSAni Sinha minor_version_str = str(sm.header.minor_version) # 34 is .34, 4 is .4, 41 is .41; compare ASCIIbetically to compare initial digits rather than numeric value 34087853babSAni Sinha if self.length > 9: 34187853babSAni Sinha chassis_states = { 34287853babSAni Sinha 0x01: 'Other', 34387853babSAni Sinha 0x02: 'Unknown', 34487853babSAni Sinha 0x03: 'Safe', 34587853babSAni Sinha 0x04: 'Warning', 34687853babSAni Sinha 0x05: 'Critical', 34787853babSAni Sinha 0x06: 'Non-recoverable', 34887853babSAni Sinha } 34987853babSAni Sinha self.add_field('bootup_state', u.unpack_one("B"), unpack.format_table("{}", chassis_states)) 35087853babSAni Sinha self.add_field('power_supply_state', u.unpack_one("B"), unpack.format_table("{}", chassis_states)) 35187853babSAni Sinha self.add_field('thermal_state', u.unpack_one("B"), unpack.format_table("{}", chassis_states)) 35287853babSAni Sinha security_states = { 35387853babSAni Sinha 0x01: 'Other', 35487853babSAni Sinha 0x02: 'Unknown', 35587853babSAni Sinha 0x03: 'None', 35687853babSAni Sinha 0x04: 'External interface locked out', 35787853babSAni Sinha 0x05: 'External interface enabled', 35887853babSAni Sinha } 35987853babSAni Sinha self.add_field('security_status', u.unpack_one("B"), unpack.format_table("{}", security_states)) 36087853babSAni Sinha if self.length > 0xd: 36187853babSAni Sinha self.add_field('oem_defined', u.unpack_one("<I")) 36287853babSAni Sinha if self.length > 0x11: 36387853babSAni Sinha self.add_field('height', u.unpack_one("B")) 36487853babSAni Sinha self.add_field('num_power_cords', u.unpack_one("B")) 36587853babSAni Sinha self.add_field('contained_element_count', u.unpack_one("B")) 36687853babSAni Sinha self.add_field('contained_element_length', u.unpack_one("B")) 36787853babSAni Sinha if getattr(self, 'contained_element_count', 0): 36887853babSAni Sinha self.add_field('contained_elements', tuple(SystemEnclosureContainedElement(u, self.contained_element_length) for i in range(self.contained_element_count))) 36987853babSAni Sinha if self.length > (0x15 + (getattr(self, 'contained_element_count', 0) * getattr(self, 'contained_element_length', 0))): 37087853babSAni Sinha self.add_field('sku_number', u.unpack_one("B"), self.fmtstr) 37187853babSAni Sinha except: 37287853babSAni Sinha self.decode_failure = True 37387853babSAni Sinha print "Error parsing SystemEnclosure" 37487853babSAni Sinha import traceback 37587853babSAni Sinha traceback.print_exc() 37687853babSAni Sinha self.fini() 37787853babSAni Sinha 37887853babSAni Sinhaclass SystemEnclosureContainedElement(unpack.Struct): 37987853babSAni Sinha def __init__(self, u, length): 38087853babSAni Sinha super(SystemEnclosureContainedElement, self).__init__() 38187853babSAni Sinha self.start_offset = u.offset 38287853babSAni Sinha self.raw_data = u.unpack_raw(length) 38387853babSAni Sinha self.u = unpack.Unpackable(self.raw_data) 38487853babSAni Sinha u = self.u 38587853babSAni Sinha self.add_field('contained_element_type', u.unpack_one("B")) 38687853babSAni Sinha type_selections = { 38787853babSAni Sinha 0: 'SMBIOS baseboard type enumeration', 38887853babSAni Sinha 1: 'SMBIOS structure type enumeration', 38987853babSAni Sinha } 39087853babSAni Sinha self.add_field('type_select', bitfields.getbits(self.contained_element_type, 7), unpack.format_table("contained_element_type[7]={}", type_selections)) 39187853babSAni Sinha self.add_field('type', bitfields.getbits(self.contained_element_type, 6, 0)) 39287853babSAni Sinha if self.type_select == 0: 39387853babSAni Sinha self.add_field('smbios_board_type', self.type, unpack.format_table("{}", _board_types)) 39487853babSAni Sinha else: 39587853babSAni Sinha self.add_field('smbios_structure_type', self.type) 39687853babSAni Sinha self.add_field('minimum', u.unpack_one("B")) 39787853babSAni Sinha self.add_field('maximum', u.unpack_one("B")) 39887853babSAni Sinha if not u.at_end(): 39987853babSAni Sinha self.add_field('data', u.unpack_rest()) 40087853babSAni Sinha del self.u 40187853babSAni Sinha 40287853babSAni Sinhaclass ProcessorInformation(SmbiosBaseStructure): 40387853babSAni Sinha smbios_structure_type = 4 40487853babSAni Sinha 40587853babSAni Sinha def __init__(self, u, sm): 40687853babSAni Sinha super(ProcessorInformation, self).__init__(u, sm) 40787853babSAni Sinha u = self.u 40887853babSAni Sinha try: 40987853babSAni Sinha self.add_field('socket_designation', u.unpack_one("B"), self.fmtstr) 41087853babSAni Sinha processor_types = { 41187853babSAni Sinha 0x01: 'Other', 41287853babSAni Sinha 0x02: 'Unknown', 41387853babSAni Sinha 0x03: 'Central Processor', 41487853babSAni Sinha 0x04: 'Math Processor', 41587853babSAni Sinha 0x05: 'DSP Processor', 41687853babSAni Sinha 0x06: 'Video Processor', 41787853babSAni Sinha } 41887853babSAni Sinha self.add_field('processor_type', u.unpack_one("B"), unpack.format_table("{}", processor_types)) 41987853babSAni Sinha self.add_field('processor_family', u.unpack_one("B")) 42087853babSAni Sinha self.add_field('processor_manufacturer', u.unpack_one("B"), self.fmtstr) 42187853babSAni Sinha self.add_field('processor_id', u.unpack_one("<Q")) 42287853babSAni Sinha self.add_field('processor_version', u.unpack_one("B"), self.fmtstr) 42387853babSAni Sinha self.add_field('voltage', u.unpack_one("B")) 42487853babSAni Sinha self.add_field('external_clock', u.unpack_one("<H")) 42587853babSAni Sinha self.add_field('max_speed', u.unpack_one("<H")) 42687853babSAni Sinha self.add_field('current_speed', u.unpack_one("<H")) 42787853babSAni Sinha self.add_field('status', u.unpack_one("B")) 42887853babSAni Sinha processor_upgrades = { 42987853babSAni Sinha 0x01: 'Other', 43087853babSAni Sinha 0x02: 'Unknown', 43187853babSAni Sinha 0x03: 'Daughter Board', 43287853babSAni Sinha 0x04: 'ZIF Socket', 43387853babSAni Sinha 0x05: 'Replaceable Piggy Back', 43487853babSAni Sinha 0x06: 'None', 43587853babSAni Sinha 0x07: 'LIF Socket', 43687853babSAni Sinha 0x08: 'Slot 1', 43787853babSAni Sinha 0x09: 'Slot 2', 43887853babSAni Sinha 0x0A: '370-pin socket', 43987853babSAni Sinha 0x0B: 'Slot A', 44087853babSAni Sinha 0x0C: 'Slot M', 44187853babSAni Sinha 0x0D: 'Socket 423', 44287853babSAni Sinha 0x0E: 'Socket A (Socket 462)', 44387853babSAni Sinha 0x0F: 'Socket 478', 44487853babSAni Sinha 0x10: 'Socket 754', 44587853babSAni Sinha 0x11: 'Socket 940', 44687853babSAni Sinha 0x12: 'Socket 939', 44787853babSAni Sinha 0x13: 'Socket mPGA604', 44887853babSAni Sinha 0x14: 'Socket LGA771', 44987853babSAni Sinha 0x15: 'Socket LGA775', 45087853babSAni Sinha 0x16: 'Socket S1', 45187853babSAni Sinha 0x17: 'Socket AM2', 45287853babSAni Sinha 0x18: 'Socket F (1207)', 45387853babSAni Sinha 0x19: 'Socket LGA1366', 45487853babSAni Sinha 0x1A: 'Socket G34', 45587853babSAni Sinha 0x1B: 'Socket AM3', 45687853babSAni Sinha 0x1C: 'Socket C32', 45787853babSAni Sinha 0x1D: 'Socket LGA1156', 45887853babSAni Sinha 0x1E: 'Socket LGA1567', 45987853babSAni Sinha 0x1F: 'Socket PGA988A', 46087853babSAni Sinha 0x20: 'Socket BGA1288', 46187853babSAni Sinha 0x21: 'Socket rPGA988B', 46287853babSAni Sinha 0x22: 'Socket BGA1023', 46387853babSAni Sinha 0x23: 'Socket BGA1224', 46487853babSAni Sinha 0x24: 'Socket BGA1155', 46587853babSAni Sinha 0x25: 'Socket LGA1356', 46687853babSAni Sinha 0x26: 'Socket LGA2011', 46787853babSAni Sinha 0x27: 'Socket FS1', 46887853babSAni Sinha 0x28: 'Socket FS2', 46987853babSAni Sinha 0x29: 'Socket FM1', 47087853babSAni Sinha 0x2A: 'Socket FM2', 47187853babSAni Sinha } 47287853babSAni Sinha self.add_field('processor_upgrade', u.unpack_one("B"), unpack.format_table("{}", processor_upgrades)) 47387853babSAni Sinha if self.length > 0x1A: 47487853babSAni Sinha self.add_field('l1_cache_handle', u.unpack_one("<H")) 47587853babSAni Sinha self.add_field('l2_cache_handle', u.unpack_one("<H")) 47687853babSAni Sinha self.add_field('l3_cache_handle', u.unpack_one("<H")) 47787853babSAni Sinha if self.length > 0x20: 47887853babSAni Sinha self.add_field('serial_number', u.unpack_one("B"), self.fmtstr) 47987853babSAni Sinha self.add_field('asset_tag', u.unpack_one("B"), self.fmtstr) 48087853babSAni Sinha self.add_field('part_number', u.unpack_one("B"), self.fmtstr) 48187853babSAni Sinha if self.length > 0x24: 48287853babSAni Sinha self.add_field('core_count', u.unpack_one("B")) 48387853babSAni Sinha self.add_field('core_enabled', u.unpack_one("B")) 48487853babSAni Sinha self.add_field('thread_count', u.unpack_one("B")) 48587853babSAni Sinha self.add_field('processor_characteristics', u.unpack_one("<H")) 48687853babSAni Sinha if self.length > 0x28: 48787853babSAni Sinha self.add_field('processor_family_2', u.unpack_one("<H")) 48887853babSAni Sinha if self.length > 0x2A: 48987853babSAni Sinha self.add_field('core_count2', u.unpack_one("<H")) 49087853babSAni Sinha self.add_field('core_enabled2', u.unpack_one("<H")) 49187853babSAni Sinha self.add_field('thread_count2', u.unpack_one("<H")) 49287853babSAni Sinha except: 49387853babSAni Sinha self.decode_failure = True 49487853babSAni Sinha print "Error parsing Processor Information" 49587853babSAni Sinha import traceback 49687853babSAni Sinha traceback.print_exc() 49787853babSAni Sinha self.fini() 49887853babSAni Sinha 49987853babSAni Sinhaclass MemoryControllerInformation(SmbiosBaseStructure): #obsolete starting with v2.1 50087853babSAni Sinha smbios_structure_type = 5 50187853babSAni Sinha 50287853babSAni Sinha def __init__(self, u, sm): 50387853babSAni Sinha super(MemoryControllerInformation, self).__init__(u, sm) 50487853babSAni Sinha u = self.u 50587853babSAni Sinha try: 50687853babSAni Sinha _error_detecting_method = { 50787853babSAni Sinha 0x01: 'Other', 50887853babSAni Sinha 0x02: 'Unknown', 50987853babSAni Sinha 0x03: 'None', 51087853babSAni Sinha 0x04: '8-bit Parity', 51187853babSAni Sinha 0x05: '32-bit ECC', 51287853babSAni Sinha 0x06: '64-bit ECC', 51387853babSAni Sinha 0x07: '128-bit ECC', 51487853babSAni Sinha 0x08: 'CRC' 51587853babSAni Sinha } 51687853babSAni Sinha self.add_field('error_detecting_method', u.unpack_one("B"), unpack.format_table("{}", _error_detecting_method)) 51787853babSAni Sinha self.add_field('error_correcting_capability', u.unpack_one("B")) 51887853babSAni Sinha _interleaves = { 51987853babSAni Sinha 0x01: 'Other', 52087853babSAni Sinha 0x02: 'Unknown', 52187853babSAni Sinha 0x03: 'One-Way Interleave', 52287853babSAni Sinha 0x04: 'Two-Way Interleave', 52387853babSAni Sinha 0x05: 'Four-Way Interleave', 52487853babSAni Sinha 0x06: 'Eight-Way Interleave', 52587853babSAni Sinha 0x07: 'Sixteen-Way Interleave' 52687853babSAni Sinha } 52787853babSAni Sinha self.add_field('supported_interleave', u.unpack_one("B"), unpack.format_table("{}", _interleaves)) 52887853babSAni Sinha self.add_field('current_interleave', u.unpack_one("B"), unpack.format_table("{}", _interleaves)) 52987853babSAni Sinha self.add_field('max_memory_module_size', u.unpack_one("B"), self.fmtstr) 53087853babSAni Sinha self.add_field('supported_speeds', u.unpack_one("<H")) 53187853babSAni Sinha self.add_field('supported_memory_types', u.unpack_one("<H")) 53287853babSAni Sinha self.add_field('memory_module_voltage', u.unpack_one("B")) 53387853babSAni Sinha self.add_field('req_voltage_b2', bitfields.getbits(self.memory_module_voltage, 2), "memory_module_voltage[2]={}") 53487853babSAni Sinha self.add_field('req_voltage_b1', bitfields.getbits(self.memory_module_voltage, 1), "memory_module_voltage[1]={}") 53587853babSAni Sinha self.add_field('req_voltage_b0', bitfields.getbits(self.memory_module_voltage, 0), "memory_module_voltage[0]={}") 53687853babSAni Sinha self.add_field('num_associated_memory_slots', u.unpack_one("B")) 53787853babSAni Sinha self.add_field('memory_module_configuration_handles', u.unpack_one("<(self.num_associated_memory_slots)H")) 53887853babSAni Sinha self.add_field('enabled_error_correcting_capabilities', u.unpack_one("B")) 53987853babSAni Sinha except: 54087853babSAni Sinha self.decode_failure = True 54187853babSAni Sinha print "Error parsing MemoryControllerInformation" 54287853babSAni Sinha import traceback 54387853babSAni Sinha traceback.print_exc() 54487853babSAni Sinha self.fini() 54587853babSAni Sinha 54687853babSAni Sinhaclass MemoryModuleInformation(SmbiosBaseStructure): #obsolete starting with v2.1 54787853babSAni Sinha smbios_structure_type = 6 54887853babSAni Sinha 54987853babSAni Sinha def __init__(self, u, sm): 55087853babSAni Sinha super(MemoryModuleInformation, self).__init__(u, sm) 55187853babSAni Sinha u = self.u 55287853babSAni Sinha try: 55387853babSAni Sinha self.add_field('socket_designation', u.unpack_one("B"), self.fmtstr) 55487853babSAni Sinha self.add_field('bank_connections', u.unpack_one("B")) 55587853babSAni Sinha self.add_field('current_speed', u.unpack_one("B")) 55687853babSAni Sinha self.add_field('current_memory_type', u.unpack_one("<H")) 55787853babSAni Sinha _mem_connection = { 55887853babSAni Sinha 0: 'single', 55987853babSAni Sinha 1: 'double-bank' 56087853babSAni Sinha } 56187853babSAni Sinha self.add_field('installed_mem', u.unpack_one("B")) 56287853babSAni Sinha self.add_field('installed_size', bitfields.getbits(self.installed_mem, 6, 0), "installed_mem[6:0]={}") 56387853babSAni Sinha self.add_field('installed_memory_module_connection', bitfields.getbits(self.installed_mem, 7), unpack.format_table("installed_mem[7]={}", _mem_connection)) 56487853babSAni Sinha self.add_field('enabled_mem', u.unpack_one("B")) 56587853babSAni Sinha self.add_field('enabled_size', bitfields.getbits(self.installed_mem, 6, 0), "enabled_mem[6:0]={}") 56687853babSAni Sinha self.add_field('enabled_memory_module_connection', bitfields.getbits(self.installed_mem, 7), unpack.format_table("enabled_mem[7]={}", _mem_connection)) 56787853babSAni Sinha self.add_field('error_status', u.unpack_one("B")) 56887853babSAni Sinha self.add_field('error_status_info_obstained_from_event_log', bool(bitfields.getbits(self.error_status, 2)), unpack.format_table("error_status[2]={}", _mem_connection)) 56987853babSAni Sinha self.add_field('correctable_errors_received', bool(bitfields.getbits(self.error_status, 1)), unpack.format_table("error_status[1]={}", _mem_connection)) 57087853babSAni Sinha self.add_field('uncorrectable_errors_received', bool(bitfields.getbits(self.error_status, 0)), unpack.format_table("error_status[0]={}", _mem_connection)) 57187853babSAni Sinha except: 57287853babSAni Sinha self.decode_failure = True 57387853babSAni Sinha print "Error parsing MemoryModuleInformation" 57487853babSAni Sinha import traceback 57587853babSAni Sinha traceback.print_exc() 57687853babSAni Sinha self.fini() 57787853babSAni Sinha 57887853babSAni Sinhaclass CacheInformation(SmbiosBaseStructure): 57987853babSAni Sinha smbios_structure_type = 7 58087853babSAni Sinha 58187853babSAni Sinha def __init__(self, u, sm): 58287853babSAni Sinha super(CacheInformation, self).__init__(u, sm) 58387853babSAni Sinha u = self.u 58487853babSAni Sinha try: 58587853babSAni Sinha self.add_field('socket_designation', u.unpack_one("B"), self.fmtstr) 58687853babSAni Sinha processor_types = { 58787853babSAni Sinha 0x01: 'Other', 58887853babSAni Sinha 0x02: 'Unknown', 58987853babSAni Sinha 0x03: 'Central Processor', 59087853babSAni Sinha 0x04: 'Math Processor', 59187853babSAni Sinha 0x05: 'DSP Processor', 59287853babSAni Sinha 0x06: 'Video Processor', 59387853babSAni Sinha } 59487853babSAni Sinha self.add_field('cache_configuration', u.unpack_one("<H")) 59587853babSAni Sinha _operational_mode = { 59687853babSAni Sinha 0b00: 'Write Through', 59787853babSAni Sinha 0b01: 'Write Back', 59887853babSAni Sinha 0b10: 'Varies with Memory Address', 59987853babSAni Sinha 0b11: 'Unknown' 60087853babSAni Sinha } 60187853babSAni Sinha self.add_field('operational_mode', bitfields.getbits(self.cache_configuration, 9, 8), unpack.format_table("cache_configuration[9:8]={}", _operational_mode)) 60287853babSAni Sinha self.add_field('enabled_at_boot_time', bool(bitfields.getbits(self.cache_configuration, 7)), "cache_configuration[7]={}") 60387853babSAni Sinha _location = { 60487853babSAni Sinha 0b00: 'Internal', 60587853babSAni Sinha 0b01: 'External', 60687853babSAni Sinha 0b10: 'Reserved', 60787853babSAni Sinha 0b11: 'Unknown' 60887853babSAni Sinha } 60987853babSAni Sinha self.add_field('location_relative_to_cpu_module', bitfields.getbits(self.cache_configuration, 6, 5), unpack.format_table("cache_configuration[6:5]={}", _location)) 61087853babSAni Sinha self.add_field('cache_socketed', bool(bitfields.getbits(self.cache_configuration, 3)), "cache_configuration[3]={}") 61187853babSAni Sinha self.add_field('cache_level', bitfields.getbits(self.cache_configuration, 2, 0), "cache_configuration[2:0]={}") 61287853babSAni Sinha self.add_field('max_cache_size', u.unpack_one("<H")) 61387853babSAni Sinha _granularity = { 61487853babSAni Sinha 0: '1K granularity', 61587853babSAni Sinha 1: '64K granularity' 61687853babSAni Sinha } 61787853babSAni Sinha self.add_field('max_granularity', bitfields.getbits(self.cache_configuration, 15), unpack.format_table("max_cache_size[15]={}", _granularity)) 61887853babSAni Sinha self.add_field('max_size_in_granularity', bitfields.getbits(self.cache_configuration, 14, 0), "max_cache_size[14, 0]={}") 61987853babSAni Sinha self.add_field('installed_size', u.unpack_one("<H")) 62087853babSAni Sinha if self.installed_size != 0: 62187853babSAni Sinha self.add_field('installed_granularity', bitfields.getbits(self.cache_configuration, 15), unpack.format_table("installed_size[15]={}", _granularity)) 62287853babSAni Sinha self.add_field('installed_size_in_granularity', bitfields.getbits(self.cache_configuration, 14, 0), "installed_size[14, 0]={}") 62387853babSAni Sinha self.add_field('supported_sram_type', u.unpack_one("<H")) 62487853babSAni Sinha self.add_field('current_sram_type', u.unpack_one("<H")) 62587853babSAni Sinha if self.length > 0x0F: 62687853babSAni Sinha self.add_field('cache_speed', u.unpack_one("B")) 62787853babSAni Sinha if self.length > 0x10: 62887853babSAni Sinha _error_correction = { 62987853babSAni Sinha 0x01: 'Other', 63087853babSAni Sinha 0x02: 'Unknown', 63187853babSAni Sinha 0x03: 'None', 63287853babSAni Sinha 0x04: 'Parity', 63387853babSAni Sinha 0x05: 'Single-bit ECC', 63487853babSAni Sinha 0x06: 'Multi-bit ECC' 63587853babSAni Sinha } 63687853babSAni Sinha self.add_field('error_correction', u.unpack_one("B"), unpack.format_table("{}", _error_correction)) 63787853babSAni Sinha if self.length > 0x10: 63887853babSAni Sinha _system_cache_type = { 63987853babSAni Sinha 0x01: 'Other', 64087853babSAni Sinha 0x02: 'Unknown', 64187853babSAni Sinha 0x03: 'Instruction', 64287853babSAni Sinha 0x04: 'Data', 64387853babSAni Sinha 0x05: 'Unified' 64487853babSAni Sinha } 64587853babSAni Sinha self.add_field('system_cache_type', u.unpack_one("B"), unpack.format_table("{}", _system_cache_type)) 64687853babSAni Sinha if self.length > 0x12: 64787853babSAni Sinha _associativity = { 64887853babSAni Sinha 0x01: 'Other', 64987853babSAni Sinha 0x02: 'Unknown', 65087853babSAni Sinha 0x03: 'Direct Mapped', 65187853babSAni Sinha 0x04: '2-way Set-Associative', 65287853babSAni Sinha 0x05: '4-way Set-Associative', 65387853babSAni Sinha 0x06: 'Fully Associative', 65487853babSAni Sinha 0x07: '8-way Set-Associative', 65587853babSAni Sinha 0x08: '16-way Set-Associative', 65687853babSAni Sinha 0x09: '12-way Set-Associative', 65787853babSAni Sinha 0x0A: '24-way Set-Associative', 65887853babSAni Sinha 0x0B: '32-way Set-Associative', 65987853babSAni Sinha 0x0C: '48-way Set-Associative', 66087853babSAni Sinha 0x0D: '64-way Set-Associative', 66187853babSAni Sinha 0x0E: '20-way Set-Associative' 66287853babSAni Sinha } 66387853babSAni Sinha self.add_field('associativity', u.unpack_one("B"), unpack.format_table("{}", _associativity)) 66487853babSAni Sinha 66587853babSAni Sinha except: 66687853babSAni Sinha self.decode_failure = True 66787853babSAni Sinha print "Error parsing CacheInformation" 66887853babSAni Sinha import traceback 66987853babSAni Sinha traceback.print_exc() 67087853babSAni Sinha self.fini() 67187853babSAni Sinha 67287853babSAni Sinhaclass PortConnectorInfo(SmbiosBaseStructure): 67387853babSAni Sinha smbios_structure_type = 8 67487853babSAni Sinha 67587853babSAni Sinha def __init__(self, u, sm): 67687853babSAni Sinha super(PortConnectorInfo, self).__init__(u, sm) 67787853babSAni Sinha u = self.u 67887853babSAni Sinha try: 67987853babSAni Sinha self.add_field('internal_reference_designator', u.unpack_one("B"), self.fmtstr) 68087853babSAni Sinha connector_types = { 68187853babSAni Sinha 0x00: 'None', 68287853babSAni Sinha 0x01: 'Centronics', 68387853babSAni Sinha 0x02: 'Mini Centronics', 68487853babSAni Sinha 0x03: 'Proprietary', 68587853babSAni Sinha 0x04: 'DB-25 pin male', 68687853babSAni Sinha 0x05: 'DB-25 pin female', 68787853babSAni Sinha 0x06: 'DB-15 pin male', 68887853babSAni Sinha 0x07: 'DB-15 pin female', 68987853babSAni Sinha 0x08: 'DB-9 pin male', 69087853babSAni Sinha 0x09: 'DB-9 pin female', 69187853babSAni Sinha 0x0A: 'RJ-11', 69287853babSAni Sinha 0x0B: 'RJ-45', 69387853babSAni Sinha 0x0C: '50-pin MiniSCSI', 69487853babSAni Sinha 0x0D: 'Mini-DIN', 69587853babSAni Sinha 0x0E: 'Micro-DIN', 69687853babSAni Sinha 0x0F: 'PS/2', 69787853babSAni Sinha 0x10: 'Infrared', 69887853babSAni Sinha 0x11: 'HP-HIL', 69987853babSAni Sinha 0x12: 'Access Bus (USB)', 70087853babSAni Sinha 0x13: 'SSA SCSI', 70187853babSAni Sinha 0x14: 'Circular DIN-8 male', 70287853babSAni Sinha 0x15: 'Circular DIN-8 female', 70387853babSAni Sinha 0x16: 'On Board IDE', 70487853babSAni Sinha 0x17: 'On Board Floppy', 70587853babSAni Sinha 0x18: '9-pin Dual Inline (pin 10 cut)', 70687853babSAni Sinha 0x19: '25-pin Dual Inline (pin 26 cut)', 70787853babSAni Sinha 0x1A: '50-pin Dual Inline', 70887853babSAni Sinha 0x1B: '68-pin Dual Inline', 70987853babSAni Sinha 0x1C: 'On Board Sound Input from CD-ROM', 71087853babSAni Sinha 0x1D: 'Mini-Centronics Type-14', 71187853babSAni Sinha 0x1E: 'Mini-Centronics Type-26', 71287853babSAni Sinha 0x1F: 'Mini-jack (headphones)', 71387853babSAni Sinha 0x20: 'BNC', 71487853babSAni Sinha 0x21: '1394', 71587853babSAni Sinha 0x22: 'SAS/SATA Plug Receptacle', 71687853babSAni Sinha 0xA0: 'PC-98', 71787853babSAni Sinha 0xA1: 'PC-98Hireso', 71887853babSAni Sinha 0xA2: 'PC-H98', 71987853babSAni Sinha 0xA3: 'PC-98Note', 72087853babSAni Sinha 0xA4: 'PC-98Full', 72187853babSAni Sinha 0xFF: 'Other', 72287853babSAni Sinha } 72387853babSAni Sinha self.add_field('internal_connector_type', u.unpack_one("B"), unpack.format_table("{}", connector_types)) 72487853babSAni Sinha self.add_field('external_reference_designator', u.unpack_one("B"), self.fmtstr) 72587853babSAni Sinha self.add_field('external_connector_type', u.unpack_one("B"), unpack.format_table("{}", connector_types)) 72687853babSAni Sinha port_types = { 72787853babSAni Sinha 0x00: 'None', 72887853babSAni Sinha 0x01: 'Parallel Port XT/AT Compatible', 72987853babSAni Sinha 0x02: 'Parallel Port PS/2', 73087853babSAni Sinha 0x03: 'Parallel Port ECP', 73187853babSAni Sinha 0x04: 'Parallel Port EPP', 73287853babSAni Sinha 0x05: 'Parallel Port ECP/EPP', 73387853babSAni Sinha 0x06: 'Serial Port XT/AT Compatible', 73487853babSAni Sinha 0x07: 'Serial Port 16450 Compatible', 73587853babSAni Sinha 0x08: 'Serial Port 16550 Compatible', 73687853babSAni Sinha 0x09: 'Serial Port 16550A Compatible', 73787853babSAni Sinha 0x0A: 'SCSI Port', 73887853babSAni Sinha 0x0B: 'MIDI Port', 73987853babSAni Sinha 0x0C: 'Joy Stick Port', 74087853babSAni Sinha 0x0D: 'Keyboard Port', 74187853babSAni Sinha 0x0E: 'Mouse Port', 74287853babSAni Sinha 0x0F: 'SSA SCSI', 74387853babSAni Sinha 0x10: 'USB', 74487853babSAni Sinha 0x11: 'FireWire (IEEE P1394)', 74587853babSAni Sinha 0x12: 'PCMCIA Type I2', 74687853babSAni Sinha 0x13: 'PCMCIA Type II', 74787853babSAni Sinha 0x14: 'PCMCIA Type III', 74887853babSAni Sinha 0x15: 'Cardbus', 74987853babSAni Sinha 0x16: 'Access Bus Port', 75087853babSAni Sinha 0x17: 'SCSI II', 75187853babSAni Sinha 0x18: 'SCSI Wide', 75287853babSAni Sinha 0x19: 'PC-98', 75387853babSAni Sinha 0x1A: 'PC-98-Hireso', 75487853babSAni Sinha 0x1B: 'PC-H98', 75587853babSAni Sinha 0x1C: 'Video Port', 75687853babSAni Sinha 0x1D: 'Audio Port', 75787853babSAni Sinha 0x1E: 'Modem Port', 75887853babSAni Sinha 0x1F: 'Network Port', 75987853babSAni Sinha 0x20: 'SATA', 76087853babSAni Sinha 0x21: 'SAS', 76187853babSAni Sinha 0xA0: '8251 Compatible', 76287853babSAni Sinha 0xA1: '8251 FIFO Compatible', 76387853babSAni Sinha 0xFF: 'Other', 76487853babSAni Sinha } 76587853babSAni Sinha self.add_field('port_type', u.unpack_one("B"), unpack.format_table("{}", port_types)) 76687853babSAni Sinha except: 76787853babSAni Sinha self.decodeFailure = True 76887853babSAni Sinha print "Error parsing PortConnectorInfo" 76987853babSAni Sinha import traceback 77087853babSAni Sinha traceback.print_exc() 77187853babSAni Sinha self.fini() 77287853babSAni Sinha 77387853babSAni Sinhaclass SystemSlots(SmbiosBaseStructure): 77487853babSAni Sinha smbios_structure_type = 9 77587853babSAni Sinha 77687853babSAni Sinha def __init__(self, u, sm): 77787853babSAni Sinha super(SystemSlots, self).__init__(u, sm) 77887853babSAni Sinha u = self.u 77987853babSAni Sinha try: 78087853babSAni Sinha self.add_field('designation', u.unpack_one("B"), self.fmtstr) 78187853babSAni Sinha _slot_types = { 78287853babSAni Sinha 0x01: 'Other', 78387853babSAni Sinha 0x02: 'Unknown', 78487853babSAni Sinha 0x03: 'ISA', 78587853babSAni Sinha 0x04: 'MCA', 78687853babSAni Sinha 0x05: 'EISA', 78787853babSAni Sinha 0x06: 'PCI', 78887853babSAni Sinha 0x07: 'PC Card (PCMCIA)', 78987853babSAni Sinha 0x08: 'VL-VESA', 79087853babSAni Sinha 0x09: 'Proprietary', 79187853babSAni Sinha 0x0A: 'Processor Card Slot', 79287853babSAni Sinha 0x0B: 'Proprietary Memory Card Slot', 79387853babSAni Sinha 0x0C: 'I/O Riser Card Slot', 79487853babSAni Sinha 0x0D: 'NuBus', 79587853babSAni Sinha 0x0E: 'PCI 66MHz Capable', 79687853babSAni Sinha 0x0F: 'AGP', 79787853babSAni Sinha 0x10: 'AGP 2X', 79887853babSAni Sinha 0x11: 'AGP 4X', 79987853babSAni Sinha 0x12: 'PCI-X', 80087853babSAni Sinha 0x13: 'AGP 8X', 80187853babSAni Sinha 0xA0: 'PC-98/C20', 80287853babSAni Sinha 0xA1: 'PC-98/C24', 80387853babSAni Sinha 0xA2: 'PC-98/E', 80487853babSAni Sinha 0xA3: 'PC-98/Local Bus', 80587853babSAni Sinha 0xA4: 'PC-98/Card', 80687853babSAni Sinha 0xA5: 'PCI Express', 80787853babSAni Sinha 0xA6: 'PCI Express x1', 80887853babSAni Sinha 0xA7: 'PCI Express x2', 80987853babSAni Sinha 0xA8: 'PCI Express x4', 81087853babSAni Sinha 0xA9: 'PCI Express x8', 81187853babSAni Sinha 0xAA: 'PCI Express x16', 81287853babSAni Sinha 0xAB: 'PCI Express Gen 2', 81387853babSAni Sinha 0xAC: 'PCI Express Gen 2 x1', 81487853babSAni Sinha 0xAD: 'PCI Express Gen 2 x2', 81587853babSAni Sinha 0xAE: 'PCI Express Gen 2 x4', 81687853babSAni Sinha 0xAF: 'PCI Express Gen 2 x8', 81787853babSAni Sinha 0xB0: 'PCI Express Gen 2 x16', 81887853babSAni Sinha 0xB1: 'PCI Express Gen 3', 81987853babSAni Sinha 0xB2: 'PCI Express Gen 3 x1', 82087853babSAni Sinha 0xB3: 'PCI Express Gen 3 x2', 82187853babSAni Sinha 0xB4: 'PCI Express Gen 3 x4', 82287853babSAni Sinha 0xB5: 'PCI Express Gen 3 x8', 82387853babSAni Sinha 0xB6: 'PCI Express Gen 3 x16', 82487853babSAni Sinha } 82587853babSAni Sinha self.add_field('slot_type', u.unpack_one("B"), unpack.format_table("{}", _slot_types)) 82687853babSAni Sinha _slot_data_bus_widths = { 82787853babSAni Sinha 0x01: 'Other', 82887853babSAni Sinha 0x02: 'Unknown', 82987853babSAni Sinha 0x03: '8 bit', 83087853babSAni Sinha 0x04: '16 bit', 83187853babSAni Sinha 0x05: '32 bit', 83287853babSAni Sinha 0x06: '64 bit', 83387853babSAni Sinha 0x07: '128 bit', 83487853babSAni Sinha 0x08: '1x or x1', 83587853babSAni Sinha 0x09: '2x or x2', 83687853babSAni Sinha 0x0A: '4x or x4', 83787853babSAni Sinha 0x0B: '8x or x8', 83887853babSAni Sinha 0x0C: '12x or x12', 83987853babSAni Sinha 0x0D: '16x or x16', 84087853babSAni Sinha 0x0E: '32x or x32', 84187853babSAni Sinha } 84287853babSAni Sinha self.add_field('slot_data_bus_width', u.unpack_one('B'), unpack.format_table("{}", _slot_data_bus_widths)) 84387853babSAni Sinha _current_usages = { 84487853babSAni Sinha 0x01: 'Other', 84587853babSAni Sinha 0x02: 'Unknown', 84687853babSAni Sinha 0x03: 'Available', 84787853babSAni Sinha 0x04: 'In use', 84887853babSAni Sinha } 84987853babSAni Sinha self.add_field('current_usage', u.unpack_one('B'), unpack.format_table("{}", _current_usages)) 85087853babSAni Sinha _slot_lengths = { 85187853babSAni Sinha 0x01: 'Other', 85287853babSAni Sinha 0x02: 'Unknown', 85387853babSAni Sinha 0x03: 'Short Length', 85487853babSAni Sinha 0x04: 'Long Length', 85587853babSAni Sinha } 85687853babSAni Sinha self.add_field('slot_length', u.unpack_one('B'), unpack.format_table("{}", _slot_lengths)) 85787853babSAni Sinha self.add_field('slot_id', u.unpack_one('<H')) 85887853babSAni Sinha self.add_field('characteristics1', u.unpack_one('B')) 85987853babSAni Sinha self.add_field('characteristics_unknown', bool(bitfields.getbits(self.characteristics1, 0)), "characteristics1[0]={}") 86087853babSAni Sinha self.add_field('provides_5_0_volts', bool(bitfields.getbits(self.characteristics1, 1)), "characteristics1[1]={}") 86187853babSAni Sinha self.add_field('provides_3_3_volts', bool(bitfields.getbits(self.characteristics1, 2)), "characteristics1[2]={}") 86287853babSAni Sinha self.add_field('shared_slot', bool(bitfields.getbits(self.characteristics1, 3)), "characteristics1[3]={}") 86387853babSAni Sinha self.add_field('supports_pc_card_16', bool(bitfields.getbits(self.characteristics1, 4)), "characteristics1[4]={}") 86487853babSAni Sinha self.add_field('supports_cardbus', bool(bitfields.getbits(self.characteristics1, 5)), "characteristics1[5]={}") 86587853babSAni Sinha self.add_field('supports_zoom_video', bool(bitfields.getbits(self.characteristics1, 6)), "characteristics1[6]={}") 86687853babSAni Sinha self.add_field('supports_modem_ring_resume', bool(bitfields.getbits(self.characteristics1, 7)), "characteristics1[7]={}") 86787853babSAni Sinha if self.length > 0x0C: 86887853babSAni Sinha self.add_field('characteristics2', u.unpack_one('B')) 86987853babSAni Sinha self.add_field('supports_PME', bool(bitfields.getbits(self.characteristics2, 0)), "characteristics2[0]={}") 87087853babSAni Sinha self.add_field('supports_hot_plug', bool(bitfields.getbits(self.characteristics2, 1)), "characteristics2[1]={}") 87187853babSAni Sinha self.add_field('supports_smbus', bool(bitfields.getbits(self.characteristics2, 2)), "characteristics2[2]={}") 87287853babSAni Sinha if self.length > 0x0D: 87387853babSAni Sinha self.add_field('segment_group_number', u.unpack_one('<H')) 87487853babSAni Sinha self.add_field('bus_number', u.unpack_one('B')) 87587853babSAni Sinha self.add_field('device_function_number', u.unpack_one('B')) 87687853babSAni Sinha self.add_field('device_number', bitfields.getbits(self.device_function_number, 7, 3), "device_function_number[7:3]={}") 87787853babSAni Sinha self.add_field('function_number', bitfields.getbits(self.device_function_number, 2, 0), "device_function_number[2:0]={}") 87887853babSAni Sinha except: 87987853babSAni Sinha self.decodeFailure = True 88087853babSAni Sinha print "Error parsing SystemSlots" 88187853babSAni Sinha import traceback 88287853babSAni Sinha traceback.print_exc() 88387853babSAni Sinha self.fini() 88487853babSAni Sinha 88587853babSAni Sinhaclass OnBoardDevicesInformation(SmbiosBaseStructure): 88687853babSAni Sinha smbios_structure_type = 10 88787853babSAni Sinha 88887853babSAni Sinha def __init__(self, u, sm): 88987853babSAni Sinha super(OnBoardDevicesInformation, self).__init__(u, sm) 89087853babSAni Sinha u = self.u 89187853babSAni Sinha try: 89287853babSAni Sinha self.add_field('device_type', u.unpack_one("B")) 89387853babSAni Sinha self.add_field('device_enabled', bool(bitfields.getbits(self.device_type, 7)), "device_type[7]={}") 89487853babSAni Sinha _device_types = { 89587853babSAni Sinha 0x01: 'Other', 89687853babSAni Sinha 0x02: 'Unknown', 89787853babSAni Sinha 0x03: 'Video', 89887853babSAni Sinha 0x04: 'SCSI Controller', 89987853babSAni Sinha 0x05: 'Ethernet', 90087853babSAni Sinha 0x06: 'Token Ring', 90187853babSAni Sinha 0x07: 'Sound', 90287853babSAni Sinha 0x08: 'PATA Controller', 90387853babSAni Sinha 0x09: 'SATA Controller', 90487853babSAni Sinha 0x0A: 'SAS Controller' 90587853babSAni Sinha } 90687853babSAni Sinha self.add_field('type_of_device', bitfields.getbits(self.device_type, 6, 0), unpack.format_table("device_type[6:0]={}", _device_types)) 90787853babSAni Sinha self.add_field('description_string', u.unpack_one("B"), self.fmtstr) 90887853babSAni Sinha except: 90987853babSAni Sinha self.decodeFailure = True 91087853babSAni Sinha print "Error parsing OnBoardDevicesInformation" 91187853babSAni Sinha import traceback 91287853babSAni Sinha traceback.print_exc() 91387853babSAni Sinha self.fini() 91487853babSAni Sinha 91587853babSAni Sinhaclass OEMStrings(SmbiosBaseStructure): 91687853babSAni Sinha smbios_structure_type = 11 91787853babSAni Sinha 91887853babSAni Sinha def __init__(self, u, sm): 91987853babSAni Sinha super(OEMStrings, self).__init__(u, sm) 92087853babSAni Sinha u = self.u 92187853babSAni Sinha try: 92287853babSAni Sinha self.add_field('count', u.unpack_one("B")) 92387853babSAni Sinha except: 92487853babSAni Sinha self.decodeFailure = True 92587853babSAni Sinha print "Error parsing OEMStrings" 92687853babSAni Sinha import traceback 92787853babSAni Sinha traceback.print_exc() 92887853babSAni Sinha self.fini() 92987853babSAni Sinha 93087853babSAni Sinhaclass SystemConfigOptions(SmbiosBaseStructure): 93187853babSAni Sinha smbios_structure_type = 12 93287853babSAni Sinha 93387853babSAni Sinha def __init__(self, u, sm): 93487853babSAni Sinha super(SystemConfigOptions, self).__init__(u, sm) 93587853babSAni Sinha u = self.u 93687853babSAni Sinha try: 93787853babSAni Sinha self.add_field('count', u.unpack_one("B")) 93887853babSAni Sinha except: 93987853babSAni Sinha self.decodeFailure = True 94087853babSAni Sinha print "Error parsing SystemConfigOptions" 94187853babSAni Sinha import traceback 94287853babSAni Sinha traceback.print_exc() 94387853babSAni Sinha self.fini() 94487853babSAni Sinha 94587853babSAni Sinhaclass BIOSLanguageInformation(SmbiosBaseStructure): 94687853babSAni Sinha smbios_structure_type = 13 94787853babSAni Sinha 94887853babSAni Sinha def __init__(self, u, sm): 94987853babSAni Sinha super(BIOSLanguageInformation, self).__init__(u, sm) 95087853babSAni Sinha u = self.u 95187853babSAni Sinha try: 95287853babSAni Sinha self.add_field('installable_languages', u.unpack_one("B")) 95387853babSAni Sinha if self.length > 0x05: 95487853babSAni Sinha self.add_field('flags', u.unpack_one('B')) 95587853babSAni Sinha self.add_field('abbreviated_format', bool(bitfields.getbits(self.flags, 0)), "flags[0]={}") 95687853babSAni Sinha if self.length > 0x6: 95787853babSAni Sinha u.skip(15) 95887853babSAni Sinha self.add_field('current_language', u.unpack_one('B'), self.fmtstr) 95987853babSAni Sinha except: 96087853babSAni Sinha self.decodeFailure = True 96187853babSAni Sinha print "Error parsing BIOSLanguageInformation" 96287853babSAni Sinha import traceback 96387853babSAni Sinha traceback.print_exc() 96487853babSAni Sinha self.fini() 96587853babSAni Sinha 96687853babSAni Sinhaclass GroupAssociations(SmbiosBaseStructure): 96787853babSAni Sinha smbios_structure_type = 14 96887853babSAni Sinha 96987853babSAni Sinha def __init__(self, u, sm): 97087853babSAni Sinha super(GroupAssociations, self).__init__(u, sm) 97187853babSAni Sinha u = self.u 97287853babSAni Sinha try: 97387853babSAni Sinha self.add_field('group_name', u.unpack_one("B"), self.fmtstr) 97487853babSAni Sinha self.add_field('item_type', u.unpack_one('B')) 97587853babSAni Sinha self.add_field('item_handle', u.unpack_one('<H')) 97687853babSAni Sinha except: 97787853babSAni Sinha self.decodeFailure = True 97887853babSAni Sinha print "Error parsing GroupAssociations" 97987853babSAni Sinha import traceback 98087853babSAni Sinha traceback.print_exc() 98187853babSAni Sinha self.fini() 98287853babSAni Sinha 98387853babSAni Sinhaclass SystemEventLog(SmbiosBaseStructure): 98487853babSAni Sinha smbios_structure_type = 15 98587853babSAni Sinha 98687853babSAni Sinha def __init__(self, u, sm): 98787853babSAni Sinha super(SystemEventLog, self).__init__(u, sm) 98887853babSAni Sinha u = self.u 98987853babSAni Sinha try: 99087853babSAni Sinha self.add_field('log_area_length', u.unpack_one("<H")) 99187853babSAni Sinha self.add_field('log_header_start_offset', u.unpack_one('<H')) 99287853babSAni Sinha self.add_field('log_data_start_offset', u.unpack_one('<H')) 99387853babSAni Sinha _access_method = { 99487853babSAni Sinha 0x00: 'Indexed I/O: 1 8-bit index port, 1 8-bit data port', 99587853babSAni Sinha 0x01: 'Indexed I/O: 2 8-bit index ports, 1 8-bit data port', 99687853babSAni Sinha 0x02: 'Indexed I/O: 1 16-bit index port, 1 8-bit data port', 99787853babSAni Sinha 0x03: 'Memory-mapped physical 32-bit address', 99887853babSAni Sinha 0x04: 'Available through General-Purpose NonVolatile Data functions', 99987853babSAni Sinha xrange(0x05, 0x07F): 'Available for future assignment', 100087853babSAni Sinha xrange(0x80, 0xFF): 'BIOS Vendor/OEM-specific' 100187853babSAni Sinha } 100287853babSAni Sinha self.add_field('access_method', u.unpack_one('B'), unpack.format_table("{}", _access_method)) 100387853babSAni Sinha self.add_field('log_status', u.unpack_one('B')) 100487853babSAni Sinha self.add_field('log_area_full', bool(bitfields.getbits(self.log_status, 1)), "log_status[1]={}") 100587853babSAni Sinha self.add_field('log_area_valid', bool(bitfields.getbits(self.log_status, 0)), "log_status[0]={}") 100687853babSAni Sinha self.add_field('log_change_token', u.unpack_one('<I')) 100787853babSAni Sinha self.add_field('access_method_address', u.unpack_one('<I')) 100887853babSAni Sinha if self.length > 0x14: 100987853babSAni Sinha _log_header_formats = { 101087853babSAni Sinha 0: 'No header', 101187853babSAni Sinha 1: 'Type 1 log header', 101287853babSAni Sinha xrange(2, 0x7f): 'Available for future assignment', 101387853babSAni Sinha xrange(0x80, 0xff): 'BIOS vendor or OEM-specific format' 101487853babSAni Sinha } 101587853babSAni Sinha self.add_field('log_header_format', u.unpack_one("B"), unpack.format_table("{}", _log_header_formats)) 101687853babSAni Sinha if self.length > 0x15: 101787853babSAni Sinha self.add_field('num_supported_log_type_descriptors', u.unpack_one('B')) 101887853babSAni Sinha if self.length > 0x16: 101987853babSAni Sinha self.add_field('length_log_type_descriptor', u.unpack_one('B')) 102087853babSAni Sinha if self.length != (0x17 + (self.num_supported_log_type_descriptors * self.length_log_type_descriptor)): 102187853babSAni Sinha print "Error: structure length ({}) != 0x17 + (num_supported_log_type_descriptors ({}) * length_log_type_descriptor({}))".format(self.length, self.num_supported_log_type_descriptors, self.length_log_type_descriptor) 102287853babSAni Sinha print "structure length = {}".format(self.length) 102387853babSAni Sinha print "num_supported_log_type_descriptors = {}".format(self.num_supported_log_type_descriptors) 102487853babSAni Sinha print "length_log_type_descriptor = {}".format(self.length_log_type_descriptor) 102587853babSAni Sinha self.decodeFailure = True 102687853babSAni Sinha self.add_field('descriptors', tuple(EventLogDescriptor.unpack(u) for i in range(self.num_supported_log_type_descriptors)), unpack.format_each("\n{!r}")) 102787853babSAni Sinha except: 102887853babSAni Sinha self.decodeFailure = True 102987853babSAni Sinha print "Error parsing SystemEventLog" 103087853babSAni Sinha import traceback 103187853babSAni Sinha traceback.print_exc() 103287853babSAni Sinha self.fini() 103387853babSAni Sinha 103487853babSAni Sinhaclass EventLogDescriptor(unpack.Struct): 103587853babSAni Sinha @staticmethod 103687853babSAni Sinha def _unpack(u): 103787853babSAni Sinha _event_log_type_descriptors = { 103887853babSAni Sinha 0x00: 'Reserved', 103987853babSAni Sinha 0x01: 'Single-bit ECC memory error', 104087853babSAni Sinha 0x02: 'Multi-bit ECC memory error', 104187853babSAni Sinha 0x03: 'Parity memory error', 104287853babSAni Sinha 0x04: 'Bus time-out', 104387853babSAni Sinha 0x05: 'I/O Channel Check', 104487853babSAni Sinha 0x06: 'Software NMI', 104587853babSAni Sinha 0x07: 'POST Memory Resize', 104687853babSAni Sinha 0x08: 'POST Error', 104787853babSAni Sinha 0x09: 'PCI Parity Error', 104887853babSAni Sinha 0x0A: 'PCI System Error', 104987853babSAni Sinha 0x0B: 'CPU Failure', 105087853babSAni Sinha 0x0C: 'EISA FailSafe Timer time-out', 105187853babSAni Sinha 0x0D: 'Correctable memory log disabled', 105287853babSAni Sinha 0x0E: 'Logging disabled for a specific Event Type - too many errors of the same type received in a short amount of time', 105387853babSAni Sinha 0x0F: 'Reserved', 105487853babSAni Sinha 0x10: 'System Limit Exceeded', 105587853babSAni Sinha 0x11: 'Asynchronous hardware timer expired and issued a system reset', 105687853babSAni Sinha 0x12: 'System configuration information', 105787853babSAni Sinha 0x13: 'Hard-disk information', 105887853babSAni Sinha 0x14: 'System reconfigured', 105987853babSAni Sinha 0x15: 'Uncorrectable CPU-complex error', 106087853babSAni Sinha 0x16: 'Log Area Reset/Cleared', 106187853babSAni Sinha 0x17: 'System boot', 106287853babSAni Sinha xrange(0x18, 0x7F): 'Unused, available for assignment', 106387853babSAni Sinha xrange(0x80, 0xFE): 'Availalbe for system- and OEM-specific assignments', 106487853babSAni Sinha 0xFF: 'End of log' 106587853babSAni Sinha } 106687853babSAni Sinha yield 'log_type', u.unpack_one('B'), unpack.format_table("{}", _event_log_type_descriptors) 106787853babSAni Sinha _event_log_format = { 106887853babSAni Sinha 0x00: 'None', 106987853babSAni Sinha 0x01: 'Handle', 107087853babSAni Sinha 0x02: 'Multiple-Event', 107187853babSAni Sinha 0x03: 'Multiple-Event Handle', 107287853babSAni Sinha 0x04: 'POST Results Bitmap', 107387853babSAni Sinha 0x05: 'System Management Type', 107487853babSAni Sinha 0x06: 'Multiple-Event System Management Type', 107587853babSAni Sinha xrange(0x80, 0xFF): 'OEM assigned' 107687853babSAni Sinha } 107787853babSAni Sinha yield 'variable_data_format_type', u.unpack_one('B'), unpack.format_table("{}", _event_log_format) 107887853babSAni Sinha 107987853babSAni Sinhaclass PhysicalMemoryArray(SmbiosBaseStructure): 108087853babSAni Sinha smbios_structure_type = 16 108187853babSAni Sinha 108287853babSAni Sinha def __init__(self, u, sm): 108387853babSAni Sinha super(PhysicalMemoryArray, self).__init__(u, sm) 108487853babSAni Sinha u = self.u 108587853babSAni Sinha try: 108687853babSAni Sinha if self.length > 0x4: 108787853babSAni Sinha _location_field = { 108887853babSAni Sinha 0x01: "Other", 108987853babSAni Sinha 0x02: "Unknown", 109087853babSAni Sinha 0x03: "System board or motherboard", 109187853babSAni Sinha 0x04: "ISA add-on card", 109287853babSAni Sinha 0x05: "EISA add-on card", 109387853babSAni Sinha 0x06: "PCI add-on card", 109487853babSAni Sinha 0x07: "MCA add-on card", 109587853babSAni Sinha 0x08: "PCMCIA add-on card", 109687853babSAni Sinha 0x09: "Proprietary add-on card", 109787853babSAni Sinha 0x0A: "NuBus", 109887853babSAni Sinha 0xA0: "PC-98/C20 add-on card", 109987853babSAni Sinha 0xA1: "PC-98/C24 add-on card", 110087853babSAni Sinha 0xA2: "PC-98/E add-on card", 110187853babSAni Sinha 0xA3: "PC-98/Local bus add-on card" 110287853babSAni Sinha } 110387853babSAni Sinha self.add_field('location', u.unpack_one("B"), unpack.format_table("{}", _location_field)) 110487853babSAni Sinha if self.length > 0x05: 110587853babSAni Sinha _use = { 110687853babSAni Sinha 0x01: "Other", 110787853babSAni Sinha 0x02: "Unknown", 110887853babSAni Sinha 0x03: "System memory", 110987853babSAni Sinha 0x04: "Video memory", 111087853babSAni Sinha 0x05: "Flash memory", 111187853babSAni Sinha 0x06: "Non-volatile RAM", 111287853babSAni Sinha 0x07: "Cache memory" 111387853babSAni Sinha } 111487853babSAni Sinha self.add_field('use', u.unpack_one('B'), unpack.format_table("{}", _use)) 111587853babSAni Sinha if self.length > 0x06: 111687853babSAni Sinha _error_correction = { 111787853babSAni Sinha 0x01: "Other", 111887853babSAni Sinha 0x02: "Unknown", 111987853babSAni Sinha 0x03: "None", 112087853babSAni Sinha 0x04: "Parity", 112187853babSAni Sinha 0x05: "Single-bit ECC", 112287853babSAni Sinha 0x06: "Multi-bit ECC", 112387853babSAni Sinha 0x07: "CRC" 112487853babSAni Sinha } 112587853babSAni Sinha self.add_field('memory_error_correction', u.unpack_one('B'), unpack.format_table("{}", _error_correction)) 112687853babSAni Sinha if self.length > 0x07: 112787853babSAni Sinha self.add_field('maximum_capacity', u.unpack_one('<I')) 112887853babSAni Sinha if self.length > 0x0B: 112987853babSAni Sinha self.add_field('memory_error_information_handle', u.unpack_one('<H')) 113087853babSAni Sinha if self.length > 0x0D: 113187853babSAni Sinha self.add_field('num_memory_devices', u.unpack_one('<H')) 113287853babSAni Sinha if self.length > 0x0F: 113387853babSAni Sinha self.add_field('extended_maximum_capacity', u.unpack_one('<Q')) 113487853babSAni Sinha except: 113587853babSAni Sinha self.decodeFailure = True 113687853babSAni Sinha print "Error parsing PhysicalMemoryArray" 113787853babSAni Sinha import traceback 113887853babSAni Sinha traceback.print_exc() 113987853babSAni Sinha self.fini() 114087853babSAni Sinha 114187853babSAni Sinhaclass MemoryDevice(SmbiosBaseStructure): 114287853babSAni Sinha smbios_structure_type = 17 114387853babSAni Sinha 114487853babSAni Sinha def __init__(self, u, sm): 114587853babSAni Sinha super(MemoryDevice, self).__init__(u, sm) 114687853babSAni Sinha u = self.u 114787853babSAni Sinha try: 114887853babSAni Sinha if self.length > 0x4: 114987853babSAni Sinha self.add_field('physical_memory_array_handle', u.unpack_one("<H")) 115087853babSAni Sinha if self.length > 0x6: 115187853babSAni Sinha self.add_field('memory_error_information_handle', u.unpack_one("<H")) 115287853babSAni Sinha if self.length > 0x8: 115387853babSAni Sinha self.add_field('total_width', u.unpack_one("<H")) 115487853babSAni Sinha if self.length > 0xA: 115587853babSAni Sinha self.add_field('data_width', u.unpack_one("<H")) 115687853babSAni Sinha if self.length > 0xC: 115787853babSAni Sinha self.add_field('size', u.unpack_one("<H")) 115887853babSAni Sinha if self.length > 0xE: 115987853babSAni Sinha _form_factors = { 116087853babSAni Sinha 0x01: 'Other', 116187853babSAni Sinha 0x02: 'Unknown', 116287853babSAni Sinha 0x03: 'SIMM', 116387853babSAni Sinha 0x04: 'SIP', 116487853babSAni Sinha 0x05: 'Chip', 116587853babSAni Sinha 0x06: 'DIP', 116687853babSAni Sinha 0x07: 'ZIP', 116787853babSAni Sinha 0x08: 'Proprietary Card', 116887853babSAni Sinha 0x09: 'DIMM', 116987853babSAni Sinha 0x0A: 'TSOP', 117087853babSAni Sinha 0x0B: 'Row of chips', 117187853babSAni Sinha 0x0C: 'RIMM', 117287853babSAni Sinha 0x0D: 'SODIMM', 117387853babSAni Sinha 0x0E: 'SRIMM', 117487853babSAni Sinha 0x0F: 'FB-DIMM' 117587853babSAni Sinha } 117687853babSAni Sinha self.add_field('form_factor', u.unpack_one("B"), unpack.format_table("{}", _form_factors)) 117787853babSAni Sinha if self.length > 0xF: 117887853babSAni Sinha self.add_field('device_set', u.unpack_one("B")) 117987853babSAni Sinha if self.length > 0x10: 118087853babSAni Sinha self.add_field('device_locator', u.unpack_one("B"), self.fmtstr) 118187853babSAni Sinha if self.length > 0x11: 118287853babSAni Sinha self.add_field('bank_locator', u.unpack_one("B"), self.fmtstr) 118387853babSAni Sinha if self.length > 0x12: 118487853babSAni Sinha _memory_types = { 118587853babSAni Sinha 0x01: 'Other', 118687853babSAni Sinha 0x02: 'Unknown', 118787853babSAni Sinha 0x03: 'DRAM', 118887853babSAni Sinha 0x04: 'EDRAM', 118987853babSAni Sinha 0x05: 'VRAM', 119087853babSAni Sinha 0x06: 'SRAM', 119187853babSAni Sinha 0x07: 'RAM', 119287853babSAni Sinha 0x08: 'ROM', 119387853babSAni Sinha 0x09: 'FLASH', 119487853babSAni Sinha 0x0A: 'EEPROM', 119587853babSAni Sinha 0x0B: 'FEPROM', 119687853babSAni Sinha 0x0C: 'EPROM', 119787853babSAni Sinha 0x0D: 'CDRAM', 119887853babSAni Sinha 0x0E: '3DRAM', 119987853babSAni Sinha 0x0F: 'SDRAM', 120087853babSAni Sinha 0x10: 'SGRAM', 120187853babSAni Sinha 0x11: 'RDRAM', 120287853babSAni Sinha 0x12: 'DDR', 120387853babSAni Sinha 0x13: 'DDR2', 120487853babSAni Sinha 0x14: 'DDR2 FB-DIMM', 120587853babSAni Sinha xrange(0x15, 0x17): 'Reserved', 120687853babSAni Sinha 0x18: 'DDR3', 120787853babSAni Sinha 0x19: 'FBD2' 120887853babSAni Sinha } 120987853babSAni Sinha self.add_field('memory_type', u.unpack_one("B"), unpack.format_table("{}", _memory_types)) 121087853babSAni Sinha if self.length > 0x13: 121187853babSAni Sinha self.add_field('type_detail', u.unpack_one('<H')) 121287853babSAni Sinha if self.length > 0x15: 121387853babSAni Sinha self.add_field('speed', u.unpack_one("<H")) 121487853babSAni Sinha if self.length > 0x17: 121587853babSAni Sinha self.add_field('manufacturer', u.unpack_one("B"), self.fmtstr) 121687853babSAni Sinha if self.length > 0x18: 121787853babSAni Sinha self.add_field('serial_number', u.unpack_one("B"), self.fmtstr) 121887853babSAni Sinha if self.length > 0x19: 121987853babSAni Sinha self.add_field('asset_tag', u.unpack_one("B"), self.fmtstr) 122087853babSAni Sinha if self.length > 0x1A: 122187853babSAni Sinha self.add_field('part_number', u.unpack_one("B"), self.fmtstr) 122287853babSAni Sinha if self.length > 0x1B: 122387853babSAni Sinha self.add_field('attributes', u.unpack_one("B")) 122487853babSAni Sinha self.add_field('rank', bitfields.getbits(self.attributes, 3, 0), "attributes[3:0]={}") 122587853babSAni Sinha if self.length > 0x1C: 122687853babSAni Sinha if self.size == 0x7FFF: 122787853babSAni Sinha self.add_field('extended_size', u.unpack_one('<I')) 122887853babSAni Sinha self.add_field('mem_size', bitfields.getbits(self.type_detail, 30, 0), "type_detail[30:0]={}") 122987853babSAni Sinha else: 123087853babSAni Sinha u.skip(4) 123187853babSAni Sinha if self.length > 0x20: 123287853babSAni Sinha self.add_field('configured_memory_clock_speed', u.unpack_one("<H")) 123387853babSAni Sinha if self.length > 0x22: 123487853babSAni Sinha self.add_field('minimum_voltage', u.unpack_one("<H")) 123587853babSAni Sinha if self.length > 0x24: 123687853babSAni Sinha self.add_field('maximum_voltage', u.unpack_one("<H")) 123787853babSAni Sinha if self.length > 0x26: 123887853babSAni Sinha self.add_field('configured_voltage', u.unpack_one("<H")) 123987853babSAni Sinha except: 124087853babSAni Sinha self.decodeFailure = True 124187853babSAni Sinha print "Error parsing MemoryDevice" 124287853babSAni Sinha import traceback 124387853babSAni Sinha traceback.print_exc() 124487853babSAni Sinha self.fini() 124587853babSAni Sinha 124687853babSAni Sinhaclass MemoryErrorInfo32Bit(SmbiosBaseStructure): 124787853babSAni Sinha smbios_structure_type = 18 124887853babSAni Sinha 124987853babSAni Sinha def __init__(self, u, sm): 125087853babSAni Sinha super(MemoryErrorInfo32Bit, self).__init__(u, sm) 125187853babSAni Sinha u = self.u 125287853babSAni Sinha try: 125387853babSAni Sinha if self.length > 0x4: 125487853babSAni Sinha _error_types = { 125587853babSAni Sinha 0x01: 'Other', 125687853babSAni Sinha 0x02: 'Unknown', 125787853babSAni Sinha 0x03: 'OK', 125887853babSAni Sinha 0x04: 'Bad read', 125987853babSAni Sinha 0x05: 'Parity error', 126087853babSAni Sinha 0x06: 'Single-bit error', 126187853babSAni Sinha 0x07: 'Double-bit error', 126287853babSAni Sinha 0x08: 'Multi-bit error', 126387853babSAni Sinha 0x09: 'Nibble error', 126487853babSAni Sinha 0x0A: 'Checksum error', 126587853babSAni Sinha 0x0B: 'CRC error', 126687853babSAni Sinha 0x0C: 'Corrected single-bit error', 126787853babSAni Sinha 0x0D: 'Corrected error', 126887853babSAni Sinha 0x0E: 'Uncorrectable error' 126987853babSAni Sinha } 127087853babSAni Sinha self.add_field('error_type', u.unpack_one("B"), unpack.format_table("{}", _error_types)) 127187853babSAni Sinha if self.length > 0x5: 127287853babSAni Sinha _error_granularity_field = { 127387853babSAni Sinha 0x01: 'Other', 127487853babSAni Sinha 0x02: 'Unknown', 127587853babSAni Sinha 0x03: 'Device level', 127687853babSAni Sinha 0x04: 'Memory partition level' 127787853babSAni Sinha } 127887853babSAni Sinha self.add_field('error_granularity', u.unpack_one("B"), unpack.format_table("{}", _error_granularity_field)) 127987853babSAni Sinha if self.length > 0x6: 128087853babSAni Sinha _error_operation_field = { 128187853babSAni Sinha 0x01: 'Other', 128287853babSAni Sinha 0x02: 'Unknown', 128387853babSAni Sinha 0x03: 'Read', 128487853babSAni Sinha 0x04: 'Write', 128587853babSAni Sinha 0x05: 'Partial write' 128687853babSAni Sinha } 128787853babSAni Sinha self.add_field('error_operation', u.unpack_one("B"), unpack.format_table("{}", _error_operation_field)) 128887853babSAni Sinha if self.length > 0x7: 128987853babSAni Sinha self.add_field('vendor_syndrome', u.unpack_one("<I")) 129087853babSAni Sinha if self.length > 0xB: 129187853babSAni Sinha self.add_field('memory_array_error_address', u.unpack_one("<I")) 129287853babSAni Sinha if self.length > 0xF: 129387853babSAni Sinha self.add_field('device_error_address', u.unpack_one("<I")) 129487853babSAni Sinha if self.length > 0x13: 129587853babSAni Sinha self.add_field('error_resolution', u.unpack_one("<I")) 129687853babSAni Sinha except: 129787853babSAni Sinha self.decodeFailure = True 129887853babSAni Sinha print "Error parsing MemoryErrorInfo32Bit" 129987853babSAni Sinha import traceback 130087853babSAni Sinha traceback.print_exc() 130187853babSAni Sinha self.fini() 130287853babSAni Sinha 130387853babSAni Sinhaclass MemoryArrayMappedAddress(SmbiosBaseStructure): 130487853babSAni Sinha smbios_structure_type = 19 130587853babSAni Sinha 130687853babSAni Sinha def __init__(self, u, sm): 130787853babSAni Sinha super(MemoryArrayMappedAddress, self).__init__(u, sm) 130887853babSAni Sinha u = self.u 130987853babSAni Sinha try: 131087853babSAni Sinha if self.length > 0x4: 131187853babSAni Sinha self.add_field('starting_address', u.unpack_one("<I")) 131287853babSAni Sinha # if FFFF FFFF: address stored in Extended Starting Address 131387853babSAni Sinha if self.length > 0x8: 131487853babSAni Sinha self.add_field('ending_address', u.unpack_one("<I")) 131587853babSAni Sinha if self.length > 0xC: 131687853babSAni Sinha self.add_field('memory_array_handle', u.unpack_one("<H")) 131787853babSAni Sinha if self.length > 0xE: 131887853babSAni Sinha self.add_field('partition_width', u.unpack_one("B")) 131987853babSAni Sinha if self.length > 0xF: 132087853babSAni Sinha # valid if starting_address = FFFF FFFF 132187853babSAni Sinha if self.starting_address == 0xFFFFFFFF: 132287853babSAni Sinha self.add_field('extended_starting_address', u.unpack_one("<Q")) 132387853babSAni Sinha if self.length > 0x17: 132487853babSAni Sinha self.add_field('extended_ending_address', u.unpack_one("<Q")) 132587853babSAni Sinha else: 132687853babSAni Sinha u.skip(16) 132787853babSAni Sinha 132887853babSAni Sinha except: 132987853babSAni Sinha self.decodeFailure = True 133087853babSAni Sinha print "Error parsing MemoryArrayMappedAddress" 133187853babSAni Sinha import traceback 133287853babSAni Sinha traceback.print_exc() 133387853babSAni Sinha self.fini() 133487853babSAni Sinha 133587853babSAni Sinhaclass MemoryDeviceMappedAddress(SmbiosBaseStructure): 133687853babSAni Sinha smbios_structure_type = 20 133787853babSAni Sinha 133887853babSAni Sinha def __init__(self, u, sm): 133987853babSAni Sinha super(MemoryDeviceMappedAddress, self).__init__(u, sm) 134087853babSAni Sinha u = self.u 134187853babSAni Sinha try: 134287853babSAni Sinha if self.length > 0x4: 134387853babSAni Sinha self.add_field('starting_address', u.unpack_one("<I")) 134487853babSAni Sinha # if FFFF FFFF: address stored in Extended Starting Address 134587853babSAni Sinha if self.length > 0x8: 134687853babSAni Sinha self.add_field('ending_address', u.unpack_one("<I")) 134787853babSAni Sinha if self.length > 0xC: 134887853babSAni Sinha self.add_field('memory_device_handle', u.unpack_one("<H")) 134987853babSAni Sinha if self.length > 0xE: 135087853babSAni Sinha self.add_field('memory_array_mapped_address_handle', u.unpack_one("<H")) 135187853babSAni Sinha if self.length > 0x10: 135287853babSAni Sinha self.add_field('partition_row_position', u.unpack_one("B")) 135387853babSAni Sinha if self.length > 0x11: 135487853babSAni Sinha self.add_field('interleave_position', u.unpack_one("B")) 135587853babSAni Sinha if self.length > 0x12: 135687853babSAni Sinha self.add_field('interleave_data_depth', u.unpack_one("B")) 135787853babSAni Sinha if self.length > 0x13: 135887853babSAni Sinha # valid if starting_address = FFFF FFFF 135987853babSAni Sinha if self.starting_address == 0xFFFFFFFF: 136087853babSAni Sinha self.add_field('extended_starting_address', u.unpack_one("<Q")) 136187853babSAni Sinha if self.length > 0x1B: 136287853babSAni Sinha self.add_field('extended_ending_address', u.unpack_one("<Q")) 136387853babSAni Sinha else: 136487853babSAni Sinha u.skip(16) 136587853babSAni Sinha except: 136687853babSAni Sinha self.decodeFailure = True 136787853babSAni Sinha print "Error parsing MemoryDeviceMappedAddress" 136887853babSAni Sinha import traceback 136987853babSAni Sinha traceback.print_exc() 137087853babSAni Sinha self.fini() 137187853babSAni Sinha 137287853babSAni Sinhaclass BuiltInPointingDevice(SmbiosBaseStructure): 137387853babSAni Sinha smbios_structure_type = 21 137487853babSAni Sinha 137587853babSAni Sinha def __init__(self, u, sm): 137687853babSAni Sinha super(BuiltInPointingDevice, self).__init__(u, sm) 137787853babSAni Sinha u = self.u 137887853babSAni Sinha try: 137987853babSAni Sinha if self.length > 0x4: 138087853babSAni Sinha _pointing_device_types = { 138187853babSAni Sinha 0x01: 'Other', 138287853babSAni Sinha 0x02: 'Unknown', 138387853babSAni Sinha 0x03: 'Mouse', 138487853babSAni Sinha 0x04: 'Track Ball', 138587853babSAni Sinha 0x05: 'Track Point', 138687853babSAni Sinha 0x06: 'Glide Point', 138787853babSAni Sinha 0x07: 'Touch Pad', 138887853babSAni Sinha 0x08: 'Touch Screen', 138987853babSAni Sinha 0x09: 'Optical Sensor' 139087853babSAni Sinha } 139187853babSAni Sinha self.add_field('pointing_device_type', u.unpack_one("B"), unpack.format_table("{}", _pointing_device_types)) 139287853babSAni Sinha if self.length > 0x5: 139387853babSAni Sinha _interfaces = { 139487853babSAni Sinha 0x01: 'Other', 139587853babSAni Sinha 0x02: 'Unknown', 139687853babSAni Sinha 0x03: 'Serial', 139787853babSAni Sinha 0x04: 'PS/2', 139887853babSAni Sinha 0x05: 'Infared', 139987853babSAni Sinha 0x06: 'HP-HIL', 140087853babSAni Sinha 0x07: 'Bus mouse', 140187853babSAni Sinha 0x08: 'ADB (Apple Desktop Bus)', 140287853babSAni Sinha 0x09: 'Bus mouse DB-9', 140387853babSAni Sinha 0x0A: 'Bus mouse micro-DIN', 140487853babSAni Sinha 0x0B: 'USB' 140587853babSAni Sinha } 140687853babSAni Sinha self.add_field('interface', u.unpack_one("B"), unpack.format_table("{}", _interfaces)) 140787853babSAni Sinha if self.length > 0x6: 140887853babSAni Sinha self.add_field('num_buttons', u.unpack_one("B")) 140987853babSAni Sinha except: 141087853babSAni Sinha self.decodeFailure = True 141187853babSAni Sinha print "Error parsing BuiltInPointingDevice" 141287853babSAni Sinha import traceback 141387853babSAni Sinha traceback.print_exc() 141487853babSAni Sinha self.fini() 141587853babSAni Sinha 141687853babSAni Sinhaclass PortableBattery(SmbiosBaseStructure): 141787853babSAni Sinha smbios_structure_type = 22 141887853babSAni Sinha 141987853babSAni Sinha def __init__(self, u, sm): 142087853babSAni Sinha super(PortableBattery, self).__init__(u, sm) 142187853babSAni Sinha u = self.u 142287853babSAni Sinha try: 142387853babSAni Sinha if self.length > 0x4: 142487853babSAni Sinha self.add_field('location', u.unpack_one("B"), self.fmtstr) 142587853babSAni Sinha if self.length > 0x5: 142687853babSAni Sinha self.add_field('manufacturer', u.unpack_one("B"), self.fmtstr) 142787853babSAni Sinha if self.length > 0x6: 142887853babSAni Sinha self.add_field('manufacturer_date', u.unpack_one("B"), self.fmtstr) 142987853babSAni Sinha if self.length > 0x7: 143087853babSAni Sinha self.add_field('serial_number', u.unpack_one("B"), self.fmtstr) 143187853babSAni Sinha if self.length > 0x8: 143287853babSAni Sinha self.add_field('device_name', u.unpack_one("B"), self.fmtstr) 143387853babSAni Sinha if self.length > 0x9: 143487853babSAni Sinha _device_chemistry = { 143587853babSAni Sinha 0x01: 'Other', 143687853babSAni Sinha 0x02: 'Unknown', 143787853babSAni Sinha 0x03: 'Lead Acid', 143887853babSAni Sinha 0x04: 'Nickel Cadmium', 143987853babSAni Sinha 0x05: 'Nickel metal hydride', 144087853babSAni Sinha 0x06: 'Lithium-ion', 144187853babSAni Sinha 0x07: 'Zinc air', 144287853babSAni Sinha 0x08: 'Lithium Polymer' 144387853babSAni Sinha } 144487853babSAni Sinha self.add_field('device_chemistry', u.unpack_one("B"), unpack.format_table("{}", _device_chemistry)) 144587853babSAni Sinha if self.length > 0xA: 144687853babSAni Sinha self.add_field('design_capacity', u.unpack_one("<H")) 144787853babSAni Sinha if self.length > 0xC: 144887853babSAni Sinha self.add_field('design_voltage', u.unpack_one("<H")) 144987853babSAni Sinha if self.length > 0xE: 145087853babSAni Sinha self.add_field('sbds_version_number', u.unpack_one("B"), self.fmtstr) 145187853babSAni Sinha if self.length > 0xF: 145287853babSAni Sinha self.add_field('max_error_battery_data', u.unpack_one("B"), self.fmtstr) 145387853babSAni Sinha if self.length > 0x10: 145487853babSAni Sinha if self.serial_number == 0: 145587853babSAni Sinha self.add_field('sbds_serial_number', u.unpack_one("<H")) 145687853babSAni Sinha else: 145787853babSAni Sinha u.skip(2) 145887853babSAni Sinha if self.length > 0x12: 145987853babSAni Sinha if self.manufacturer_date == 0: 146087853babSAni Sinha self.add_field('sbds_manufacture_date', u.unpack_one("<H")) 146187853babSAni Sinha self.add_field('year_biased_by_1980', bitfields.getbits(self.sbds_manufacture_date, 15, 9), "sbds_manufacture_date[15:9]={}") 146287853babSAni Sinha self.add_field('month', bitfields.getbits(self.sbds_manufacture_date, 8, 5), "sbds_manufacture_date[8:5]={}") 146387853babSAni Sinha self.add_field('date', bitfields.getbits(self.sbds_manufacture_date, 4, 0), "sbds_manufacture_date[4:0]={}") 146487853babSAni Sinha else: 146587853babSAni Sinha u.skip(2) 146687853babSAni Sinha if self.length > 0x14: 146787853babSAni Sinha if self.device_chemistry == 0x02: 146887853babSAni Sinha self.add_field('sbds_device_chemistry', u.unpack_one("B"), self.fmtstr) 146987853babSAni Sinha else: 147087853babSAni Sinha u.skip(1) 147187853babSAni Sinha if self.length > 0x15: 147287853babSAni Sinha self.add_field('design_capacity_multiplier', u.unpack_one("B")) 147387853babSAni Sinha if self.length > 0x16: 147487853babSAni Sinha self.add_field('oem_specific', u.unpack_one("<I")) 147587853babSAni Sinha except: 147687853babSAni Sinha self.decodeFailure = True 147787853babSAni Sinha print "Error parsing PortableBattery" 147887853babSAni Sinha import traceback 147987853babSAni Sinha traceback.print_exc() 148087853babSAni Sinha self.fini() 148187853babSAni Sinha 148287853babSAni Sinhaclass SystemReset(SmbiosBaseStructure): 148387853babSAni Sinha smbios_structure_type = 23 148487853babSAni Sinha 148587853babSAni Sinha def __init__(self, u, sm): 148687853babSAni Sinha super(SystemReset, self).__init__(u, sm) 148787853babSAni Sinha u = self.u 148887853babSAni Sinha try: 148987853babSAni Sinha if self.length > 0x4: 149087853babSAni Sinha self.add_field('capabilities', u.unpack_one("B")) 149187853babSAni Sinha self.add_field('contains_watchdog_timer', bool(bitfields.getbits(self.capabilities, 5)), "capabilities[5]={}") 149287853babSAni Sinha _boot_option = { 149387853babSAni Sinha 0b00: 'Reserved, do not use', 149487853babSAni Sinha 0b01: 'Operating System', 149587853babSAni Sinha 0b10: 'System utilities', 149687853babSAni Sinha 0b11: 'Do not reboot' 149787853babSAni Sinha } 149887853babSAni Sinha self.add_field('boot_option_on_limit', bitfields.getbits(self.capabilities, 4, 3), unpack.format_table("capabilities[4:3]={}", _boot_option)) 149987853babSAni Sinha self.add_field('boot_option_after_watchdog_reset', bitfields.getbits(self.capabilities, 2, 1), unpack.format_table("capabilities[2:1]={}", _boot_option)) 150087853babSAni Sinha self.add_field('system_reset_enabled_by_user', bool(bitfields.getbits(self.capabilities, 0)), "capabilities[0]={}") 150187853babSAni Sinha if self.length > 0x5: 150287853babSAni Sinha self.add_field('reset_count', u.unpack_one("<H")) 150387853babSAni Sinha if self.length > 0x5: 150487853babSAni Sinha self.add_field('reset_limit', u.unpack_one("<H")) 150587853babSAni Sinha if self.length > 0x9: 150687853babSAni Sinha self.add_field('timer_interval', u.unpack_one("<H")) 150787853babSAni Sinha if self.length > 0xB: 150887853babSAni Sinha self.add_field('timeout', u.unpack_one("<H")) 150987853babSAni Sinha except: 151087853babSAni Sinha self.decodeFailure = True 151187853babSAni Sinha print "Error parsing SystemReset" 151287853babSAni Sinha import traceback 151387853babSAni Sinha traceback.print_exc() 151487853babSAni Sinha self.fini() 151587853babSAni Sinha 151687853babSAni Sinhaclass HardwareSecurity(SmbiosBaseStructure): 151787853babSAni Sinha smbios_structure_type = 24 151887853babSAni Sinha 151987853babSAni Sinha def __init__(self, u, sm): 152087853babSAni Sinha super(HardwareSecurity, self).__init__(u, sm) 152187853babSAni Sinha u = self.u 152287853babSAni Sinha try: 152387853babSAni Sinha if self.length > 0x4: 152487853babSAni Sinha self.add_field('hardware_security_settings', u.unpack_one("B")) 152587853babSAni Sinha _status = { 152687853babSAni Sinha 0x00: 'Disabled', 152787853babSAni Sinha 0x01: 'Enabled', 152887853babSAni Sinha 0x02: 'Not Implemented', 152987853babSAni Sinha 0x03: 'Unknown' 153087853babSAni Sinha } 153187853babSAni Sinha self.add_field('power_on_password_status', bitfields.getbits(self.hardware_security_settings, 7, 6), unpack.format_table("hardware_security_settings[7:6]={}", _status)) 153287853babSAni Sinha self.add_field('keyboard_password_status', bitfields.getbits(self.hardware_security_settings, 5, 4), unpack.format_table("hardware_security_settings[5:4]={}", _status)) 153387853babSAni Sinha self.add_field('admin_password_status', bitfields.getbits(self.hardware_security_settings, 3, 2), unpack.format_table("hardware_security_settings0[3:2]={}", _status)) 153487853babSAni Sinha self.add_field('front_panel_reset_status', bitfields.getbits(self.hardware_security_settings, 1, 0), unpack.format_table("hardware_security_settings[1:0]={}", _status)) 153587853babSAni Sinha except: 153687853babSAni Sinha self.decodeFailure = True 153787853babSAni Sinha print "Error parsing HardwareSecurity" 153887853babSAni Sinha import traceback 153987853babSAni Sinha traceback.print_exc() 154087853babSAni Sinha self.fini() 154187853babSAni Sinha 154287853babSAni Sinhaclass SystemPowerControls(SmbiosBaseStructure): 154387853babSAni Sinha smbios_structure_type = 25 154487853babSAni Sinha 154587853babSAni Sinha def __init__(self, u, sm): 154687853babSAni Sinha super(SystemPowerControls, self).__init__(u, sm) 154787853babSAni Sinha u = self.u 154887853babSAni Sinha try: 154987853babSAni Sinha if self.length > 0x4: 155087853babSAni Sinha self.add_field('next_scheduled_poweron_month', u.unpack_one("B")) 155187853babSAni Sinha self.add_field('next_scheduled_poweron_day_of_month', u.unpack_one("B")) 155287853babSAni Sinha self.add_field('next_scheduled_poweron_hour', u.unpack_one("B")) 155387853babSAni Sinha self.add_field('next_scheduled_poweron_minute', u.unpack_one("B")) 155487853babSAni Sinha self.add_field('next_scheduled_poweron_second', u.unpack_one("B")) 155587853babSAni Sinha except: 155687853babSAni Sinha self.decodeFailure = True 155787853babSAni Sinha print "Error parsing SystemPowerControls" 155887853babSAni Sinha import traceback 155987853babSAni Sinha traceback.print_exc() 156087853babSAni Sinha self.fini() 156187853babSAni Sinha 156287853babSAni Sinhaclass VoltageProbe(SmbiosBaseStructure): 156387853babSAni Sinha smbios_structure_type = 26 156487853babSAni Sinha 156587853babSAni Sinha def __init__(self, u, sm): 156687853babSAni Sinha super(VoltageProbe, self).__init__(u, sm) 156787853babSAni Sinha u = self.u 156887853babSAni Sinha try: 156987853babSAni Sinha if self.length > 0x4: 157087853babSAni Sinha self.add_field('description', u.unpack_one("B"), self.fmtstr) 157187853babSAni Sinha if self.length > 0x5: 157287853babSAni Sinha self.add_field('location_and_status', u.unpack_one("B")) 157387853babSAni Sinha _status = { 157487853babSAni Sinha 0b001: 'Other', 157587853babSAni Sinha 0b010: 'Unknown', 157687853babSAni Sinha 0b011: 'OK', 157787853babSAni Sinha 0b100: 'Non-critical', 157887853babSAni Sinha 0b101: 'Critical', 157987853babSAni Sinha 0b110: 'Non-recoverable' 158087853babSAni Sinha } 158187853babSAni Sinha _location = { 158287853babSAni Sinha 0b00001: 'Other', 158387853babSAni Sinha 0b00010: 'Unknown', 158487853babSAni Sinha 0b00011: 'Processor', 158587853babSAni Sinha 0b00100: 'Disk', 158687853babSAni Sinha 0b00101: 'Peripheral Bay', 158787853babSAni Sinha 0b00110: 'System Management Module', 158887853babSAni Sinha 0b00111: 'Motherboard', 158987853babSAni Sinha 0b01000: 'Memory Module', 159087853babSAni Sinha 0b01001: 'Processor Module', 159187853babSAni Sinha 0b01010: 'Power Unit', 159287853babSAni Sinha 0b01011: 'Add-in Card' 159387853babSAni Sinha } 159487853babSAni Sinha self.add_field('status', bitfields.getbits(self.location_and_status, 7, 5), unpack.format_table("location_and_status[7:5]={}", _status)) 159587853babSAni Sinha self.add_field('location', bitfields.getbits(self.location_and_status, 4, 0), unpack.format_table("location_and_status[4:0]={}", _location)) 159687853babSAni Sinha if self.length > 0x6: 159787853babSAni Sinha self.add_field('max_value', u.unpack_one("<H")) 159887853babSAni Sinha if self.length > 0x8: 159987853babSAni Sinha self.add_field('min_value', u.unpack_one("<H")) 160087853babSAni Sinha if self.length > 0xA: 160187853babSAni Sinha self.add_field('resolution', u.unpack_one("<H")) 160287853babSAni Sinha if self.length > 0xC: 160387853babSAni Sinha self.add_field('tolerance', u.unpack_one("<H")) 160487853babSAni Sinha if self.length > 0xE: 160587853babSAni Sinha self.add_field('accuracy', u.unpack_one("<H")) 160687853babSAni Sinha if self.length > 0x10: 160787853babSAni Sinha self.add_field('oem_defined', u.unpack_one("<I")) 160887853babSAni Sinha if self.length > 0x14: 160987853babSAni Sinha self.add_field('nominal_value', u.unpack_one("<H")) 161087853babSAni Sinha except: 161187853babSAni Sinha self.decodeFailure = True 161287853babSAni Sinha print "Error parsing VoltageProbe" 161387853babSAni Sinha import traceback 161487853babSAni Sinha traceback.print_exc() 161587853babSAni Sinha self.fini() 161687853babSAni Sinha 161787853babSAni Sinhaclass CoolingDevice(SmbiosBaseStructure): 161887853babSAni Sinha smbios_structure_type = 27 161987853babSAni Sinha 162087853babSAni Sinha def __init__(self, u, sm): 162187853babSAni Sinha super(CoolingDevice, self).__init__(u, sm) 162287853babSAni Sinha u = self.u 162387853babSAni Sinha try: 162487853babSAni Sinha if self.length > 0x4: 162587853babSAni Sinha self.add_field('temperature_probe_handle', u.unpack_one("<H")) 162687853babSAni Sinha if self.length > 0x6: 162787853babSAni Sinha self.add_field('device_type_and_status', u.unpack_one("B")) 162887853babSAni Sinha _status = { 162987853babSAni Sinha 0b001: 'Other', 163087853babSAni Sinha 0b010: 'Unknown', 163187853babSAni Sinha 0b011: 'OK', 163287853babSAni Sinha 0b100: 'Non-critical', 163387853babSAni Sinha 0b101: 'Critical', 163487853babSAni Sinha 0b110: 'Non-recoverable' 163587853babSAni Sinha } 163687853babSAni Sinha _type = { 163787853babSAni Sinha 0b00001: 'Other', 163887853babSAni Sinha 0b00010: 'Unknown', 163987853babSAni Sinha 0b00011: 'Fan', 164087853babSAni Sinha 0b00100: 'Centrifugal Blower', 164187853babSAni Sinha 0b00101: 'Chip Fan', 164287853babSAni Sinha 0b00110: 'Cabinet Fan', 164387853babSAni Sinha 0b00111: 'Power Supply Fan', 164487853babSAni Sinha 0b01000: 'Heat Pipe', 164587853babSAni Sinha 0b01001: 'Integrated Refrigeration', 164687853babSAni Sinha 0b10000: 'Active Cooling', 164787853babSAni Sinha 0b10001: 'Passive Cooling' 164887853babSAni Sinha } 164987853babSAni Sinha self.add_field('status', bitfields.getbits(self.device_type_and_status, 7, 5), unpack.format_table("device_type_and_status[7:5]={}", _status)) 165087853babSAni Sinha self.add_field('device_type', bitfields.getbits(self.device_type_and_status, 4, 0), unpack.format_table("device_type_and_status[4:0]={}", _type)) 165187853babSAni Sinha if self.length > 0x7: 165287853babSAni Sinha self.add_field('cooling_unit_group', u.unpack_one("B")) 165387853babSAni Sinha if self.length > 0x8: 165487853babSAni Sinha self.add_field('OEM_defined', u.unpack_one("<I")) 165587853babSAni Sinha if self.length > 0xC: 165687853babSAni Sinha self.add_field('nominal_speed', u.unpack_one("<H")) 165787853babSAni Sinha if self.length > 0xE: 165887853babSAni Sinha self.add_field('description', u.unpack_one("B"), self.fmtstr) 165987853babSAni Sinha except: 166087853babSAni Sinha self.decodeFailure = True 166187853babSAni Sinha print "Error parsing CoolingDevice" 166287853babSAni Sinha import traceback 166387853babSAni Sinha traceback.print_exc() 166487853babSAni Sinha self.fini() 166587853babSAni Sinha 166687853babSAni Sinhaclass TemperatureProbe(SmbiosBaseStructure): 166787853babSAni Sinha smbios_structure_type = 28 166887853babSAni Sinha 166987853babSAni Sinha def __init__(self, u, sm): 167087853babSAni Sinha super(TemperatureProbe, self).__init__(u, sm) 167187853babSAni Sinha u = self.u 167287853babSAni Sinha try: 167387853babSAni Sinha if self.length > 0x4: 167487853babSAni Sinha self.add_field('description', u.unpack_one("B"), self.fmtstr) 167587853babSAni Sinha if self.length > 0x5: 167687853babSAni Sinha self.add_field('location_and_status', u.unpack_one("B")) 167787853babSAni Sinha _status = { 167887853babSAni Sinha 0b001: 'Other', 167987853babSAni Sinha 0b010: 'Unknown', 168087853babSAni Sinha 0b011: 'OK', 168187853babSAni Sinha 0b100: 'Non-critical', 168287853babSAni Sinha 0b101: 'Critical', 168387853babSAni Sinha 0b110: 'Non-recoverable' 168487853babSAni Sinha } 168587853babSAni Sinha _location = { 168687853babSAni Sinha 0b00001: 'Other', 168787853babSAni Sinha 0b00010: 'Unknown', 168887853babSAni Sinha 0b00011: 'Processor', 168987853babSAni Sinha 0b00100: 'Disk', 169087853babSAni Sinha 0b00101: 'Peripheral Bay', 169187853babSAni Sinha 0b00110: 'System Management Module', 169287853babSAni Sinha 0b00111: 'Motherboard', 169387853babSAni Sinha 0b01000: 'Memory Module', 169487853babSAni Sinha 0b01001: 'Processor Module', 169587853babSAni Sinha 0b01010: 'Power Unit', 169687853babSAni Sinha 0b01011: 'Add-in Card', 169787853babSAni Sinha 0b01100: 'Front Panel Board', 169887853babSAni Sinha 0b01101: 'Back Panel Board', 169987853babSAni Sinha 0b01110: 'Power System Board', 170087853babSAni Sinha 0b01111: 'Drive Back Plane' 170187853babSAni Sinha } 170287853babSAni Sinha self.add_field('status', bitfields.getbits(self.location_and_status, 7, 5), unpack.format_table("location_and_status[7:5]={}", _status)) 170387853babSAni Sinha self.add_field('location', bitfields.getbits(self.location_and_status, 4, 0), unpack.format_table("location_and_status[4:0]={}", _location)) 170487853babSAni Sinha if self.length > 0x6: 170587853babSAni Sinha self.add_field('maximum_value', u.unpack_one("<H")) 170687853babSAni Sinha if self.length > 0x8: 170787853babSAni Sinha self.add_field('minimum_value', u.unpack_one("<H")) 170887853babSAni Sinha if self.length > 0xA: 170987853babSAni Sinha self.add_field('resolution', u.unpack_one("<H")) 171087853babSAni Sinha if self.length > 0xC: 171187853babSAni Sinha self.add_field('tolerance', u.unpack_one("<H")) 171287853babSAni Sinha if self.length > 0xE: 171387853babSAni Sinha self.add_field('accuracy', u.unpack_one("<H")) 171487853babSAni Sinha if self.length > 0x10: 171587853babSAni Sinha self.add_field('OEM_defined', u.unpack_one("<I")) 171687853babSAni Sinha if self.length > 0x14: 171787853babSAni Sinha self.add_field('nominal_value', u.unpack_one("<H")) 171887853babSAni Sinha except: 171987853babSAni Sinha self.decodeFailure = True 172087853babSAni Sinha print "Error parsing TemperatureProbe" 172187853babSAni Sinha import traceback 172287853babSAni Sinha traceback.print_exc() 172387853babSAni Sinha self.fini() 172487853babSAni Sinha 172587853babSAni Sinhaclass ElectricalCurrentProbe(SmbiosBaseStructure): 172687853babSAni Sinha smbios_structure_type = 29 172787853babSAni Sinha 172887853babSAni Sinha def __init__(self, u, sm): 172987853babSAni Sinha super(ElectricalCurrentProbe, self).__init__(u, sm) 173087853babSAni Sinha u = self.u 173187853babSAni Sinha try: 173287853babSAni Sinha if self.length > 0x4: 173387853babSAni Sinha self.add_field('description', u.unpack_one("B"), self.fmtstr) 173487853babSAni Sinha if self.length > 0x5: 173587853babSAni Sinha self.add_field('location_and_status', u.unpack_one("B")) 173687853babSAni Sinha _status = { 173787853babSAni Sinha 0b001: 'Other', 173887853babSAni Sinha 0b010: 'Unknown', 173987853babSAni Sinha 0b011: 'OK', 174087853babSAni Sinha 0b100: 'Non-critical', 174187853babSAni Sinha 0b101: 'Critical', 174287853babSAni Sinha 0b110: 'Non-recoverable' 174387853babSAni Sinha } 174487853babSAni Sinha _location = { 174587853babSAni Sinha 0b00001: 'Other', 174687853babSAni Sinha 0b00010: 'Unknown', 174787853babSAni Sinha 0b00011: 'Processor', 174887853babSAni Sinha 0b00100: 'Disk', 174987853babSAni Sinha 0b00101: 'Peripheral Bay', 175087853babSAni Sinha 0b00110: 'System Management Module', 175187853babSAni Sinha 0b00111: 'Motherboard', 175287853babSAni Sinha 0b01000: 'Memory Module', 175387853babSAni Sinha 0b01001: 'Processor Module', 175487853babSAni Sinha 0b01010: 'Power Unit', 175587853babSAni Sinha 0b01011: 'Add-in Card', 175687853babSAni Sinha 0b01100: 'Front Panel Board', 175787853babSAni Sinha 0b01101: 'Back Panel Board', 175887853babSAni Sinha 0b01110: 'Power System Board', 175987853babSAni Sinha 0b01111: 'Drive Back Plane' 176087853babSAni Sinha } 176187853babSAni Sinha self.add_field('status', bitfields.getbits(self.location_and_status, 7, 5), unpack.format_table("location_and_status[7:5]={}", _status)) 176287853babSAni Sinha self.add_field('location', bitfields.getbits(self.location_and_status, 4, 0), unpack.format_table("location_and_status[4:0]={}", _location)) 176387853babSAni Sinha if self.length > 0x6: 176487853babSAni Sinha self.add_field('maximum_value', u.unpack_one("<H")) 176587853babSAni Sinha if self.length > 0x8: 176687853babSAni Sinha self.add_field('minimum_value', u.unpack_one("<H")) 176787853babSAni Sinha if self.length > 0xA: 176887853babSAni Sinha self.add_field('resolution', u.unpack_one("<H")) 176987853babSAni Sinha if self.length > 0xC: 177087853babSAni Sinha self.add_field('tolerance', u.unpack_one("<H")) 177187853babSAni Sinha if self.length > 0xE: 177287853babSAni Sinha self.add_field('accuracy', u.unpack_one("<H")) 177387853babSAni Sinha if self.length > 0x10: 177487853babSAni Sinha self.add_field('OEM_defined', u.unpack_one("<I")) 177587853babSAni Sinha if self.length > 0x14: 177687853babSAni Sinha self.add_field('nominal_value', u.unpack_one("<H")) 177787853babSAni Sinha except: 177887853babSAni Sinha self.decodeFailure = True 177987853babSAni Sinha print "Error parsing ElectricalCurrentProbe" 178087853babSAni Sinha import traceback 178187853babSAni Sinha traceback.print_exc() 178287853babSAni Sinha self.fini() 178387853babSAni Sinha 178487853babSAni Sinhaclass OutOfBandRemoteAccess(SmbiosBaseStructure): 178587853babSAni Sinha smbios_structure_type = 30 178687853babSAni Sinha 178787853babSAni Sinha def __init__(self, u, sm): 178887853babSAni Sinha super(OutOfBandRemoteAccess, self).__init__(u, sm) 178987853babSAni Sinha u = self.u 179087853babSAni Sinha try: 179187853babSAni Sinha if self.length > 0x4: 179287853babSAni Sinha self.add_field('manufacturer_name', u.unpack_one("B"), self.fmtstr) 179387853babSAni Sinha if self.length > 0x5: 179487853babSAni Sinha self.add_field('connections', u.unpack_one("B")) 179587853babSAni Sinha self.add_field('outbound_connection_enabled', bool(bitfields.getbits(self.connections, 1)), "connections[1]={}") 179687853babSAni Sinha self.add_field('inbound_connection_enabled', bool(bitfields.getbits(self.connections, 0)), "connections[0]={}") 179787853babSAni Sinha except: 179887853babSAni Sinha self.decodeFailure = True 179987853babSAni Sinha print "Error parsing OutOfBandRemoteAccess" 180087853babSAni Sinha import traceback 180187853babSAni Sinha traceback.print_exc() 180287853babSAni Sinha self.fini() 180387853babSAni Sinha 180487853babSAni Sinhaclass BootIntegrityServicesEntryPoint(SmbiosBaseStructure): 180587853babSAni Sinha smbios_structure_type = 31 180687853babSAni Sinha 180787853babSAni Sinhaclass SystemBootInformation(SmbiosBaseStructure): 180887853babSAni Sinha smbios_structure_type = 32 180987853babSAni Sinha 181087853babSAni Sinha def __init__(self, u, sm): 181187853babSAni Sinha super(SystemBootInformation, self).__init__(u, sm) 181287853babSAni Sinha u = self.u 181387853babSAni Sinha try: 181487853babSAni Sinha if self.length > 0xA: 181587853babSAni Sinha u.skip(6) 181687853babSAni Sinha _boot_status = { 181787853babSAni Sinha 0: 'No errors detected', 181887853babSAni Sinha 1: 'No bootable media', 181987853babSAni Sinha 2: '"normal" operating system failed to load', 182087853babSAni Sinha 3: 'Firmware-detected hardware failure, including "unknown" failure types', 182187853babSAni Sinha 4: 'Operating system-detected hardware failure', 182287853babSAni Sinha 5: 'User-requested boot, usually through a keystroke', 182387853babSAni Sinha 6: 'System security violation', 182487853babSAni Sinha 7: 'Previously-requested image', 182587853babSAni Sinha 8: 'System watchdog timer expired, causing the system to reboot', 182687853babSAni Sinha xrange(9,127): 'Reserved for future assignment', 182787853babSAni Sinha xrange(128, 191): 'Vendor/OEM-specific implementations', 182887853babSAni Sinha xrange(192, 255): 'Product-specific implementations' 182987853babSAni Sinha } 183087853babSAni Sinha self.add_field('boot_status', u.unpack_one("B"), unpack.format_table("{}", _boot_status)) 183187853babSAni Sinha except: 183287853babSAni Sinha self.decodeFailure = True 183387853babSAni Sinha print "Error parsing SystemBootInformation" 183487853babSAni Sinha import traceback 183587853babSAni Sinha traceback.print_exc() 183687853babSAni Sinha self.fini() 183787853babSAni Sinha 183887853babSAni Sinhaclass MemoryErrorInfo64Bit(SmbiosBaseStructure): 183987853babSAni Sinha smbios_structure_type = 33 184087853babSAni Sinha 184187853babSAni Sinha def __init__(self, u, sm): 184287853babSAni Sinha super(MemoryErrorInfo64Bit, self).__init__(u, sm) 184387853babSAni Sinha u = self.u 184487853babSAni Sinha try: 184587853babSAni Sinha if self.length > 0x4: 184687853babSAni Sinha _error_types = { 184787853babSAni Sinha 0x01: 'Other', 184887853babSAni Sinha 0x02: 'Unknown', 184987853babSAni Sinha 0x03: 'OK', 185087853babSAni Sinha 0x04: 'Bad read', 185187853babSAni Sinha 0x05: 'Parity error', 185287853babSAni Sinha 0x06: 'Single-bit error', 185387853babSAni Sinha 0x07: 'Double-bit error', 185487853babSAni Sinha 0x08: 'Multi-bit error', 185587853babSAni Sinha 0x09: 'Nibble error', 185687853babSAni Sinha 0x0A: 'Checksum error', 185787853babSAni Sinha 0x0B: 'CRC error', 185887853babSAni Sinha 0x0C: 'Corrected single-bit error', 185987853babSAni Sinha 0x0D: 'Corrected error', 186087853babSAni Sinha 0x0E: 'Uncorrectable error' 186187853babSAni Sinha } 186287853babSAni Sinha self.add_field('error_type', u.unpack_one("B"), unpack.format_table("{}", _error_types)) 186387853babSAni Sinha if self.length > 0x5: 186487853babSAni Sinha _error_granularity_field = { 186587853babSAni Sinha 0x01: 'Other', 186687853babSAni Sinha 0x02: 'Unknown', 186787853babSAni Sinha 0x03: 'Device level', 186887853babSAni Sinha 0x04: 'Memory partition level' 186987853babSAni Sinha } 187087853babSAni Sinha self.add_field('error_granularity', u.unpack_one("B"), unpack.format_table("{}", _error_granularity_field)) 187187853babSAni Sinha if self.length > 0x6: 187287853babSAni Sinha _error_operation_field = { 187387853babSAni Sinha 0x01: 'Other', 187487853babSAni Sinha 0x02: 'Unknown', 187587853babSAni Sinha 0x03: 'Read', 187687853babSAni Sinha 0x04: 'Write', 187787853babSAni Sinha 0x05: 'Partial write' 187887853babSAni Sinha } 187987853babSAni Sinha self.add_field('error_operation', u.unpack_one("B"), unpack.format_table("{}", _error_operation_field)) 188087853babSAni Sinha if self.length > 0x7: 188187853babSAni Sinha self.add_field('vendor_syndrome', u.unpack_one("<I")) 188287853babSAni Sinha if self.length > 0xB: 188387853babSAni Sinha self.add_field('memory_array_error_address', u.unpack_one("<Q")) 188487853babSAni Sinha if self.length > 0xF: 188587853babSAni Sinha self.add_field('device_error_address', u.unpack_one("<Q")) 188687853babSAni Sinha if self.length > 0x13: 188787853babSAni Sinha self.add_field('error_resolution', u.unpack_one("<Q")) 188887853babSAni Sinha except: 188987853babSAni Sinha self.decodeFailure = True 189087853babSAni Sinha print "Error parsing MemoryErrorInfo64Bit" 189187853babSAni Sinha import traceback 189287853babSAni Sinha traceback.print_exc() 189387853babSAni Sinha self.fini() 189487853babSAni Sinha 189587853babSAni Sinhaclass ManagementDevice(SmbiosBaseStructure): 189687853babSAni Sinha smbios_structure_type = 34 189787853babSAni Sinha 189887853babSAni Sinha def __init__(self, u, sm): 189987853babSAni Sinha super(ManagementDevice, self).__init__(u, sm) 190087853babSAni Sinha u = self.u 190187853babSAni Sinha try: 190287853babSAni Sinha if self.length > 0x4: 190387853babSAni Sinha self.add_field('description', u.unpack_one("B"), self.fmtstr) 190487853babSAni Sinha if self.length > 0x5: 190587853babSAni Sinha _type = { 190687853babSAni Sinha 0x01: 'Other', 190787853babSAni Sinha 0x02: 'Unknown', 190887853babSAni Sinha 0x03: 'National Semiconductor LM75', 190987853babSAni Sinha 0x04: 'National Semiconductor LM78', 191087853babSAni Sinha 0x05: 'National Semiconductor LM79', 191187853babSAni Sinha 0x06: 'National Semiconductor LM80', 191287853babSAni Sinha 0x07: 'National Semiconductor LM81', 191387853babSAni Sinha 0x08: 'Analog Devices ADM9240', 191487853babSAni Sinha 0x09: 'Dallas Semiconductor DS1780', 191587853babSAni Sinha 0x0A: 'Maxim 1617', 191687853babSAni Sinha 0x0B: 'Genesys GL518SM', 191787853babSAni Sinha 0x0C: 'Winbond W83781D', 191887853babSAni Sinha 0x0D: 'Holtek HT82H791' 191987853babSAni Sinha } 192087853babSAni Sinha self.add_field('device_type', u.unpack_one("B"), unpack.format_table("{}", _type)) 192187853babSAni Sinha if self.length > 0x6: 192287853babSAni Sinha self.add_field('address', u.unpack_one("<I")) 192387853babSAni Sinha if self.length > 0xA: 192487853babSAni Sinha _address_type = { 192587853babSAni Sinha 0x01: 'Other', 192687853babSAni Sinha 0x02: 'Unknown', 192787853babSAni Sinha 0x03: 'I/O Port', 192887853babSAni Sinha 0x04: 'Memory', 192987853babSAni Sinha 0x05: 'SM Bus' 193087853babSAni Sinha } 193187853babSAni Sinha self.add_field('address_type', u.unpack_one("B"), unpack.format_table("{}", _address_type)) 193287853babSAni Sinha except: 193387853babSAni Sinha self.decodeFailure = True 193487853babSAni Sinha print "Error parsing ManagementDevice" 193587853babSAni Sinha import traceback 193687853babSAni Sinha traceback.print_exc() 193787853babSAni Sinha self.fini() 193887853babSAni Sinha 193987853babSAni Sinhaclass ManagementDeviceComponent(SmbiosBaseStructure): 194087853babSAni Sinha smbios_structure_type = 35 194187853babSAni Sinha 194287853babSAni Sinha def __init__(self, u, sm): 194387853babSAni Sinha super(ManagementDeviceComponent, self).__init__(u, sm) 194487853babSAni Sinha u = self.u 194587853babSAni Sinha try: 194687853babSAni Sinha if self.length > 0x4: 194787853babSAni Sinha self.add_field('description', u.unpack_one("B"), self.fmtstr) 194887853babSAni Sinha if self.length > 0x5: 194987853babSAni Sinha self.add_field('management_device_handle', u.unpack_one("<H")) 195087853babSAni Sinha if self.length > 0x7: 195187853babSAni Sinha self.add_field('component_handle', u.unpack_one("<H")) 195287853babSAni Sinha if self.length > 0x9: 195387853babSAni Sinha self.add_field('threshold_handle', u.unpack_one("<H")) 195487853babSAni Sinha except: 195587853babSAni Sinha self.decodeFailure = True 195687853babSAni Sinha print "Error parsing ManagementDeviceComponent" 195787853babSAni Sinha import traceback 195887853babSAni Sinha traceback.print_exc() 195987853babSAni Sinha self.fini() 196087853babSAni Sinha 196187853babSAni Sinhaclass ManagementDeviceThresholdData(SmbiosBaseStructure): 196287853babSAni Sinha smbios_structure_type = 36 196387853babSAni Sinha 196487853babSAni Sinha def __init__(self, u, sm): 196587853babSAni Sinha super(ManagementDeviceThresholdData, self).__init__(u, sm) 196687853babSAni Sinha u = self.u 196787853babSAni Sinha try: 196887853babSAni Sinha if self.length > 0x4: 196987853babSAni Sinha self.add_field('lower_threshold_noncritical', u.unpack_one("<H")) 197087853babSAni Sinha if self.length > 0x6: 197187853babSAni Sinha self.add_field('upper_threshold_noncritical', u.unpack_one("<H")) 197287853babSAni Sinha if self.length > 0x8: 197387853babSAni Sinha self.add_field('lower_threshold_critical', u.unpack_one("<H")) 197487853babSAni Sinha if self.length > 0xA: 197587853babSAni Sinha self.add_field('upper_threshold_critical', u.unpack_one("<H")) 197687853babSAni Sinha if self.length > 0xC: 197787853babSAni Sinha self.add_field('lower_threshold_nonrecoverable', u.unpack_one("<H")) 197887853babSAni Sinha if self.length > 0xE: 197987853babSAni Sinha self.add_field('upper_threshold_nonrecoverable', u.unpack_one("<H")) 198087853babSAni Sinha except: 198187853babSAni Sinha self.decodeFailure = True 198287853babSAni Sinha print "Error parsing ManagementDeviceThresholdData" 198387853babSAni Sinha import traceback 198487853babSAni Sinha traceback.print_exc() 198587853babSAni Sinha self.fini() 198687853babSAni Sinha 198787853babSAni Sinhaclass MemoryChannel(SmbiosBaseStructure): 198887853babSAni Sinha smbios_structure_type = 37 198987853babSAni Sinha 199087853babSAni Sinha def __init__(self, u, sm): 199187853babSAni Sinha super(MemoryChannel, self).__init__(u, sm) 199287853babSAni Sinha u = self.u 199387853babSAni Sinha try: 199487853babSAni Sinha if self.length > 0x4: 199587853babSAni Sinha _channel_type = { 199687853babSAni Sinha 0x01: 'Other', 199787853babSAni Sinha 0x02: 'Unknown', 199887853babSAni Sinha 0x03: 'RamBus', 199987853babSAni Sinha 0x04: 'SyncLink' 200087853babSAni Sinha } 200187853babSAni Sinha self.add_field('channel_type', u.unpack_one("B"), unpack.format_table("{}", _channel_type)) 200287853babSAni Sinha if self.length > 0x6: 200387853babSAni Sinha self.add_field('max_channel_load', u.unpack_one("B")) 200487853babSAni Sinha if self.length > 0x8: 200587853babSAni Sinha self.add_field('memory_device_count', u.unpack_one("B")) 200687853babSAni Sinha if self.length > 0xA: 200787853babSAni Sinha self.add_field('memory_device_load', u.unpack_one("B")) 200887853babSAni Sinha if self.length > 0xC: 200987853babSAni Sinha self.add_field('memory_device_handle', u.unpack_one("<H")) 201087853babSAni Sinha except: 201187853babSAni Sinha self.decodeFailure = True 201287853babSAni Sinha print "Error parsing MemoryChannel" 201387853babSAni Sinha import traceback 201487853babSAni Sinha traceback.print_exc() 201587853babSAni Sinha self.fini() 201687853babSAni Sinha 201787853babSAni Sinhaclass IPMIDeviceInformation(SmbiosBaseStructure): 201887853babSAni Sinha smbios_structure_type = 38 201987853babSAni Sinha 202087853babSAni Sinha def __init__(self, u, sm): 202187853babSAni Sinha super(IPMIDeviceInformation, self).__init__(u, sm) 202287853babSAni Sinha u = self.u 202387853babSAni Sinha try: 202487853babSAni Sinha _interface_type = { 202587853babSAni Sinha 0x00: 'Unknown', 202687853babSAni Sinha 0x01: 'KCS: Keyboard Controller Style', 202787853babSAni Sinha 0x02: 'SMIC: Server Management Interface Chip', 202887853babSAni Sinha 0x03: 'BT: Block Transfer', 202987853babSAni Sinha xrange(0x04, 0xFF): 'Reserved' 203087853babSAni Sinha } 203187853babSAni Sinha self.add_field('interface_type', u.unpack_one("B"), unpack.format_table("{}", _interface_type)) 203287853babSAni Sinha self.add_field('ipmi_specification_revision', u.unpack_one("B")) 203387853babSAni Sinha self.add_field('msd_revision', bitfields.getbits(self.ipmi_specification_revision, 7, 4), "ipmi_specification_revision[7:4]={}") 203487853babSAni Sinha self.add_field('lsd_revision', bitfields.getbits(self.ipmi_specification_revision, 3, 0), "ipmi_specification_revision[3:0]={}") 203587853babSAni Sinha 203687853babSAni Sinha self.add_field('i2c_slave_address', u.unpack_one("B")) 203787853babSAni Sinha self.add_field('nv_storage_device_address', u.unpack_one("B")) 203887853babSAni Sinha self.add_field('base_address', u.unpack_one("<Q")) 203987853babSAni Sinha # if lsb is 1, address is in IO space. otherwise, memory-mapped 204087853babSAni Sinha self.add_field('base_address_modifier_interrupt_info', u.unpack_one("B")) 204187853babSAni Sinha _reg_spacing = { 204287853babSAni Sinha 0b00: 'Interface registers are on successive byte boundaries', 204387853babSAni Sinha 0b01: 'Interface registers are on 32-bit boundaries', 204487853babSAni Sinha 0b10: 'Interface registers are on 16-byte boundaries', 204587853babSAni Sinha 0b11: 'Reserved' 204687853babSAni Sinha } 204787853babSAni Sinha self.add_field('register_spacing', bitfields.getbits(self.base_address_modifier_interrupt_info, 7, 6), unpack.format_table("base_address_modifier_interrupt_info[7:6]={}", _reg_spacing)) 204887853babSAni Sinha self.add_field('ls_bit_for_addresses', bitfields.getbits(self.base_address_modifier_interrupt_info, 4), "base_address_modifier_interrupt_info[4]={}") 204987853babSAni Sinha self.add_field('interrupt_info_specified', bool(bitfields.getbits(self.base_address_modifier_interrupt_info, 3)), "base_address_modifier_interrupt_info[3]={}") 205087853babSAni Sinha _polarity = { 205187853babSAni Sinha 0: 'active low', 205287853babSAni Sinha 1: 'active high' 205387853babSAni Sinha } 205487853babSAni Sinha self.add_field('interrupt_polarity', bitfields.getbits(self.base_address_modifier_interrupt_info, 1), unpack.format_table("base_address_modifier_interrupt_info[1]={}", _polarity)) 205587853babSAni Sinha _interrupt_trigger = { 205687853babSAni Sinha 0: 'edge', 205787853babSAni Sinha 1: 'level' 205887853babSAni Sinha } 205987853babSAni Sinha self.add_field('interrupt_trigger_mode', bitfields.getbits(self.base_address_modifier_interrupt_info, 0), unpack.format_table("base_address_modifier_interrupt_info[0]={}", _interrupt_trigger)) 206087853babSAni Sinha self.add_field('interrupt_number', u.unpack_one("B")) 206187853babSAni Sinha except: 206287853babSAni Sinha self.decodeFailure = True 206387853babSAni Sinha print "Error parsing IPMIDeviceInformation" 206487853babSAni Sinha import traceback 206587853babSAni Sinha traceback.print_exc() 206687853babSAni Sinha self.fini() 206787853babSAni Sinha 206887853babSAni Sinhaclass SystemPowerSupply(SmbiosBaseStructure): 206987853babSAni Sinha smbios_structure_type = 39 207087853babSAni Sinha 207187853babSAni Sinha def __init__(self, u, sm): 207287853babSAni Sinha super(SystemPowerSupply, self).__init__(u, sm) 207387853babSAni Sinha u = self.u 207487853babSAni Sinha try: 207587853babSAni Sinha if self.length > 0x4: 207687853babSAni Sinha self.add_field('power_unit_group', u.unpack_one("B")) 207787853babSAni Sinha if self.length > 0x5: 207887853babSAni Sinha self.add_field('location', u.unpack_one("B"), self.fmtstr) 207987853babSAni Sinha if self.length > 0x6: 208087853babSAni Sinha self.add_field('device_name', u.unpack_one("B"), self.fmtstr) 208187853babSAni Sinha if self.length > 0x7: 208287853babSAni Sinha self.add_field('manufacturer', u.unpack_one("B"), self.fmtstr) 208387853babSAni Sinha if self.length > 0x8: 208487853babSAni Sinha self.add_field('serial_number', u.unpack_one("B"), self.fmtstr) 208587853babSAni Sinha if self.length > 0x9: 208687853babSAni Sinha self.add_field('asset_tag', u.unpack_one("B"), self.fmtstr) 208787853babSAni Sinha if self.length > 0xA: 208887853babSAni Sinha self.add_field('model_part_number', u.unpack_one("B"), self.fmtstr) 208987853babSAni Sinha if self.length > 0xB: 209087853babSAni Sinha self.add_field('revision_level', u.unpack_one("B"), self.fmtstr) 209187853babSAni Sinha if self.length > 0xC: 209287853babSAni Sinha self.add_field('max_power_capacity', u.unpack_one("<H")) 209387853babSAni Sinha if self.length > 0xE: 209487853babSAni Sinha self.add_field('power_supply_characteristics', u.unpack_one("<H")) 209587853babSAni Sinha _dmtf_power_supply_type = { 209687853babSAni Sinha 0b001: 'Other', 209787853babSAni Sinha 0b010: 'Unknown', 209887853babSAni Sinha 0b011: 'Linear', 209987853babSAni Sinha 0b100: 'Switching', 210087853babSAni Sinha 0b101: 'Battery', 210187853babSAni Sinha 0b110: 'UPS', 210287853babSAni Sinha 0b111: 'Converter', 210387853babSAni Sinha 0b1000: 'Regulator', 210487853babSAni Sinha xrange(0b1001, 0b1111): 'Reserved' 210587853babSAni Sinha } 210687853babSAni Sinha self.add_field('dmtf_power_supply_type', bitfields.getbits(self.power_supply_characteristics, 13, 10), unpack.format_table("power_supply_characteristics[13:10]={}", _dmtf_power_supply_type)) 210787853babSAni Sinha _status = { 210887853babSAni Sinha 0b001: 'Other', 210987853babSAni Sinha 0b010: 'Unknown', 211087853babSAni Sinha 0b011: 'OK', 211187853babSAni Sinha 0b100: 'Non-critical', 211287853babSAni Sinha 0b101: 'Critical; power supply has failed and has been taken off-line' 211387853babSAni Sinha } 211487853babSAni Sinha self.add_field('status', bitfields.getbits(self.power_supply_characteristics, 9, 7), unpack.format_table("power_supply_characteristics[9:7]={}", _status)) 211587853babSAni Sinha _dmtf_input_voltage_range_switching = { 211687853babSAni Sinha 0b001: 'Other', 211787853babSAni Sinha 0b010: 'Unknown', 211887853babSAni Sinha 0b011: 'Manual', 211987853babSAni Sinha 0b100: 'Auto-switch', 212087853babSAni Sinha 0b101: 'Wide range', 212187853babSAni Sinha 0b110: 'Not applicable', 212287853babSAni Sinha xrange(0b0111, 0b1111): 'Reserved' 212387853babSAni Sinha } 212487853babSAni Sinha self.add_field('dmtf_input_voltage_range_switching', bitfields.getbits(self.power_supply_characteristics, 6, 3), unpack.format_table("power_supply_characteristics[6:3]={}", _dmtf_input_voltage_range_switching)) 212587853babSAni Sinha self.add_field('power_supply_unplugged', bool(bitfields.getbits(self.power_supply_characteristics, 2)), "power_supply_characteristics[2]={}") 212687853babSAni Sinha self.add_field('power_supply_present', bool(bitfields.getbits(self.power_supply_characteristics, 1)), "power_supply_characteristics[1]={}") 212787853babSAni Sinha self.add_field('power_supply_hot_replaceable', bool(bitfields.getbits(self.power_supply_characteristics, 0)), "power_supply_characteristics[0]={}") 212887853babSAni Sinha if self.length > 0x10: 212987853babSAni Sinha self.add_field('input_voltage_probe_handle', u.unpack_one("<H")) 213087853babSAni Sinha if self.length > 0x12: 213187853babSAni Sinha self.add_field('cooling_device_handle', u.unpack_one("<H")) 213287853babSAni Sinha if self.length > 0x14: 213387853babSAni Sinha self.add_field('input_current_probe_handle', u.unpack_one("<H")) 213487853babSAni Sinha except: 213587853babSAni Sinha self.decodeFailure = True 213687853babSAni Sinha print "Error parsing SystemPowerSupply" 213787853babSAni Sinha import traceback 213887853babSAni Sinha traceback.print_exc() 213987853babSAni Sinha self.fini() 214087853babSAni Sinha 214187853babSAni Sinhaclass AdditionalInformation(SmbiosBaseStructure): 214287853babSAni Sinha smbios_structure_type = 40 214387853babSAni Sinha 214487853babSAni Sinha def __init__(self, u, sm): 214587853babSAni Sinha super(AdditionalInformation, self).__init__(u, sm) 214687853babSAni Sinha u = self.u 214787853babSAni Sinha try: 214887853babSAni Sinha if self.length > 0x4: 214987853babSAni Sinha self.add_field('num_additional_information_entries', u.unpack_one("B")) 215087853babSAni Sinha if self.length > 0x5: 215187853babSAni Sinha self.add_field('additional_information_entry_length', u.unpack_one("B")) 215287853babSAni Sinha self.add_field('referenced_handle', u.unpack_one("<H")) 215387853babSAni Sinha self.add_field('referenced_offset', u.unpack_one("B")) 215487853babSAni Sinha self.add_field('string', u.unpack_one("B"), self.fmtstr) 215587853babSAni Sinha self.add_field('value', u.unpack_rest()) 215687853babSAni Sinha except: 215787853babSAni Sinha self.decodeFailure = True 215887853babSAni Sinha print "Error parsing AdditionalInformation" 215987853babSAni Sinha import traceback 216087853babSAni Sinha traceback.print_exc() 216187853babSAni Sinha self.fini() 216287853babSAni Sinha 216387853babSAni Sinhaclass OnboardDevicesExtendedInformation(SmbiosBaseStructure): 216487853babSAni Sinha smbios_structure_type = 41 216587853babSAni Sinha 216687853babSAni Sinha def __init__(self, u, sm): 216787853babSAni Sinha super(OnboardDevicesExtendedInformation, self).__init__(u, sm) 216887853babSAni Sinha u = self.u 216987853babSAni Sinha try: 217087853babSAni Sinha if self.length > 0x4: 217187853babSAni Sinha self.add_field('reference_designation', u.unpack_one("B"), self.fmtstr) 217287853babSAni Sinha if self.length > 0x5: 217387853babSAni Sinha self.add_field('device_type', u.unpack_one("B")) 217487853babSAni Sinha self.add_field('device_enabled', bool(bitfields.getbits(self.device_type, 7)), "device_type[7]={}") 217587853babSAni Sinha _device_types = { 217687853babSAni Sinha 0x01: 'Other', 217787853babSAni Sinha 0x02: 'Unknown', 217887853babSAni Sinha 0x03: 'Video', 217987853babSAni Sinha 0x04: 'SCSI Controller', 218087853babSAni Sinha 0x05: 'Ethernet', 218187853babSAni Sinha 0x06: 'Token Ring', 218287853babSAni Sinha 0x07: 'Sound', 218387853babSAni Sinha 0x08: 'PATA Controller', 218487853babSAni Sinha 0x09: 'SATA Controller', 218587853babSAni Sinha 0x0A: 'SAS Controller' 218687853babSAni Sinha } 218787853babSAni Sinha self.add_field('type_of_device', bitfields.getbits(self.device_type, 6, 0), unpack.format_table("device_type[6:0]={}", _device_types)) 218887853babSAni Sinha if self.length > 0x6: 218987853babSAni Sinha self.add_field('device_type_instance', u.unpack_one("B")) 219087853babSAni Sinha if self.length > 0x7: 219187853babSAni Sinha self.add_field('segment_group_number', u.unpack_one("<H")) 219287853babSAni Sinha if self.length > 0x9: 219387853babSAni Sinha self.add_field('bus_number', u.unpack_one("B"), self.fmtstr) 219487853babSAni Sinha if self.length > 0xA: 219587853babSAni Sinha self.add_field('device_and_function_number', u.unpack_one("B")) 219687853babSAni Sinha self.add_field('device_number', bitfields.getbits(self.device_type, 7, 3), "device_and_function_number[7:3]={}") 219787853babSAni Sinha self.add_field('function_number', bitfields.getbits(self.device_type, 2, 0), "device_and_function_number[2:0]={}") 219887853babSAni Sinha except: 219987853babSAni Sinha self.decodeFailure = True 220087853babSAni Sinha print "Error parsing OnboardDevicesExtendedInformation" 220187853babSAni Sinha import traceback 220287853babSAni Sinha traceback.print_exc() 220387853babSAni Sinha self.fini() 220487853babSAni Sinha 220587853babSAni Sinhaclass ManagementControllerHostInterface(SmbiosBaseStructure): 220687853babSAni Sinha smbios_structure_type = 42 220787853babSAni Sinha 220887853babSAni Sinha def __init__(self, u, sm): 220987853babSAni Sinha super(ManagementControllerHostInterface, self).__init__(u, sm) 221087853babSAni Sinha u = self.u 221187853babSAni Sinha try: 221287853babSAni Sinha if self.length > 0x4: 221387853babSAni Sinha _interface_types = { 221487853babSAni Sinha 0x00: 'Reserved', 221587853babSAni Sinha 0x01: 'Reserved', 221687853babSAni Sinha 0x02: 'KCS: Keyboard Controller Style', 221787853babSAni Sinha 0x03: '8250 UART Register Compatible', 221887853babSAni Sinha 0x04: '16450 UART Register Compatible', 221987853babSAni Sinha 0x05: '16550/16550A UART Register Compatible', 222087853babSAni Sinha 0x06: '16650/16650A UART Register Compatible', 222187853babSAni Sinha 0x07: '16750/16750A UART Register Compatible', 222287853babSAni Sinha 0x08: '16850/16850A UART Register Compatible', 222387853babSAni Sinha 0xF0: 'OEM' 222487853babSAni Sinha } 222587853babSAni Sinha self.add_field('interface_type', u.unpack_one("B"), unpack.format_table("{}", _interface_types)) 222687853babSAni Sinha if self.length > 0x5: 222787853babSAni Sinha self.add_field('mc_host_interface_data', u.unpack_rest(), self.fmtstr) 222887853babSAni Sinha except: 222987853babSAni Sinha self.decodeFailure = True 223087853babSAni Sinha print "Error parsing ManagementControllerHostInterface" 223187853babSAni Sinha import traceback 223287853babSAni Sinha traceback.print_exc() 223387853babSAni Sinha self.fini() 223487853babSAni Sinha 223587853babSAni Sinhaclass Inactive(SmbiosBaseStructure): 223687853babSAni Sinha smbios_structure_type = 126 223787853babSAni Sinha 223887853babSAni Sinha def __init__(self, u, sm): 223987853babSAni Sinha super(Inactive, self).__init__(u, sm) 224087853babSAni Sinha self.fini() 224187853babSAni Sinha 224287853babSAni Sinhaclass EndOfTable(SmbiosBaseStructure): 224387853babSAni Sinha smbios_structure_type = 127 224487853babSAni Sinha 224587853babSAni Sinha def __init__(self, u, sm): 224687853babSAni Sinha super(EndOfTable, self).__init__(u, sm) 224787853babSAni Sinha self.fini() 224887853babSAni Sinha 224987853babSAni Sinhaclass SmbiosStructureUnknown(SmbiosBaseStructure): 225087853babSAni Sinha smbios_structure_type = None 225187853babSAni Sinha 225287853babSAni Sinha def __init__(self, u, sm): 225387853babSAni Sinha super(SmbiosStructureUnknown, self).__init__(u, sm) 225487853babSAni Sinha self.fini() 225587853babSAni Sinha 225687853babSAni Sinha_smbios_structures = [ 225787853babSAni Sinha BIOSInformation, 225887853babSAni Sinha SystemInformation, 225987853babSAni Sinha BaseboardInformation, 226087853babSAni Sinha SystemEnclosure, 226187853babSAni Sinha ProcessorInformation, 226287853babSAni Sinha MemoryControllerInformation, 226387853babSAni Sinha MemoryModuleInformation, 226487853babSAni Sinha CacheInformation, 226587853babSAni Sinha PortConnectorInfo, 226687853babSAni Sinha SystemSlots, 226787853babSAni Sinha OnBoardDevicesInformation, 226887853babSAni Sinha OEMStrings, 226987853babSAni Sinha SystemConfigOptions, 227087853babSAni Sinha BIOSLanguageInformation, 227187853babSAni Sinha GroupAssociations, 227287853babSAni Sinha SystemEventLog, 227387853babSAni Sinha PhysicalMemoryArray, 227487853babSAni Sinha MemoryDevice, 227587853babSAni Sinha MemoryErrorInfo32Bit, 227687853babSAni Sinha MemoryArrayMappedAddress, 227787853babSAni Sinha MemoryDeviceMappedAddress, 227887853babSAni Sinha BuiltInPointingDevice, 227987853babSAni Sinha PortableBattery, 228087853babSAni Sinha SystemReset, 228187853babSAni Sinha HardwareSecurity, 228287853babSAni Sinha SystemPowerControls, 228387853babSAni Sinha VoltageProbe, 228487853babSAni Sinha CoolingDevice, 228587853babSAni Sinha TemperatureProbe, 228687853babSAni Sinha ElectricalCurrentProbe, 228787853babSAni Sinha OutOfBandRemoteAccess, 228887853babSAni Sinha BootIntegrityServicesEntryPoint, 228987853babSAni Sinha SystemBootInformation, 229087853babSAni Sinha MemoryErrorInfo64Bit, 229187853babSAni Sinha ManagementDevice, 229287853babSAni Sinha ManagementDeviceComponent, 229387853babSAni Sinha ManagementDeviceThresholdData, 229487853babSAni Sinha MemoryChannel, 229587853babSAni Sinha IPMIDeviceInformation, 229687853babSAni Sinha SystemPowerSupply, 229787853babSAni Sinha AdditionalInformation, 229887853babSAni Sinha OnboardDevicesExtendedInformation, 229987853babSAni Sinha ManagementControllerHostInterface, 230087853babSAni Sinha Inactive, 230187853babSAni Sinha EndOfTable, 230287853babSAni Sinha SmbiosStructureUnknown, # Must always come last 230387853babSAni Sinha] 230487853babSAni Sinha 230587853babSAni Sinhadef log_smbios_info(): 230687853babSAni Sinha with redirect.logonly(): 230787853babSAni Sinha try: 230887853babSAni Sinha sm = SMBIOS() 230987853babSAni Sinha print 231087853babSAni Sinha if sm is None: 231187853babSAni Sinha print "No SMBIOS structures found" 231287853babSAni Sinha return 231387853babSAni Sinha output = {} 231487853babSAni Sinha known_types = (0, 1) 231587853babSAni Sinha for sm_struct in sm.structures: 231687853babSAni Sinha if sm_struct.type in known_types: 231787853babSAni Sinha output.setdefault(sm_struct.type, []).append(sm_struct) 231887853babSAni Sinha if len(output) == len(known_types): 231987853babSAni Sinha break 232087853babSAni Sinha 232187853babSAni Sinha print "SMBIOS information:" 232287853babSAni Sinha for key in sorted(known_types): 232387853babSAni Sinha for s in output.get(key, ["No structure of type {} found".format(key)]): 232487853babSAni Sinha print ttypager._wrap("{}: {}".format(key, s)) 232587853babSAni Sinha except: 232687853babSAni Sinha print "Error parsing SMBIOS information:" 232787853babSAni Sinha import traceback 232887853babSAni Sinha traceback.print_exc() 232987853babSAni Sinha 233087853babSAni Sinhadef dump_raw(): 233187853babSAni Sinha try: 233287853babSAni Sinha sm = SMBIOS() 233387853babSAni Sinha if sm: 233487853babSAni Sinha s = "SMBIOS -- Raw bytes and structure decode.\n\n" 233587853babSAni Sinha 233687853babSAni Sinha s += str(sm.header) + '\n' 233787853babSAni Sinha s += bits.dumpmem(sm._header_memory) + '\n' 233887853babSAni Sinha 233987853babSAni Sinha s += "Raw bytes for the SMBIOS structures\n" 234087853babSAni Sinha s += bits.dumpmem(sm._structure_memory) + '\n' 234187853babSAni Sinha 234287853babSAni Sinha for sm_struct in sm.structures: 234387853babSAni Sinha s += str(sm_struct) + '\n' 234487853babSAni Sinha s += bits.dumpmem(sm_struct.raw_data) 234587853babSAni Sinha 234687853babSAni Sinha s += "Strings:\n" 234787853babSAni Sinha for n in range(1, len(getattr(sm_struct, "strings", [])) + 1): 234887853babSAni Sinha s += str(sm_struct.fmtstr(n)) + '\n' 234987853babSAni Sinha s += bits.dumpmem(sm_struct.raw_strings) + '\n' 235087853babSAni Sinha else: 235187853babSAni Sinha s = "No SMBIOS structures found" 235287853babSAni Sinha ttypager.ttypager_wrap(s, indent=False) 235387853babSAni Sinha except: 235487853babSAni Sinha print "Error parsing SMBIOS information:" 235587853babSAni Sinha import traceback 235687853babSAni Sinha traceback.print_exc() 235787853babSAni Sinha 235887853babSAni Sinhadef dump(): 235987853babSAni Sinha try: 236087853babSAni Sinha sm = SMBIOS() 236187853babSAni Sinha if sm: 236287853babSAni Sinha s = str(sm) 236387853babSAni Sinha else: 236487853babSAni Sinha s = "No SMBIOS structures found" 236587853babSAni Sinha ttypager.ttypager_wrap(s, indent=False) 236687853babSAni Sinha except: 236787853babSAni Sinha print "Error parsing SMBIOS information:" 236887853babSAni Sinha import traceback 236987853babSAni Sinha traceback.print_exc() 237087853babSAni Sinha 237187853babSAni Sinhadef annex_a_conformance(): 237287853babSAni Sinha try: 237387853babSAni Sinha sm = SMBIOS() 237487853babSAni Sinha 237587853babSAni Sinha # check: 1. The table anchor string "_SM_" is present in the address range 0xF0000 to 0xFFFFF on a 16-byte bound 237687853babSAni Sinha 237787853babSAni Sinha def table_entry_point_verification(): 237887853babSAni Sinha ''' Verify table entry-point''' 237987853babSAni Sinha if (sm.header.length < 0x1F): 238087853babSAni Sinha print "Failure: Table entry-point - The entry-point Length must be at least 0x1F" 238187853babSAni Sinha if sm.header.checksum != 0: 238287853babSAni Sinha print "Failure: Table entry-point - The entry-point checksum must evaluate to 0" 238387853babSAni Sinha if ((sm.header.major_version < 2) and (sm.header.minor_version < 4)): 238487853babSAni Sinha print "Failure: Table entry-point - SMBIOS version must be at least 2.4" 238587853babSAni Sinha if (sm.header.intermediate_anchor_string == '_DMI_'): 238687853babSAni Sinha print "Failure: Table entry-point - The Intermediate Anchor String must be '_DMI_'" 238787853babSAni Sinha if (sm.header.intermediate_checksum != 0): 238887853babSAni Sinha print "Failure: Table entry-point - The Intermediate checksum must evaluate to 0" 238987853babSAni Sinha 239087853babSAni Sinha #check: 3. The structure-table is traversable and conforms to the entry-point specifications: 239187853babSAni Sinha 239287853babSAni Sinha def req_structures(): 239387853babSAni Sinha '''Checks for required structures and corresponding data''' 239487853babSAni Sinha types_present = [sm.structures[x].smbios_structure_type for x in range(len(sm.structures))] 239587853babSAni Sinha required = [0, 1, 4, 7, 9, 16, 17, 19, 31, 32] 239687853babSAni Sinha for s in required: 239787853babSAni Sinha if s not in set(types_present): 239887853babSAni Sinha print "Failure: Type {} required but not found".format(s) 239987853babSAni Sinha 240087853babSAni Sinha else: 240187853babSAni Sinha if s == 0: 240287853babSAni Sinha if types_present.count(s) > 1: 240387853babSAni Sinha print "Failure: Type {} - One and only one structure of this type must be present.".format(s) 240487853babSAni Sinha if sm.structure_type(s).length < 0x18: 240587853babSAni Sinha print "Failure: Type {} - The structure Length field must be at least 0x18".format(s) 240687853babSAni Sinha if sm.structure_type(s).version is None: 240787853babSAni Sinha print "Failure: Type {} - BIOS Version string must be present and non-null.".format(s) 240887853babSAni Sinha if sm.structure_type(s).release_date is None: 240987853babSAni Sinha print "Failure: Type {} - BIOS Release Date string must be present, non-null, and include a 4-digit year".format(s) 241087853babSAni Sinha if bitfields.getbits(sm.structure_type(s).characteristics, 3, 0) != 0 or bitfields.getbits(sm.structure_type(s).characteristics, 31, 4) == 0: 241187853babSAni Sinha print "Failure: Type {} - BIOS Characteristics: bits 3:0 must all be 0, and at least one of bits 31:4 must be set to 1.".format(s) 241287853babSAni Sinha elif s == 1: 241387853babSAni Sinha if types_present.count(s) > 1: 241487853babSAni Sinha print "Failure: Type {} - One and only one structure of this type must be present.".format(s) 241587853babSAni Sinha if sm.structure_type(s).length < 0x1B: 241687853babSAni Sinha print "Failure: Type {} - The structure Length field must be at least 0x1B".format(s) 241787853babSAni Sinha if sm.structure_type(s).manufacturer == None: 241887853babSAni Sinha print "Failure: Type {} - Manufacturer string must be present and non-null.".format(s) 241987853babSAni Sinha if sm.structure_type(s).product_name == None: 242087853babSAni Sinha print "Failure: Type {} - Product Name string must be present and non-null".format(s) 242187853babSAni Sinha if sm.structure_type(s).uuid == '00000000 00000000' and sm.structure_type(s).uuid == 'FFFFFFFF FFFFFFFF': 242287853babSAni Sinha print "Failure: Type {} - UUID field must be neither 00000000 00000000 nor FFFFFFFF FFFFFFFF.".format(s) 242387853babSAni Sinha if sm.structure_type(s).wakeup_type == 00 and sm.structure_type(s).wakeup_type == 0x02: 242487853babSAni Sinha print "Failure: Type {} - Wake-up Type field must be neither 00h (Reserved) nor 02h (Unknown).".format(s) 242587853babSAni Sinha # continue for remaining required types 242687853babSAni Sinha 242787853babSAni Sinha # check remaining conformance guidelines 242887853babSAni Sinha 242987853babSAni Sinha table_entry_point_verification() 243087853babSAni Sinha req_structures() 243187853babSAni Sinha except: 243287853babSAni Sinha print "Error checking ANNEX A conformance guidelines" 243387853babSAni Sinha import traceback 243487853babSAni Sinha traceback.print_exc() 2435