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