用crash打印所有pci設備的驅動和內核模塊信息

筆記本所有pci設備如下:

[root@lenovo ~]# lspci
00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
00:01.0 PCI bridge: Intel Corporation Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port (rev 09)
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
00:14.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04)
00:16.0 Communication controller: Intel Corporation 7 Series/C216 Chipset Family MEI Controller #1 (rev 04)
00:1a.0 USB controller: Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (rev 04)
00:1b.0 Audio device: Intel Corporation 7 Series/C216 Chipset Family High Definition Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation 7 Series/C216 Chipset Family PCI Express Root Port 1 (rev c4)
00:1c.1 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 2 (rev c4)
00:1c.3 PCI bridge: Intel Corporation 7 Series/C216 Chipset Family PCI Express Root Port 4 (rev c4)
00:1d.0 USB controller: Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation HM77 Express Chipset LPC Controller (rev 04)
00:1f.2 SATA controller: Intel Corporation 7 Series Chipset Family 6-port SATA Controller [AHCI mode] (rev 04)
00:1f.3 SMBus: Intel Corporation 7 Series/C216 Chipset Family SMBus Controller (rev 04)
01:00.0 3D controller: NVIDIA Corporation GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] (rev a1)
03:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. RTS5229 PCI Express Card Reader (rev 01)
04:00.0 Network controller: Broadcom Inc. and subsidiaries BCM43142 802.11b/g/n (rev 01)
05:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 07)

crash加入如下函數:


void
cmd_bus(void)
{
	int centos = 0;
	int all = 0;

	if (args[1] != NULL && !strcmp(args[1], "all"))
		all = 1;

	struct new_utsname *uts;

	uts = &kt->utsname;
	if (strncmp(uts->release, "3.10.0", 6) == 0) {
		centos = 1;
		fprintf(fp, "%s\n", uts->release);
	}

	struct list_data devices, *ld;
	char *name = "pci_bus_type";
	int i, n, print = 1;

	long pci_bus_type = symbol_value(name);
	fprintf(fp, "pci_bus_type\n");
	fprintf(fp, "bus_type %lx\n", pci_bus_type);

	long p = read_pointer2(pci_bus_type, "bus_type", "p");
	fprintf(fp, "subsys_private  %lx\n", p);

	long klist_devices = p + MEMBER_OFFSET("subsys_private", "klist_devices");
	fprintf(fp, "klist %lx\n", klist_devices);

	long k_list = klist_devices + MEMBER_OFFSET("klist", "k_list");
	fprintf(fp, "list -H %lx\n", k_list);

	int offset = MEMBER_OFFSET("pci_driver", "driver");
	long iwl_pci_driver = symbol_exists("iwl_pci_driver") ?
				symbol_value("iwl_pci_driver") : 0;
	long iwl_device_driver = iwl_pci_driver + offset;
	long mlx5_core_driver = symbol_exists("mlx5_core_driver") ?
				symbol_value("mlx5_core_driver") : 0;
	long mlx5_device_driver = mlx5_core_driver + offset;

	ld =  &devices;
	BZERO(ld, sizeof(struct list_data));
	ld->flags |= LIST_ALLOCATE;
	ld->start = ld->end = k_list;
	/*
	 * bus_add_device()
	 *	klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices);
	*/
	ld->list_head_offset = MEMBER_OFFSET("device_private", "knode_bus") +
				+ MEMBER_OFFSET("klist_node", "n_node");
	n = do_list(ld);
	for (i = 1; i < n; i++) {
		long private = ld->list_ptr[i];
		long device = read_pointer2(private, "device_private", "device");
		long pci_dev = device - MEMBER_OFFSET("pci_dev", "dev");
		long driver_data;

		if (centos == 0) {
			driver_data = read_pointer2(device, "device", "driver_data");
		} else {
			p = read_pointer2(device, "device", "p");
			driver_data = read_pointer2(p, "device_private", "driver_data");
		}

		long driver = read_pointer2(device, "device", "driver");
		long kobj = device + MEMBER_OFFSET("device", "kobj");
		long name = read_pointer2(kobj, "kobject", "name");
		char buf[32];

		if (all || driver == iwl_device_driver || driver == mlx5_device_driver) {
			if (!all && print && driver == iwl_device_driver)
				fprintf(fp, "\niwl_pci_driver:\npci_driver %lx\n",
					iwl_pci_driver);
			if (!all && print && driver == mlx5_device_driver)
				fprintf(fp, "\nmlx5_core_driver:\npci_driver %lx\n",
					mlx5_core_driver);
			print = 0;
			if (driver) {
				long driver_name = read_pointer2(driver, "device_driver", "name");
				long mod_name = read_pointer2(driver, "device_driver", "mod_name");
				read_string(name, buf, 32);
				fprintf(fp, "\nname:\t\t%s\n", buf);

				read_string(driver_name, buf, 32);
				fprintf(fp, "driver_name:\t%s\n", buf);
				read_string(mod_name, buf, 32);
				fprintf(fp, "mod_name:\t%s\n", buf);

				fprintf(fp, "device_private %lx\n", private);
				fprintf(fp, "device %lx\n", device);
				fprintf(fp, "pci_dev %lx\n", pci_dev);
				fprintf(fp, "device_driver %lx\n", driver);

				fprintf(fp, "kobject %lx\n", kobj);
				if (driver == iwl_device_driver)
					fprintf(fp, "iwl_trans %lx\n", driver_data);
				if (driver == mlx5_device_driver)
					fprintf(fp, "mlx5_core_dev %lx\n", driver_data);
			}
		}
	}

	FREEBUF(ld->list_ptr);
}

輸出如下:

crash> bus all
pci_bus_type
bus_type ffffffffb80c48a0
subsys_private  ffff895e84cf3200
klist ffff895e84cf32a0
list -H ffff895e84cf32a8

name:           0000:00:01.0
driver_name:    pcieport
mod_name:       pcieportdrv
device_private ffff895e84edccc0
device ffff895e84dbb0b0
pci_dev ffff895e84dbb000
device_driver ffffffffb80c53f0
kobject ffff895e84dbb0c0

name:           0000:00:02.0
driver_name:    i915
mod_name:       i915
device_private ffff895e84edce40
device ffff895e84dbc0b0
pci_dev ffff895e84dbc000
device_driver ffffffffc0a3b250
kobject ffff895e84dbc0c0

name:           0000:00:14.0
driver_name:    xhci_hcd
mod_name:       xhci_pci
device_private ffff895e84eee000
device ffff895e84dbd0b0
pci_dev ffff895e84dbd000
device_driver ffffffffb80e5bf0
kobject ffff895e84dbd0c0

name:           0000:00:16.0
driver_name:    mei_me
mod_name:       mei_me
device_private ffff895e84eee180
device ffff895e84dbe0b0
pci_dev ffff895e84dbe000
device_driver ffffffffc03f1070
kobject ffff895e84dbe0c0

name:           0000:00:1a.0
driver_name:    ehci-pci
mod_name:       ehci_pci
device_private ffff895e84eee240
device ffff895e84dbf0b0
pci_dev ffff895e84dbf000
device_driver ffffffffb80e3130
kobject ffff895e84dbf0c0

name:           0000:00:1b.0
driver_name:    snd_hda_intel
mod_name:       snd_hda_intel
device_private ffff895e84eee3c0
device ffff895e8612c0b0
pci_dev ffff895e8612c000
device_driver ffffffffc049b090
kobject ffff895e8612c0c0

name:           0000:00:1c.0
driver_name:    pcieport
mod_name:       pcieportdrv
device_private ffff895e84eee540
device ffff895e84f200b0
pci_dev ffff895e84f20000
device_driver ffffffffb80c53f0
kobject ffff895e84f200c0

name:           0000:00:1c.1
driver_name:    pcieport
mod_name:       pcieportdrv
device_private ffff895e84eee6c0
device ffff895e84f210b0
pci_dev ffff895e84f21000
device_driver ffffffffb80c53f0
kobject ffff895e84f210c0

name:           0000:00:1c.3
driver_name:    pcieport
mod_name:       pcieportdrv
device_private ffff895e84eee840
device ffff895e84f220b0
pci_dev ffff895e84f22000
device_driver ffffffffb80c53f0
kobject ffff895e84f220c0

name:           0000:00:1d.0
driver_name:    ehci-pci
mod_name:       ehci_pci
device_private ffff895e84eee9c0
device ffff895e84f230b0
pci_dev ffff895e84f23000
device_driver ffffffffb80e3130
kobject ffff895e84f230c0

name:           0000:00:1f.0
driver_name:    lpc_ich
mod_name:       lpc_ich
device_private ffff895e84eeeb40
device ffff895e84f240b0
pci_dev ffff895e84f24000
device_driver ffffffffc03aa070
kobject ffff895e84f240c0

name:           0000:00:1f.2
driver_name:    ahci
mod_name:       ahci
device_private ffff895e84eeecc0
device ffff895e84f250b0
pci_dev ffff895e84f25000
device_driver ffffffffc02db090
kobject ffff895e84f250c0

name:           0000:05:00.0
driver_name:    r8169
mod_name:       r8169
device_private ffff895e84f019c0
device ffff895e84f2a0b0
pci_dev ffff895e84f2a000
device_driver ffffffffc0252070
kobject ffff895e84f2a0c0

有了上面的信息就可以對.config有的放矢的精簡了。精簡後的config如下:

https://github.com/mishuang2017/sm/blob/master/config/config.thinkpad.edge

二十分鐘就build完了。所有模塊大概500M左右。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章