def _print_bus(self, bus, depth = 0): c = bus.get_component() for t in range(depth): self.s.Print("\t") s = "Bus: {0:<10} @ 0x{1:0=16X} : Size: 0x{2:0=8X}".format(bus.get_name(), c.get_start_address_as_int(), c.get_size_as_int()) self.s.PrintLine(s, "purple") for t in range(depth): self.s.Print("\t") self.s.PrintLine("Number of components: %d" % bus.get_child_count(), "purple") for i in range(bus.get_child_count()): c = bus.get_child_from_index(i) if self.som.is_entity_a_bus(bus, i): self._print_bus(c, depth = depth + 1) else: c = bus.get_child_from_index(i) c = c.get_component() major = c.get_abi_version_major_as_int() minor = c.get_abi_version_minor_as_int() dev_name = device_manager.get_device_name_from_id(major) for t in range(depth + 1): self.s.Print("\t") s = "{0:20} Type (Major:Minor) ({1:0=2X}:{2:0=2X}): {3:10}".format(c.get_name(), major, minor, dev_name) self.s.PrintLine(s, "green") for t in range(depth + 1): self.s.Print("\t") s = "Address: 0x{0:0=16X}-0x{1:0=16X} : Size: 0x{2:0=8X}".format(c.get_start_address_as_int(), c.get_end_address_as_int(), c.get_size_as_int()) self.s.PrintLine(s, "green") for t in range(depth + 1): self.s.Print("\t") s = "Vendor:Product: {0:0=16X}:{1:0=8X}".format(c.get_vendor_id_as_int(), c.get_device_id_as_int()) self.s.PrintLine(s, "green") self.s.PrintLine("")
def _print_bus(self, bus, depth=0): c = bus.get_component() for t in range(depth): self.s.Print("\t") s = "Bus: {0:<10} @ 0x{1:0=16X} : Size: 0x{2:0=8X}".format( bus.get_name(), c.get_start_address_as_int(), c.get_size_as_int()) self.s.PrintLine(s, "purple") for t in range(depth): self.s.Print("\t") self.s.PrintLine("Number of components: %d" % bus.get_child_count(), "purple") for i in range(bus.get_child_count()): c = bus.get_child_from_index(i) if self.som.is_entity_a_bus(bus, i): self._print_bus(c, depth=depth + 1) else: c = bus.get_child_from_index(i) c = c.get_component() major = c.get_abi_version_major_as_int() minor = c.get_abi_version_minor_as_int() dev_name = device_manager.get_device_name_from_id(major) for t in range(depth + 1): self.s.Print("\t") s = "{0:20} Type (Major:Minor) ({1:0=2X}:{2:0=2X}): {3:10}".format( c.get_name(), major, minor, dev_name) self.s.PrintLine(s, "green") for t in range(depth + 1): self.s.Print("\t") s = "Address: 0x{0:0=16X}-0x{1:0=16X} : Size: 0x{2:0=8X}".format( c.get_start_address_as_int(), c.get_end_address_as_int(), c.get_size_as_int()) self.s.PrintLine(s, "green") for t in range(depth + 1): self.s.Print("\t") s = "Vendor:Product: {0:0=16X}:{1:0=8X}".format( c.get_vendor_id_as_int(), c.get_device_id_as_int()) self.s.PrintLine(s, "green") self.s.PrintLine("")
def _parse_bus(n, som, bus, addr, base_addr, status): #The first element at this address is the interconnect sdb_data = Array('B') entity_rom = n.read(addr, SDB_ROM_RECORD_LENGTH / 4) sdb_data.extend(entity_rom) status.Verbose("Bus @ 0x%08X: Name: %s" % (addr, bus.get_name())) #print_sdb_rom(sdbc.convert_rom_to_32bit_buffer(entity_rom)) try: bus_entity = srp.parse_rom_element(entity_rom) except SDBError as e: error = "Error when parsing bus entry at base address: 0x%08X, addr: 0x%08X\n" % (base_addr, addr) error += str(e) raise SDBError(error) if not bus_entity.is_interconnect(): raise SDBError("Rom data does not point to an interconnect") num_devices = bus_entity.get_number_of_records_as_int() status.Verbose("\tFound %d Devices" % num_devices) som.set_bus_component(bus, bus_entity) #print "Found bus: %s" % bus_entity.get_name() entity_size = [] entity_addr_start = [] for i in range(1, (num_devices + 2)): I = (i * (SDB_ROM_RECORD_LENGTH / 4)) + addr entity_rom = n.read(I, SDB_ROM_RECORD_LENGTH / 4) sdb_data.extend(entity_rom) entity = srp.parse_rom_element(entity_rom) #print_sdb_rom(sdbc.convert_rom_to_32bit_buffer(entity_rom)) end = long(entity.get_end_address_as_int()) start = long(entity.get_start_address_as_int()) entity_addr_start.append(start) entity_size.append(end - start) if entity.is_bridge(): #print "Found bridge" status.Verbose("Found Bridge:") sub_bus = som.insert_bus(root = bus, name = entity.get_name()) sub_bus_addr = entity.get_bridge_address_as_int() * 2 + base_addr sdb_data.extend(_parse_bus(n, som, sub_bus, sub_bus_addr, base_addr, status)) else: if entity.is_empty_record(): continue som.insert_component(root = bus, component = entity) status.Verbose("Found device %s Type (0x%02X): %s" % ( entity.get_name(), entity.get_abi_version_major_as_int(), device_manager.get_device_name_from_id(entity.get_abi_version_major_as_int()))) #print_sdb_rom(sdbc.convert_rom_to_32bit_buffer(entity_rom)) #Calculate Spacing spacing = 0 prev_start = None prev_size = None for i in range (num_devices): size = entity_size[i] start_addr = entity_addr_start[i] if prev_start is None: prev_size = size prev_start = start_addr continue potential_spacing = (start_addr - prev_start) if potential_spacing > prev_size: if potential_spacing > 0 and spacing == 0: spacing = potential_spacing if spacing > potential_spacing: spacing = potential_spacing prev_size = size prev_start = start_addr som.set_child_spacing(bus, spacing) return sdb_data
def _parse_bus(n, som, bus, addr, base_addr, status): #The first element at this address is the interconnect sdb_data = Array('B') entity_rom = n.read(addr, SDB_ROM_RECORD_LENGTH / 4) sdb_data.extend(entity_rom) status.Verbose("Bus @ 0x%08X: Name: %s" % (addr, bus.get_name())) #print_sdb_rom(sdbc.convert_rom_to_32bit_buffer(entity_rom)) try: bus_entity = srp.parse_rom_element(entity_rom) except SDBError as e: error = "Error when parsing bus entry at base address: 0x%08X, addr: 0x%08X\n" % ( base_addr, addr) error += str(e) raise SDBError(error) if not bus_entity.is_interconnect(): raise SDBError("Rom data does not point to an interconnect") num_devices = bus_entity.get_number_of_records_as_int() status.Verbose("\tFound %d Devices" % num_devices) som.set_bus_component(bus, bus_entity) #print "Found bus: %s" % bus_entity.get_name() entity_size = [] entity_addr_start = [] for i in range(1, (num_devices + 2)): I = (i * (SDB_ROM_RECORD_LENGTH / 4)) + addr entity_rom = n.read(I, SDB_ROM_RECORD_LENGTH / 4) sdb_data.extend(entity_rom) entity = srp.parse_rom_element(entity_rom) #print_sdb_rom(sdbc.convert_rom_to_32bit_buffer(entity_rom)) end = long(entity.get_end_address_as_int()) start = long(entity.get_start_address_as_int()) entity_addr_start.append(start) entity_size.append(end - start) if entity.is_bridge(): #print "Found bridge" status.Verbose("Found Bridge:") sub_bus = som.insert_bus(root=bus, name=entity.get_name()) sub_bus_addr = entity.get_bridge_address_as_int() * 2 + base_addr sdb_data.extend( _parse_bus(n, som, sub_bus, sub_bus_addr, base_addr, status)) else: if entity.is_empty_record(): continue som.insert_component(root=bus, component=entity) status.Verbose( "Found device %s Type (0x%02X): %s" % (entity.get_name(), entity.get_abi_version_major_as_int(), device_manager.get_device_name_from_id( entity.get_abi_version_major_as_int()))) #print_sdb_rom(sdbc.convert_rom_to_32bit_buffer(entity_rom)) #Calculate Spacing spacing = 0 prev_start = None prev_size = None for i in range(num_devices): size = entity_size[i] start_addr = entity_addr_start[i] if prev_start is None: prev_size = size prev_start = start_addr continue potential_spacing = (start_addr - prev_start) if potential_spacing > prev_size: if potential_spacing > 0 and spacing == 0: spacing = potential_spacing if spacing > potential_spacing: spacing = potential_spacing prev_size = size prev_start = start_addr som.set_child_spacing(bus, spacing) return sdb_data