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
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
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()
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()
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()
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")
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())
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()
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()
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()
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()
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())
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()
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
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()
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()
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
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()
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()