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("")
Exemple #2
0
    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
Exemple #4
0
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