def for_each_bus(): for kobj in kset_for_each_object(gdb.parse_and_eval('bus_kset')):
subsys = container_of(kobj, kset_type.get_type().pointer(), 'kobj')
subsys_priv = container_of(subsys, subsys_private_type.get_type().pointer(), 'subsys') yield subsys_priv
def for_each_class(): for kobj in kset_for_each_object(gdb.parse_and_eval('class_kset')):
subsys = container_of(kobj, kset_type.get_type().pointer(), 'kobj')
subsys_priv = container_of(subsys, subsys_private_type.get_type().pointer(), 'subsys') yield subsys_priv
def get_bus_by_name(name): for item in for_each_bus(): if item['bus']['name'].string() == name: return item raise gdb.GdbError("Can't find bus type {!r}".format(name))
def get_class_by_name(name): for item in for_each_class(): if item['class']['name'].string() == name: return item raise gdb.GdbError("Can't find device class {!r}".format(name))
def invoke(self, arg, from_tty): ifnot arg: for bus in for_each_bus():
gdb.write('bus {}:\t{}\n'.format(bus['bus']['name'].string(), bus)) for dev in bus_for_each_device(bus):
_show_device(dev, level=1) else:
bus = get_bus_by_name(arg) ifnot bus: raise gdb.GdbError("Can't find bus {!r}".format(arg)) for dev in bus_for_each_device(bus):
_show_device(dev)
class LxDeviceListClass(gdb.Command): '''Print devices in a class (or all classes if not specified)'''
def invoke(self, arg, from_tty): ifnot arg: for cls in for_each_class():
gdb.write("class {}:\t{}\n".format(cls['class']['name'].string(), cls)) for dev in class_for_each_device(cls):
_show_device(dev, level=1) else:
cls = get_class_by_name(arg) for dev in class_for_each_device(cls):
_show_device(dev)
class LxDeviceListTree(gdb.Command): '''Print a device and its children recursively'''
def invoke(self, arg, from_tty): ifnot arg: raise gdb.GdbError('Please provide pointer to struct device')
dev = gdb.parse_and_eval(arg) if dev.type != device_type.get_type().pointer(): raise gdb.GdbError('Please provide pointer to struct device')
_show_device(dev, level=0, recursive=True)
class LxDeviceFindByBusName(gdb.Function): '''Find struct device by bus and name (both strings)'''
def invoke(self, bus, name):
name = name.string()
bus = get_bus_by_name(bus.string()) for dev in bus_for_each_device(bus): if dev_name(dev) == name: return dev
class LxDeviceFindByClassName(gdb.Function): '''Find struct device by class and name (both strings)'''
def invoke(self, cls, name):
name = name.string()
cls = get_class_by_name(cls.string()) for dev in class_for_each_device(cls): if dev_name(dev) == name: return dev
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.