Exemplo n.º 1
0
def thread(apicid):
    """Return the thread APIC ID, and the APIC IDs of the core and socket in which the thread resides.
    
    Raises RuntimeError if CPUID leaf 0xb not supported."""
    if bits.cpuid(apicid, 0).eax < 0xb:
        raise RuntimeError("Cannot compute topology; CPUID leaf 0xb not supported.")
    coreid = apicid >> bitfields.getbits(bits.cpuid(apicid, 0xb, 0).eax, 4, 0)
    socketid = apicid >> bitfields.getbits(bits.cpuid(apicid, 0xb, 1).eax, 4, 0)
    return socketid, coreid, apicid
Exemplo n.º 2
0
def thread(apicid):
    """Return the thread APIC ID, and the APIC IDs of the core and socket in which the thread resides.

    Raises RuntimeError if CPUID leaf 0xb not supported."""
    if bits.cpuid(apicid, 0).eax < 0xb:
        raise RuntimeError(
            "Cannot compute topology; CPUID leaf 0xb not supported.")
    coreid = apicid >> bitfields.getbits(bits.cpuid(apicid, 0xb, 0).eax, 4, 0)
    socketid = apicid >> bitfields.getbits(
        bits.cpuid(apicid, 0xb, 1).eax, 4, 0)
    return socketid, coreid, apicid
Exemplo n.º 3
0
 def __init__(self, u):
     super(Processor, self).__init__(u)
     u = self.u
     self.add_field('local_apic_id', u.unpack_one("B"))
     self.add_field('local_apic_version', u.unpack_one("B"))
     self.add_field('cpu_flags', u.unpack_one("B"))
     self.add_field('enable', bool(bitfields.getbits(self.cpu_flags, 0)), "cpu_flags[0]={}")
     self.add_field('bsp', bool(bitfields.getbits(self.cpu_flags, 1)), "cpu_flags[1]={}")
     self.add_field('cpu_signature', u.unpack_one("<I"))
     self.add_field('feature_flags', u.unpack_one("<I"))
     self.add_field('reserved', u.unpack_one("<Q"))
     self.fini()
Exemplo n.º 4
0
 def __init__(self, u):
     super(Processor, self).__init__(u)
     u = self.u
     self.add_field("local_apic_id", u.unpack_one("B"))
     self.add_field("local_apic_version", u.unpack_one("B"))
     self.add_field("cpu_flags", u.unpack_one("B"))
     self.add_field("enable", bool(bitfields.getbits(self.cpu_flags, 0)), "cpu_flags[0]={}")
     self.add_field("bsp", bool(bitfields.getbits(self.cpu_flags, 1)), "cpu_flags[1]={}")
     self.add_field("cpu_signature", u.unpack_one("<I"))
     self.add_field("feature_flags", u.unpack_one("<I"))
     self.add_field("reserved", u.unpack_one("<Q"))
     self.fini()
Exemplo n.º 5
0
 def __init__(self, u):
     super(LocalInterrupt, self).__init__(u)
     u = self.u
     self.add_field('interrupt_type', u.unpack_one("B"), unpack.format_table("{}", _int_types))
     self.add_field('local_interrupt_flags', u.unpack_one("B"))
     self.add_field('polarity', bitfields.getbits(self.local_interrupt_flags, 1, 0), unpack.format_table("local_interrupt_flags[1:0]={}", _polarity))
     self.add_field('trigger', bitfields.getbits(self.local_interrupt_flags, 3, 2), unpack.format_table("local_interrupt_flags[3:2]={}", _trigger_modes))
     u.skip(1)
     self.add_field('source_bus_id', u.unpack_one("B"))
     self.add_field('source_bus_irq', u.unpack_one("B"))
     self.add_field('destination_local_apic_id', u.unpack_one("B"))
     self.add_field('destination_local_apic_lint_pin', u.unpack_one("B"))
     self.fini()
Exemplo n.º 6
0
 def __init__(self, u):
     super(Processor, self).__init__(u)
     u = self.u
     self.add_field('local_apic_id', u.unpack_one("B"))
     self.add_field('local_apic_version', u.unpack_one("B"))
     self.add_field('cpu_flags', u.unpack_one("B"))
     self.add_field('enable', bool(bitfields.getbits(self.cpu_flags, 0)),
                    "cpu_flags[0]={}")
     self.add_field('bsp', bool(bitfields.getbits(self.cpu_flags, 1)),
                    "cpu_flags[1]={}")
     self.add_field('cpu_signature', u.unpack_one("<I"))
     self.add_field('feature_flags', u.unpack_one("<I"))
     self.add_field('reserved', u.unpack_one("<Q"))
     self.fini()
Exemplo n.º 7
0
def show_autodemotion():
    with ttypager.page():
        if bitfields.getbits(bits.rdmsr(bits.bsp_apicid(), 0xe2), 26,
                             25) == 0x3:
            print("C1 and C3 autodemotion are enabled")
        else:
            print("C1 and C3 autodemotion are disabled")
Exemplo n.º 8
0
 def __init__(self, u):
     super(FloatingPointer, self).__init__()
     self.raw_data = u.unpack_peek_rest()
     self.add_field('anchor_string', u.unpack_one("4s"))
     self.add_field('physical_address_pointer', u.unpack_one("<I"))
     self.add_field('length', u.unpack_one("B"))
     self.add_field('spec_revision', u.unpack_one("B"))
     self.add_field('checksum', u.unpack_one("B"))
     self.add_field('mp_feature_info_1', u.unpack_one("B"))
     self.add_field('mp_feature_info_2', u.unpack_one("B"))
     self.add_field('multiple_clock_sources', bool(bitfields.getbits(self.mp_feature_info_2, 6)), "mp_feature_info_2[6]={}")
     self.add_field('imcrp_present', bool(bitfields.getbits(self.mp_feature_info_2, 7)), "mp_feature_info_2[7]={}")
     self.add_field('mp_feature_info_3', u.unpack_one("B"))
     self.add_field('mp_feature_info_4', u.unpack_one("B"))
     self.add_field('mp_feature_info_5', u.unpack_one("B"))
     if not u.at_end():
         self.add_field('data', u.unpack_rest())
Exemplo n.º 9
0
 def __init__(self, u):
     super(CompatibilityBusAddressSpaceModifier, self).__init__(u)
     u = self.u
     self.add_field('bus_id', u.unpack_one("B"))
     self.add_field('address_modifier', u.unpack_one("B"))
     self.add_field('predefined_list_subtracted', bool(bitfields.getbits(self.address_modifier, 0)), "address_modifier[0]={}")
     self.add_field('predefined_range_list', u.unpack_one("<I"))
     self.fini()
Exemplo n.º 10
0
 def __init__(self, u):
     super(IOInterrupt, self).__init__(u)
     u = self.u
     self.add_field('interrupt_type', u.unpack_one("B"),
                    unpack.format_table("{}", _int_types))
     self.add_field('io_interrupt_flags', u.unpack_one("B"))
     self.add_field(
         'polarity', bitfields.getbits(self.io_interrupt_flags, 1, 0),
         unpack.format_table("io_interrupt_flags[1:0]={}", _polarity))
     self.add_field(
         'trigger', bitfields.getbits(self.io_interrupt_flags, 3, 2),
         unpack.format_table("io_interrupt_flags[3:2]={}", _trigger_modes))
     u.skip(1)
     self.add_field('source_bus_id', u.unpack_one("B"))
     self.add_field('source_bus_irq', u.unpack_one("B"))
     self.add_field('destination_io_apic_id', u.unpack_one("B"))
     self.add_field('destination_io_apic_int_pin', u.unpack_one("B"))
     self.fini()
Exemplo n.º 11
0
 def __init__(self, u):
     super(IOApic, self).__init__(u)
     u = self.u
     self.add_field('io_apic_id', u.unpack_one("B"))
     self.add_field('io_apic_version', u.unpack_one("B"))
     self.add_field('io_apic_flags', u.unpack_one("B"))
     self.add_field('enable', bool(bitfields.getbits(self.io_apic_flags, 0)), "io_apic_flags[0]={}")
     self.add_field('io_apic_address', u.unpack_one("<I"))
     self.fini()
Exemplo n.º 12
0
 def __init__(self, u):
     super(BusHierachyDescriptor, self).__init__(u)
     u = self.u
     self.add_field('bus_id', u.unpack_one("B"))
     self.add_field('bus_info', u.unpack_one("B"))
     self.add_field('subtractive_decode', bool(bitfields.getbits(self.bus_info, 0)), "bus_info[0]={}")
     self.add_field('parent_bus', u.unpack_one("B"))
     u.skip(3)
     self.fini()
Exemplo n.º 13
0
 def __init__(self, u):
     super(FloatingPointer, self).__init__()
     self.raw_data = u.unpack_peek_rest()
     self.add_field("anchor_string", u.unpack_one("4s"))
     self.add_field("physical_address_pointer", u.unpack_one("<I"))
     self.add_field("length", u.unpack_one("B"))
     self.add_field("spec_revision", u.unpack_one("B"))
     self.add_field("checksum", u.unpack_one("B"))
     self.add_field("mp_feature_info_1", u.unpack_one("B"))
     self.add_field("mp_feature_info_2", u.unpack_one("B"))
     self.add_field(
         "multiple_clock_sources", bool(bitfields.getbits(self.mp_feature_info_2, 6)), "mp_feature_info_2[6]={}"
     )
     self.add_field("imcrp_present", bool(bitfields.getbits(self.mp_feature_info_2, 7)), "mp_feature_info_2[7]={}")
     self.add_field("mp_feature_info_3", u.unpack_one("B"))
     self.add_field("mp_feature_info_4", u.unpack_one("B"))
     self.add_field("mp_feature_info_5", u.unpack_one("B"))
     if not u.at_end():
         self.add_field("data", u.unpack_rest())
Exemplo n.º 14
0
def toggle_autodemotion():
    value = bits.rdmsr(bits.bsp_apicid(), 0xe2)
    if bitfields.getbits(value, 26, 25) == 0x3:
        fieldvalue = 0
    else:
        fieldvalue = 0x3
    value = bitfields.setbits(value, fieldvalue, 26, 25)
    for cpu in bits.cpus():
        bits.wrmsr(cpu, 0xe2, value)
    show_autodemotion()
Exemplo n.º 15
0
 def __init__(self, u):
     super(CompatibilityBusAddressSpaceModifier, self).__init__(u)
     u = self.u
     self.add_field('bus_id', u.unpack_one("B"))
     self.add_field('address_modifier', u.unpack_one("B"))
     self.add_field('predefined_list_subtracted',
                    bool(bitfields.getbits(self.address_modifier, 0)),
                    "address_modifier[0]={}")
     self.add_field('predefined_range_list', u.unpack_one("<I"))
     self.fini()
Exemplo n.º 16
0
def toggle_autodemotion():
    value = bits.rdmsr(bits.bsp_apicid(), 0xe2)
    if bitfields.getbits(value, 26, 25) == 0x3:
        fieldvalue = 0
    else:
        fieldvalue = 0x3
    value = bitfields.setbits(value, fieldvalue, 26, 25)
    for cpu in bits.cpus():
        bits.wrmsr(cpu, 0xe2, value)
    show_autodemotion()
Exemplo n.º 17
0
def max_phys_addr():
    """Return the max physical address width, in bits.

    Computed on first call, and cached for subsequent return."""
    global max_phys_addr
    max_extended_leaf = bits.cpuid(bits.bsp_apicid(), 0x80000000).eax
    if max_extended_leaf >= 0x80000008:
        # cpuid.(eax=0x80000008).eax[7:0] = max physical-address width supported by the processor
        local_max_phys_addr = bitfields.getbits(bits.cpuid(bits.bsp_apicid(), 0x80000008).eax, 7, 0)
    elif bitfields.getbits(bits.cpuid(bits.bsp_apicid(), 1).edx, 6): # PAE supported
        local_max_phys_addr = 36
    else:
        local_max_phys_addr = 32

    old_func = max_phys_addr
    def max_phys_addr():
        return local_max_phys_addr
    functools.update_wrapper(max_phys_addr, old_func)

    return local_max_phys_addr
Exemplo n.º 18
0
 def __init__(self, u):
     super(BusHierachyDescriptor, self).__init__(u)
     u = self.u
     self.add_field('bus_id', u.unpack_one("B"))
     self.add_field('bus_info', u.unpack_one("B"))
     self.add_field('subtractive_decode',
                    bool(bitfields.getbits(self.bus_info, 0)),
                    "bus_info[0]={}")
     self.add_field('parent_bus', u.unpack_one("B"))
     u.skip(3)
     self.fini()
Exemplo n.º 19
0
 def __init__(self, u):
     super(IOApic, self).__init__(u)
     u = self.u
     self.add_field('io_apic_id', u.unpack_one("B"))
     self.add_field('io_apic_version', u.unpack_one("B"))
     self.add_field('io_apic_flags', u.unpack_one("B"))
     self.add_field('enable', bool(bitfields.getbits(self.io_apic_flags,
                                                     0)),
                    "io_apic_flags[0]={}")
     self.add_field('io_apic_address', u.unpack_one("<I"))
     self.fini()
Exemplo n.º 20
0
 def __init__(self, u):
     super(LocalInterrupt, self).__init__(u)
     u = self.u
     self.add_field("interrupt_type", u.unpack_one("B"), unpack.format_table("{}", _int_types))
     self.add_field("local_interrupt_flags", u.unpack_one("B"))
     self.add_field(
         "polarity",
         bitfields.getbits(self.local_interrupt_flags, 1, 0),
         unpack.format_table("local_interrupt_flags[1:0]={}", _polarity),
     )
     self.add_field(
         "trigger",
         bitfields.getbits(self.local_interrupt_flags, 3, 2),
         unpack.format_table("local_interrupt_flags[3:2]={}", _trigger_modes),
     )
     u.skip(1)
     self.add_field("source_bus_id", u.unpack_one("B"))
     self.add_field("source_bus_irq", u.unpack_one("B"))
     self.add_field("destination_local_apic_id", u.unpack_one("B"))
     self.add_field("destination_local_apic_lint_pin", u.unpack_one("B"))
     self.fini()
Exemplo n.º 21
0
 def __init__(self, u):
     super(FloatingPointer, self).__init__()
     self.raw_data = u.unpack_peek_rest()
     self.add_field('anchor_string', u.unpack_one("4s"))
     self.add_field('physical_address_pointer', u.unpack_one("<I"))
     self.add_field('length', u.unpack_one("B"))
     self.add_field('spec_revision', u.unpack_one("B"))
     self.add_field('checksum', u.unpack_one("B"))
     self.add_field('mp_feature_info_1', u.unpack_one("B"))
     self.add_field('mp_feature_info_2', u.unpack_one("B"))
     self.add_field('multiple_clock_sources',
                    bool(bitfields.getbits(self.mp_feature_info_2, 6)),
                    "mp_feature_info_2[6]={}")
     self.add_field('imcrp_present',
                    bool(bitfields.getbits(self.mp_feature_info_2, 7)),
                    "mp_feature_info_2[7]={}")
     self.add_field('mp_feature_info_3', u.unpack_one("B"))
     self.add_field('mp_feature_info_4', u.unpack_one("B"))
     self.add_field('mp_feature_info_5', u.unpack_one("B"))
     if not u.at_end():
         self.add_field('data', u.unpack_rest())
Exemplo n.º 22
0
    def __init__(self, u, sm):
        super(BaseboardInformation, self).__init__(u, sm)
        u = self.u
        try:
            self.add_field('manufacturer', u.unpack_one("B"), self.fmtstr)
            self.add_field('product', u.unpack_one("B"), self.fmtstr)
            self.add_field('version', u.unpack_one("B"), self.fmtstr)
            self.add_field('serial_number', u.unpack_one("B"), self.fmtstr)

            if self.length > 0x8:
                self.add_field('asset_tag', u.unpack_one("B"), self.fmtstr)

            if self.length > 0x9:
                self.add_field('feature_flags', u.unpack_one("B"))
                self.add_field('hosting_board', bool(bitfields.getbits(self.feature_flags, 0)), "feature_flags[0]={}")
                self.add_field('requires_daughter_card', bool(bitfields.getbits(self.feature_flags, 1)), "feature_flags[1]={}")
                self.add_field('removable', bool(bitfields.getbits(self.feature_flags, 2)), "feature_flags[2]={}")
                self.add_field('replaceable', bool(bitfields.getbits(self.feature_flags, 3)), "feature_flags[3]={}")
                self.add_field('hot_swappable', bool(bitfields.getbits(self.feature_flags, 4)), "feature_flags[4]={}")

            if self.length > 0xA:
                self.add_field('location', u.unpack_one("B"), self.fmtstr)

            if self.length > 0xB:
                self.add_field('chassis_handle', u.unpack_one("<H"))

            if self.length > 0xD:
                self.add_field('board_type', u.unpack_one("B"), unpack.format_table("{}", _board_types))

            if self.length > 0xE:
                self.add_field('handle_count', u.unpack_one("B"))
                if self.handle_count > 0:
                    self.add_field('contained_object_handles', tuple(u.unpack_one("<H") for i in range(self.handle_count)))
        except:
            self.decode_failure = True
            print "Error parsing BaseboardInformation"
            import traceback
            traceback.print_exc()
        self.fini()
Exemplo n.º 23
0
 def __init__(self, u, length):
     super(SystemEnclosureContainedElement, self).__init__()
     self.start_offset = u.offset
     self.raw_data = u.unpack_raw(length)
     self.u = unpack.Unpackable(self.raw_data)
     u = self.u
     self.add_field('contained_element_type', u.unpack_one("B"))
     type_selections = {
         0: 'SMBIOS baseboard type enumeration',
         1: 'SMBIOS structure type enumeration',
     }
     self.add_field('type_select', bitfields.getbits(self.type, 7), unpack.format_table("contained_element_type[7]={}", type_selections))
     self.add_field('type', bitfields.getbits(self.type, 6, 0))
     if self.type_select == 0:
         self.add_field('smbios_board_type', self.type, unpack.format_table("{}", _board_types))
     else:
         self.add_field('smbios_structure_type', self.type)
     self.add_field('minimum', u.unpack_one("B"))
     self.add_field('maximum', u.unpack_one("B"))
     if not u.at_end():
         self.add_field('data', u.unpack_rest())
     del self.u
Exemplo n.º 24
0
def show_autodemotion():
    with ttypager.page():
        if bitfields.getbits(bits.rdmsr(bits.bsp_apicid(), 0xe2), 26, 25) == 0x3:
            print("C1 and C3 autodemotion are enabled")
        else:
            print("C1 and C3 autodemotion are disabled")
Exemplo n.º 25
0
 def __init__(self, u, sm):
     super(SystemEnclosure, self).__init__(u, sm)
     u = self.u
     try:
         self.add_field('manufacturer', u.unpack_one("B"), self.fmtstr)
         self.add_field('enumerated_type', u.unpack_one("B"))
         self.add_field('chassis_lock_present', bool(bitfields.getbits(self.enumerated_type, 7)), "type[7]={}")
         board_types = {
             0x01: 'Other',
             0x02: 'Unknown',
             0x03: 'Desktop',
             0x04: 'Low Profile Desktop',
             0x05: 'Pizza Box',
             0x06: 'Mini Tower',
             0x07: 'Tower',
             0x08: 'Portable',
             0x09: 'Laptop',
             0x0A: 'Notebook',
             0x0B: 'Hand Held',
             0x0C: 'Docking Station',
             0x0D: 'All in One',
             0x0E: 'Sub Notebook',
             0x0F: 'Space-saving',
             0x10: 'Lunch Box',
             0x11: 'Main Server Chassis',
             0x12: 'Expansion Chassis',
             0x13: 'SubChassis',
             0x14: 'Bus Expansion Chassis',
             0x15: 'Peripheral Chassis',
             0x16: 'RAID Chassis',
             0x17: 'Rack Mount Chassis',
             0x18: 'Sealed-case PC',
             0x19: 'Multi-system chassis W',
             0x1A: 'Compact PCI',
             0x1B: 'Advanced TCA',
             0x1C: 'Blade',
             0x1D: 'Blade Enclosure',
         }
         self.add_field('system_enclosure_type', bitfields.getbits(self.enumerated_type, 6, 0), unpack.format_table("enumerated_type[6:0]={}", board_types))
         self.add_field('version', u.unpack_one("B"), self.fmtstr)
         self.add_field('serial_number', u.unpack_one("B"), self.fmtstr)
         self.add_field('asset_tag', u.unpack_one("B"), self.fmtstr)
         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
         if self.length > 9:
             chassis_states = {
                 0x01: 'Other',
                 0x02: 'Unknown',
                 0x03: 'Safe',
                 0x04: 'Warning',
                 0x05: 'Critical',
                 0x06: 'Non-recoverable',
             }
             self.add_field('bootup_state', u.unpack_one("B"), unpack.format_table("{}", chassis_states))
             self.add_field('power_supply_state', u.unpack_one("B"), unpack.format_table("{}", chassis_states))
             self.add_field('thermal_state', u.unpack_one("B"), unpack.format_table("{}", chassis_states))
             security_states = {
                 0x01: 'Other',
                 0x02: 'Unknown',
                 0x03: 'None',
                 0x04: 'External interface locked out',
                 0x05: 'External interface enabled',
             }
             self.add_field('security_status', u.unpack_one("B"), unpack.format_table("{}", security_states))
         if self.length > 0xd:
             self.add_field('oem_defined', u.unpack_one("<I"))
         if self.length > 0x11:
             self.add_field('height', u.unpack_one("B"))
             self.add_field('num_power_cords', u.unpack_one("B"))
             self.add_field('contained_element_count', u.unpack_one("B"))
             self.add_field('contained_element_length', u.unpack_one("B"))
         if getattr(self, 'contained_element_count', 0):
             self.add_field('contained_elements', tuple(SystemEnclosureContainedElement(u, self.contained_element_length) for i in range(self.contained_element_count)))
         if self.length > (0x15 + (getattr(self, 'contained_element_count', 0) * getattr(self, 'contained_element_length', 0))):
             self.add_field('sku_number', u.unpack_one("B"), self.fmtstr)
     except:
         self.decode_failure = True
         print "Error parsing SystemEnclosure"
         import traceback
         traceback.print_exc()
     self.fini()
Exemplo n.º 26
0
 def __init__(self, u, sm):
     super(SystemSlots, self).__init__(u, sm)
     u = self.u
     try:
         self.add_field('designation', u.unpack_one("B"), self.fmtstr)
         _slot_types = {
             0x01: 'Other',
             0x02: 'Unknown',
             0x03: 'ISA',
             0x04: 'MCA',
             0x05: 'EISA',
             0x06: 'PCI',
             0x07: 'PC Card (PCMCIA)',
             0x08: 'VL-VESA',
             0x09: 'Proprietary',
             0x0A: 'Processor Card Slot',
             0x0B: 'Proprietary Memory Card Slot',
             0x0C: 'I/O Riser Card Slot',
             0x0D: 'NuBus',
             0x0E: 'PCI 66MHz Capable',
             0x0F: 'AGP',
             0x10: 'AGP 2X',
             0x11: 'AGP 4X',
             0x12: 'PCI-X',
             0x13: 'AGP 8X',
             0xA0: 'PC-98/C20',
             0xA1: 'PC-98/C24',
             0xA2: 'PC-98/E',
             0xA3: 'PC-98/Local Bus',
             0xA4: 'PC-98/Card',
             0xA5: 'PCI Express',
             0xA6: 'PCI Express x1',
             0xA7: 'PCI Express x2',
             0xA8: 'PCI Express x4',
             0xA9: 'PCI Express x8',
             0xAA: 'PCI Express x16',
             0xAB: 'PCI Express Gen 2',
             0xAC: 'PCI Express Gen 2 x1',
             0xAD: 'PCI Express Gen 2 x2',
             0xAE: 'PCI Express Gen 2 x4',
             0xAF: 'PCI Express Gen 2 x8',
             0xB0: 'PCI Express Gen 2 x16',
             0xB1: 'PCI Express Gen 3',
             0xB2: 'PCI Express Gen 3 x1',
             0xB3: 'PCI Express Gen 3 x2',
             0xB4: 'PCI Express Gen 3 x4',
             0xB5: 'PCI Express Gen 3 x8',
             0xB6: 'PCI Express Gen 3 x16',
         }
         self.add_field('slot_type', u.unpack_one("B"), unpack.format_table("{}", _slot_types))
         _slot_data_bus_widths = {
             0x01: 'Other',
             0x02: 'Unknown',
             0x03: '8 bit',
             0x04: '16 bit',
             0x05: '32 bit',
             0x06: '64 bit',
             0x07: '128 bit',
             0x08: '1x or x1',
             0x09: '2x or x2',
             0x0A: '4x or x4',
             0x0B: '8x or x8',
             0x0C: '12x or x12',
             0x0D: '16x or x16',
             0x0E: '32x or x32',
         }
         self.add_field('slot_data_bus_width', u.unpack_one('B'), unpack.format_table("{}", _slot_data_bus_widths))
         _current_usages = {
             0x01: 'Other',
             0x02: 'Unknown',
             0x03: 'Available',
             0x04: 'In use',
         }
         self.add_field('current_usage', u.unpack_one('B'), unpack.format_table("{}", _current_usages))
         _slot_lengths = {
             0x01: 'Other',
             0x02: 'Unknown',
             0x03: 'Short Length',
             0x04: 'Long Length',
         }
         self.add_field('slot_length', u.unpack_one('B'), unpack.format_table("{}", _slot_lengths))
         self.add_field('slot_id', u.unpack_one('<H'))
         self.add_field('characteristics1', u.unpack_one('B'))
         self.add_field('characteristics_unknown', bool(bitfields.getbits(self.characteristics1, 0)), "characteristics1[0]={}")
         self.add_field('provides_5_0_volts', bool(bitfields.getbits(self.characteristics1, 1)), "characteristics1[1]={}")
         self.add_field('provides_3_3_volts', bool(bitfields.getbits(self.characteristics1, 2)), "characteristics1[2]={}")
         self.add_field('shared_slot', bool(bitfields.getbits(self.characteristics1, 3)), "characteristics1[3]={}")
         self.add_field('supports_pc_card_16', bool(bitfields.getbits(self.characteristics1, 4)), "characteristics1[4]={}")
         self.add_field('supports_cardbus', bool(bitfields.getbits(self.characteristics1, 5)), "characteristics1[5]={}")
         self.add_field('supports_zoom_video', bool(bitfields.getbits(self.characteristics1, 6)), "characteristics1[6]={}")
         self.add_field('supports_modem_ring_resume', bool(bitfields.getbits(self.characteristics1, 7)), "characteristics1[7]={}")
         if self.length > 0x0C:
             self.add_field('characteristics2', u.unpack_one('B'))
             self.add_field('supports_PME', bool(bitfields.getbits(self.characteristics2, 0)), "characteristics2[0]={}")
             self.add_field('supports_hot_plug', bool(bitfields.getbits(self.characteristics2, 1)), "characteristics2[1]={}")
             self.add_field('supports_smbus', bool(bitfields.getbits(self.characteristics2, 2)), "characteristics2[2]={}")
         if self.length > 0x0D:
             self.add_field('segment_group_number', u.unpack_one('<H'))
             self.add_field('bus_number', u.unpack_one('B'))
             self.add_field('device_function_number', u.unpack_one('B'))
             self.add_field('device_number', bitfields.getbits(self.device_function_number, 7, 3), "device_function_number[7:3]={}")
             self.add_field('function_number', bitfields.getbits(self.device_function_number, 2, 0), "device_function_number[2:0]={}")
     except:
         self.decodeFailure = True
         print "Error parsing SystemSlots"
         import traceback
         traceback.print_exc()
     self.fini()